我们在SetupCopyOEMInf之后使用Microsoft's suggested procedures在Windows上的驱动程序存储区中预安装了一些驱动程序包。这个过程多年来一直运作良好; 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:\Windows\System32\DriverStore\FileRepository\[ourinfname].inf_x86_3361fc76cd85b678\[ourinfname].inf'. Error = 0x00000002
我倾注了文档,试图找出我们做错了什么。
使用pnputil.exe -a
或使用InstallScript的DIFxDriverPackagePreinstall()
从命令行进行预安装会产生相同的结果。
如果我们不尝试将它们放在驱动程序存储区中,则驱动程序可以在Windows 8.1上运行。如果我们将已经安装了驱动程序的Windows 8计算机升级到Windows 8.1,预安装也会有效。在任何一种情况下,一旦它正在工作,它就会继续工作。
为什么在Windows 8.1上失败?
答案 0 :(得分:3)
经过两周的挖掘和调试后,发现问题出在我们的设备类GUID上。
在将我们的INF剥离到最低限度并与在Windows 8.1上正确预安装的另一个INF进行比较之后,我意识到两者之间的唯一区别是类GUID。我为ff646f80-8def-11d2-9449-00105a075f6b
快速search并且发现了超过一千次点击;不完全是您想要从唯一标识符中看到的内容。
然后我回顾了 12年的版本控制,发现负责最初创建设备驱动程序的人没有更改向导生成的INF中的GUID Win2K DDK 。
创建一个新的唯一类guid解决了这个问题,我们的驱动程序在Windows 8.1上正确预安装。
我不知道微软是否特意阻止了使用该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}
答案 1 :(得分:0)
我的previous answer实际上有点像红鲱鱼。 虽然在样本INF 中绝对不应该使用GUID,但REAL问题最终出现在我们的安装程序中。事实证明,我们的安装试图为该类预先创建注册表项:
HKLM\SYSTEM\CurrentControlSet\Control\Class\{FF646F80-8DEF-11D2-9449-00105A075F6B}
从我们的安装程序中删除它可以解决问题。
Microsoft必须更改驱动程序预安装在以前版本的Windows下的工作原理。