我们有一些驱动程序包,我们按照Microsoft建议的过程,在Windows上的驱动程序存储区中预装了SetupCopyOEMInf。 这个过程已经正常工作多年;在XP,Vista,7甚至8上都没有问题。
在评估 Windows 8.1 RTM 时,我们发现我们的驱动程序不再预安装。
检查setupapi.dev.log,我发现:
!!! sto: Failed to query boot critical status of device class. Error = 0x00000002
后来:
!!! idb: Failed to query inbox status of device class {ff646f80-8def-11d2-9449-00105a075f6b}. Error = 0x00000002
!!! idb: Failed to publish 'C:WindowsSystem32DriverStoreFileRepository[ourinfname].inf_x86_3361fc76cd85b678[ourinfname].inf'. Error = 0x00000002
我已经翻阅了文档,试图找出我们做错了什么。
使用 pnputil.exe -a
从命令行预安装或使用 InstallScript 的DIFxDriverPackagePreinstall()
产生相同的结果。
驱动程序在Windows 8.1上运行,如果我们不尝试将它们放在驱动程序存储区中。 如果我们将已经有驱动程序的 Windows 8 计算机升级到 Windows 8.1,则预安装也有效。 无论哪种情况,一旦它工作,它就会继续工作。
为什么这在 Windows 8.1 上失败了?
经过两周的挖掘和调试,事实证明问题出在我们的设备类 GUID 上。
在将我们的 INF 精简到最低限度并与另一个在 Windows 8.1 上正确预安装的 INF 进行比较后,我意识到两者之间的唯一区别是类 GUID。 我快速搜索了ff646f80-8def-11d2-9449-00105a075f6b
,并发现了一千多次点击;不完全是您希望从唯一标识符中看到的内容。
然后,我回顾了 12 年的版本控制,发现负责最初创建设备驱动程序的人员没有更改向导生成的 INF 中的 GUID。
创建一个新的唯一类 guid 解决了这个问题,我们的驱动程序在 Windows 8.1 上正确预安装。
我不知道Microsoft是否专门阻止了使用该 GUID 的预安装尝试,但底线是:如果示例说要更改 GUID,请更改它!
下面是完整性的示例代码。 别这样:
;; ********* PLEASE READ ***********
;; The wizard cannot create exact INF files for all buses and device types.
;; You may have to make changes to this file in order to get your device to
;; install. In particular, hardware IDs and logical configurations require
;; intervention.
;;
;; The Win2K DDK documentation contains an excellent INF reference.
;--------- Version Section ---------------------------------------------------
[Version]
Signature="$Windows 95$"
Provider=%ProviderName%
; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.
Class=NewDeviceClass
ClassGUID={ff646f80-8def-11d2-9449-00105a075f6b}
我之前的回答实际上有点红鲱鱼。 虽然绝对不应该在示例 INF 中使用 GUID,但真正的问题最终出在我们的安装程序上。 事实证明,我们的安装试图为类预先创建注册表项:
HKLMSYSTEMCurrentControlSetControlClass{FF646F80-8DEF-11D2-9449-00105A075F6B}
从我们的安装程序中删除它解决了这个问题。
Microsoft必须已更改以前版本的 Windows 驱动程序预安装的工作方式。