0

我有 Windows WDF 设备驱动程序代码,试图使其能够预安装(在设备存在之前)。它首先检查是否存在有效的设备 ID,对于找到的任何设备 ID,它都会执行以下操作:

if (UpdateDriverForPlugAndPlayDevices(0, // No Window Handle
    hwid, // Hardware ID
    inffile, // FileName
    INSTALLFLAG_FORCE,
    &RebootRequired))
        // success

但是如果没有设备存在/插入,它会这样做:

if(SetupCopyOEMInf(inffile,
     NULL,
     SPOST_PATH,
     0,
     NULL,
     0,
     NULL,
     NULL))
        // etc.

在第一种情况下(存在设备),一切都很好。但是在第二种情况下,根据微软的“预安装驱动程序包”,它应该将 INF 复制到 c:\Windows\inf\oem.inf (它这样做)然后一旦设备存在,它应该安装基于驱动程序的驱动程序在 INF 中的信息上,它没有,我必须去设备管理器,删除未知设备,然后扫描硬件更改以使其安装。

在第一种情况下(设备存在),我们的驱动程序 .sys 文件被复制到 c:\windows\system32\drivers 目录,而在第二种情况下它永远不会这样做。如果我只是将 .sys 文件单独复制到 c:\windows\system32\drivers,一切正常。我可以这样做,但这似乎很笨拙(而且有风险),因为这一切都应该自动处理,基于我对 Microsoft 的“预安装驱动程序包”文档的阅读。

4

1 回答 1

0

预安装驱动程序时,它只会在驱动程序存储中注册该驱动程序。然后,当插入与该预装驱动程序匹配的设备时,它将通过将 SYS 文件复制到 C:\Windows\system32\drivers 目录来安装它,并将 INF 文件作为 OEMxx.inf 文件安装在 C:\Windows \inf\ 目录。

如您所见,如果您调用该命令并且设备存在,Windows 将安装驱动程序。如果该设备不存在,它将在插入与其匹配的下一个设备时安装。

您提到您可以手动进入设备管理器“删除”和“重新扫描”以触发安装。在调用 SetupCOpyOEMInf 之后,您还可以使用命令以编程方式执行此操作。请参阅devcon文档,源代码在 WDK 中可用。您可以在命令行中使用devcon remove XXXX其中 XXXX 是设备上的一些匹配信息并devcon rescan触发对新硬件的扫描来尝试此操作。

此外,不要自己将 SYS 文件复制到驱动程序文件夹中 - 使用提供的方法来安装 Microsoft 推荐的方式 - 以后会省去你的麻烦。

于 2014-09-02T15:45:20.673 回答