在上一节《WinUSB驱动程序的安装01》中主要介绍了怎么写用于安装WinUSB驱动的INF文件,以及辅助安装程序的提取方法,最后在Winxp下通过了测试,不过上一节完成的安装包却不能在WIN7和WIN8上安装,现在我们分别看看在Win7、Win8等更高版本的操作系统中安装WinUSB驱动有什么区别和需要注意的地方。
2、怎么制作适用于多操作系统版本的WinUSB驱动安装包
《WinUSB驱动程序的安装01》一文中介绍了怎么提取辅助安装程序,其中讲到适用于Winxp 32位操作系统的辅助安装程序应该到X86文件夹下提取,那么适用于Win7或Win864位的辅助安装程序就应该到ia64或amd64文件夹下提取,这样的话不是要根据不同操作系统制作不同的安装包吗,对于使用者来说这点是很不方便的,再说有些用户可能都不知道他所使用的操作系统版本是哪个,那么有没有方法只制作一个安装包就可以适用于所有操作系统呢,答案是肯定的。实现的方法主要也在INF文件上,在《WinUSB简介》一节最后介绍的微软基于OSR USB FX2学习板的一个完整的实例(下载地址:http://download.microsoft.com/download/9/C/5/9C5B2167-8017-4BAE-9FDE-D599BAC8184A/WinUsb_HowTo.docx),里面有个INF实例就考虑到了多操作系统版本的问题,我们可以参考一下,对比发现,微软给出的实例中主要在于以下几个地方有所不同
1)[Version]节里的ClassGuid的值不一样,这里影响的是设备类别,根据微软件的技术文档里的建议,最好修改如下:
- Class = USBDevice
- ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
微软技术文档也明确说明,在WIN8里如果设备不是标准的设备类(有些标准设备类也可以用WINUSB驱动的),请使用“USBDevice”,“USB”类误用可能造成严重的可靠性和性能问题。
2)[Manufacturer]节以及后面跟的几个节
微软的实例多了针对64位AMD和INTEL处理器:
- [Manufacturer]
- %ProviderName% = MyDevice_WinUSB,NTx86,NTamd64,NTia64
-
- [MyDevice_WinUSB.NTx86]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0547&PID_1002
-
- [MyDevice_WinUSB.NTamd64]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0547&PID_1002
-
- [MyDevice_WinUSB.NTia64]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0547&PID_1002
3)[SourceDisksNames]节及后面跟的几个节:
- [SourceDisksNames]
- 1 = %DISK_NAME%,,,\i386
- 2 = %DISK_NAME%,,,\amd64
- 3 = %DISK_NAME%,,,\ia64
-
- [SourceDisksFiles.x86]
- WinUSBCoInstaller.dll=1
- WdfCoInstaller01005.dll=1
-
- [SourceDisksFiles.amd64]
- WinUSBCoInstaller.dll=2
- WdfCoInstaller01005.dll=2
-
- [SourceDisksFiles.ia64]
- WinUSBCoInstaller.dll=3
- WdfCoInstaller01005.dll=3
微软给出的示例中,为辅助安装程序建了三个目录,分别针对32位以及64位(64位又分intel架构和AMD架构)存放不同版本的辅助安装程序,操作系统会自动安装对应的版本。
最终基于此实例修改好的INF文件内容如下:
- [Version]
- Signature = "$Windows NT$"
- Class = USBDevice
- ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
- Provider = %ProviderName%
- CatalogFile=MyCatFile.cat
-
- ; ================== Class section ==================
-
- [ClassInstall32]
- Addreg=MyDeviceClassReg
-
- [MyDeviceClassReg]
- HKR,,,0,%ClassName%
- HKR,,Icon,,-1
-
- ; ========== Manufacturer/Models sections ===========
-
- [Manufacturer]
- %ProviderName% = MyDevice_WinUSB,NTx86,NTamd64,NTia64
-
- [MyDevice_WinUSB.NTx86]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0471&PID_0666
-
- [MyDevice_WinUSB.NTamd64]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0471&PID_0666
-
- [MyDevice_WinUSB.NTia64]
- %USB\MyDevice.DeviceDesc% =USB_Install, USB\VID_0471&PID_0666
- ; =================== Installation ===================
-
- ;[1]
- [USB_Install]
- Include=MyWinUSB.inf
- Needs=WINUSB.NT
-
- ;[2]
- [USB_Install.Services]
- Include=MyWinUSB.inf
- AddService=WinUSB,0x00000002,WinUSB_ServiceInstall
-
- ;[3]
- [WinUSB_ServiceInstall]
- DisplayName = %WinUSB_SvcDesc%
- ServiceType = 1
- StartType = 3
- ErrorControl = 1
- ServiceBinary = %12%\WinUSB.sys
-
- ;[4]
- [USB_Install.Wdf]
- KmdfService=WINUSB, WinUsb_Install
-
- [WinUSB_Install]
- KmdfLibraryVersion=1.9
-
- ;[5]
- [USB_Install.HW]
- AddReg=Dev_AddReg
-
- [Dev_AddReg]
- HKR,,DeviceInterfaceGUIDs,0x10000,"{b35924d6-3e16-4a9e-9782-5524a4b79bac}"
-
- ;[6]
- [USB_Install.CoInstallers]
- AddReg=CoInstallers_AddReg
- CopyFiles=CoInstallers_CopyFiles
-
- [CoInstallers_AddReg]
- HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"
-
- [CoInstallers_CopyFiles]
- WinUSBCoInstaller2.dll
- WdfCoInstaller01009.dll
-
- [DestinationDirs]
- CoInstallers_CopyFiles=11
-
- ; ================= Source Media Section =====================
- ;[7]
-
- [SourceDisksNames]
- 1 = %DISK_NAME%,,,\i386
- 2 = %DISK_NAME%,,,\amd64
- 3 = %DISK_NAME%,,,\ia64
-
- [SourceDisksFiles]
- WinUsbCoInstaller2.dll=1
- WdfCoInstaller01009.dll=1
-
- [SourceDisksFiles.x86]
- WinUSBCoInstaller.dll=1
- WdfCoInstaller01009.dll=1
-
- [SourceDisksFiles.amd64]
- WinUSBCoInstaller.dll=2
- WdfCoInstaller01009.dll=2
-
- [SourceDisksFiles.ia64]
- WinUSBCoInstaller.dll=3
- WdfCoInstaller01009.dll=3
- ; =================== Strings ===================
-
- [Strings]
- ProviderName="Baiheee Electronic Studio"
- USB\MyDevice.DeviceDesc="Easy USB 51 Programer WinUSB Test"
- WinUSB_SvcDesc="Easy USB 51 Programer WinUSB Test"
- DISK_NAME="My Install Disk"
- ClassName="MyWinUSBDeviceClass"
要说明的是,INF里的ClassGuid以及[Dev_AddReg]节里的DeviceInterfaceGUIDs值没有改,前者决定设备类别,后者将用于以后应用设备打开设备时用,有专门用于生成GUID的工具(如guidgen.exe)。
WinUSB驱动程序安装包文件夹结构应该是这样的:
在Winxp SP3、Win7(64位和32位)以及Win8(64位和32位)经过测试均能正常安装,不过需要说明的是,由于WIN8开始强制驱动程序签名,由于这个示例驱动没有取得微软签名认证(需要花钱的),所以会安装不上,只有取消强制驱动签名后才能安装,取消方法可以在网上找,不过按网上有些方法可能无法取消,在本站USB学习板配套光盘上会讲解详细取消方法。另外,WIN7也可以启用强制签名,如果您的WIN7系统启用了则也有可能安不上,不过WIN7取消签名的方法比较简单,这里不仔细讲解了,可以上网查。另外,如果是在虚拟机上可能会出现问题,我起初就是在虚拟机上测试的,但发现有时不能正常识别。
|