VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统

我的印象中,我最早使用的KMDF版本是1.5,那是Vista出来的时候,时间大概2006年左右。KMDF的版本变更并不是很快,总是伴随着WDK的发布而更新的,而WDK版本的更新,一般又是和OS同步的。KMDF的主版本还是1,但次版本号总是以2递增:1.5(Vista)、1.7(Vista SP1)、1.9(Win7)、1.11(Win8)、1.13(Win8.1)

早期的KMDF版本保持了良好的向后兼容性,比如用最晚KMDF 1.9编译出来的驱动程序,可安装使用于XP系统*。但从下图(MSDN)可以看出,从KMDF 1.11开始,情况变化了。KMDF 1.11取消了对Vista以前系统的支持。而KMDF 1.13更绝,编译出来的驱动只能安装在Win8.1上。

KMDF Version

从VS2012开始支持建立驱动工程。VS2012支持WDK 8.0,对应的KMDF默认版本是1.11。VS2013支持Win 8.1,对应的KMDF默认版本是1.13。因此我就发现自己用VS2012开发的驱动程序不能用在XP系统上。如果开发者可以忽略XP系统,那是一件很幸运的事情。但有些人却没这么幸运。就好象活21世纪的人类,不光是从真实的历史课本上,而且在虚伪的现实生活中,仍需要不断地为发生在20世纪(甚至更早)的人事操心不止。

如果你确实需要支持XP,有什么办法让你开发出来的KMDF框架的驱动,也能在XP系统上安装呢?这就是本文要讲的小tip:需要把VS2012或VS2013使用的KMDF版本,改成较老的1.9(或更老)。

实施的秘密在工程的项目属性设置中,在Driver Model Setting项中设置驱动框架类型。Type of driver选择的应是KMDF,另两种可选项是WDM和export driver(WDM)。我们这里讨论的当然是KMDF项。关键在下面的两项,原来KMDF的版本可以在这里修改。下图截自一个VS2012驱动项目,它默认使用的是主版本1,次版本11。只要把次版本改成9,保存后重新编译,编译出来的驱动程序就是KMDF 1.9版本,从而可以安装运行于XP系统上了。

driver model setting

*更早KMDF版本则对Win2K亦有支持,但本文觉得,只有XP值得讨论。

 

12,157 total views, 3 views today

《VS2012开发驱动小Tip之:更改KMDF版本以支持XP系统》有16个想法

  1. 张佩,你好。

    请教一个问题:我写了一个TDI 驱动,已经过签名认证。在一些Win7 64 位机器上,它能正常运行;而在部分Win7 64 位系统上,不能正常工作,在这些机器上,通过DeviceTree 可以看到它,并且在它的上面,还有另一个叫做TaoKernel 的TDI 驱动。

    请帮我分析下,为什么驱动装上后,仍然不能工作?

    谢谢。

      1. 谢谢你。

        出问题的是个远程环境,所以不好调试。不过事后证实,驱动是正常的,只是触发驱动工作的条件没有产生。

  2. 张佩,你好。我一直没明白KMDF版本中的“Included in this version of Windows”是什么意思?和“Drivers using it run on”是什么关系?如果表示的是包含该版本KMDF库的Windows的话,好像和实际不太匹配。
    我查看了自己的WIN7和XP的KMDF库(Wdf01000.sys)版本,WIN7的Wdf01000.sys的产品版本是1.11,而XP的Wdf01000.sys的产品版本是1.9,这个和“Drivers using it run on”描述的比较匹配,但是和“Included in this version of Windows”就不一样了。

    如果Wdf01000.sys的产品版本就是KMDF版本,也就意味着WIN7支持1.11,那另一问题来了,WDK 7.1支持开发WIN7驱动,但却只提供KMDF 1.9版本的辅助安装程序(WdfCoInstaller01009.dll),要如何安装KMDF 1.11的驱动呢?

  3. 请教一下,有个pci的驱动,在winxp上运行没问题。但是在win7,下面先使用工具,读出io空间寄存器的值都是正确的,但是,驱动一安装上,马上,它的值就变了。而且,在有的windows系统中,一开始那个io空间中的值就不对。

  4. 你好,我 在这个地址上下载的一个UMDF的驱动http://www.codeproject.com/Articles/134010/An-UMDF-Driver-for-a-Virtual-Smart-Card-Reader。
    这个驱动是用1.9版本来编译的,它能运行在xp64 win7_64 上,但安装到win8 64上时,安装失败
    这是安装失败的日志:
    >>> [Device Install (UpdateDriverForPlugAndPlayDevices) – root\BixVirtualReader]
    >>> Section start 2014/06/06 21:21:43.966
    cmd: devcon install BixVReader.inf root\BixVirtualReader
    dvi: {Build Driver List} 21:21:43.981
    dvi: Searching for hardware ID(s):
    dvi: root\bixvirtualreader
    cpy: Policy is set to make all digital signatures equal.
    sig: {_VERIFY_FILE_SIGNATURE} 21:21:43.981
    sig: Key = bixvreader.inf
    sig: FilePath = c:\amd64\win7_x64\bixvreader.inf
    sig: Catalog = c:\amd64\win7_x64\WUDF.cat
    ! sig: Verifying file against specific (valid) catalog failed! (0x00000057)
    ! sig: Error 87: The parameter is incorrect.
    sig: {_VERIFY_FILE_SIGNATURE exit(0x00000057)} 21:21:43.997
    sig: {_VERIFY_FILE_SIGNATURE} 21:21:43.997
    sig: Key = bixvreader.inf
    sig: FilePath = c:\amd64\win7_x64\bixvreader.inf
    sig: Catalog = c:\amd64\win7_x64\WUDF.cat
    ! sig: Verifying file against specific Authenticode(tm) catalog failed! (0x80092003)
    ! sig: Error 0x80092003: An error occurred while reading or writing to a file.
    sig: {_VERIFY_FILE_SIGNATURE exit(0x80092003)} 21:21:44.012
    dvi: Created Driver Node:
    dvi: HardwareID – root\BixVirtualReader
    dvi: InfName – c:\amd64\win7_x64\bixvreader.inf
    dvi: DevDesc – Bix Virtual Smart Card Reader
    dvi: Section – VReader_Install.NT
    dvi: Rank – 0x80ff0000
    dvi: Signer Score – Not digitally signed
    dvi: DrvDate – 06/10/2013
    dvi: Version – 6.1.7600.16385
    dvi: {Build Driver List – exit(0x00000000)} 21:21:44.028
    dvi: {DIF_SELECTBESTCOMPATDRV} 21:21:44.028
    dvi: Using exported function ‘ClassInstall32’ in module ‘C:\Windows\system32\winscard.dll’.
    dvi: Class installer == winscard.dll,ClassInstall32
    dvi: No CoInstallers found
    dvi: Class installer: Enter 21:21:44.044
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:44.044
    dvi: {Select Best Driver}
    dvi: Class GUID of device remains: {50dd5230-ba8a-11d1-bf5d-0000f805f530}.
    dvi: Selected:
    dvi: Description – [Bix Virtual Smart Card Reader]
    dvi: InfFile – [c:\amd64\win7_x64\bixvreader.inf]
    dvi: Section – [VReader_Install]
    dvi: {Select Best Driver – exit(0x00000000)}
    dvi: Default installer: Exit
    dvi: {DIF_SELECTBESTCOMPATDRV – exit(0x00000000)} 21:21:44.060
    sto: {Import Driver Package: c:\amd64\win7_x64\bixvreader.inf} 21:21:44.060
    sto: Driver Store = C:\Windows\System32\DriverStore [Online] (6.2.9200)
    sto: Driver Package = c:\amd64\win7_x64\bixvreader.inf
    sto: Architecture = amd64
    sto: Flags = 0x00000000
    inf: Provider = Fabio Ottavi – developer
    inf: Class GUID = {50dd5230-ba8a-11d1-bf5d-0000f805f530}
    inf: Driver Version = 06/10/2013,6.1.7600.16385
    inf: Catalog File = WUDF.cat
    inf: Version Flags = 0x00000001
    flq: Copying ‘c:\amd64\win7_x64\WudfUpdate_01009.dll’ to ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\WudfUpdate_01009.dll’.
    flq: Copying ‘c:\amd64\win7_x64\BixVReader.dll’ to ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\BixVReader.dll’.
    flq: Copying ‘c:\amd64\win7_x64\bixvreader.inf’ to ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\bixvreader.inf’.
    pol: {Driver package policy check} 21:21:44.106
    pol: {Driver package policy check – exit(0x00000000)} 21:21:44.106
    sto: {Stage Driver Package: C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\bixvreader.inf} 21:21:44.106
    inf: {Query Configurability: C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\bixvreader.inf} 21:21:44.106
    inf: Driver package uses WDF.
    inf: Driver package ‘bixvreader.inf’ is configurable.
    inf: {Query Configurability: exit(0x00000000)} 21:21:44.106
    flq: Copying ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\WudfUpdate_01009.dll’ to ‘C:\Windows\System32\DriverStore\Temp\{746724db-8204-1946-9bcc-3365e7daa83f}\WudfUpdate_01009.dll’.
    flq: Copying ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\BixVReader.dll’ to ‘C:\Windows\System32\DriverStore\Temp\{746724db-8204-1946-9bcc-3365e7daa83f}\BixVReader.dll’.
    flq: Copying ‘C:\Users\kuafu\AppData\Local\Temp\{01705c1e-08b1-434c-821e-1f348e6c4622}\bixvreader.inf’ to ‘C:\Windows\System32\DriverStore\Temp\{746724db-8204-1946-9bcc-3365e7daa83f}\bixvreader.inf’.
    sto: {DRIVERSTORE IMPORT VALIDATE} 21:21:44.154
    !!! sig: Driver package does not contain a catalog file, and Code Integrity is enforced.
    !!! sig: Driver package failed signature validation. Error = 0xE000022F
    sto: {DRIVERSTORE IMPORT VALIDATE: exit(0xe000022f)} 21:21:44.154
    !!! sig: Driver package failed signature verification. Error = 0xE000022F
    !!! sto: Failed to import driver package into Driver Store. Error = 0xE000022F
    sto: {Stage Driver Package: exit(0xe000022f)} 21:21:44.169
    sto: {Import Driver Package: exit(0xe000022f)} 21:21:44.169
    !!! ndv: Driver package import failed for device.
    !!! ndv: Error 0xe000022f: The third-party INF does not contain digital signature information.
    ndv: Installing NULL driver.
    dvi: {Plug and Play Service: Device Install for ROOT\SMARTCARDREADER002}
    ! ndv: Installing NULL driver!
    dvi: {DIF_ALLOW_INSTALL} 21:21:44.200
    dvi: Using exported function ‘ClassInstall32’ in module ‘C:\Windows\system32\winscard.dll’.
    dvi: Class installer == winscard.dll,ClassInstall32
    dvi: No CoInstallers found
    dvi: Class installer: Enter 21:21:44.200
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:44.200
    dvi: Default installer: Exit
    dvi: {DIF_ALLOW_INSTALL – exit(0xe000020e)} 21:21:44.215
    dvi: {DIF_REGISTER_COINSTALLERS} 21:21:44.215
    dvi: Class installer: Enter 21:21:44.215
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:44.215
    dvi: Default installer: Exit
    dvi: {DIF_REGISTER_COINSTALLERS – exit(0x00000000)} 21:21:44.215
    dvi: {DIF_INSTALLDEVICE} 21:21:44.215
    dvi: No CoInstallers found
    dvi: Class installer: Enter 21:21:44.215
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:46.244
    ! dvi: Installing NULL driver!
    ! dvi: A NULL driver installation is not allowed for this type of device!
    !!! dvi: Cleaning up failed installation (e0000219)
    !!! dvi: Default installer: failed!
    !!! dvi: Error 0xe0000219: The installation failed because a function driver was not specified for this device instance.
    dvi: {DIF_INSTALLDEVICE – exit(0xe0000219)} 21:21:46.244
    dvi: {DIF_DESTROYPRIVATEDATA} 21:21:46.244
    dvi: Class installer: Enter 21:21:46.244
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:46.244
    dvi: Default installer: Exit
    dvi: {DIF_DESTROYPRIVATEDATA – exit(0xe000020e)} 21:21:46.244
    ump: {Plug and Play Service: Device Install exit(e0000219)}
    dvi: {DIF_DESTROYPRIVATEDATA} 21:21:46.244
    dvi: Class installer: Enter 21:21:46.244
    dvi: Class installer: Exit
    dvi: Default installer: Enter 21:21:46.259
    dvi: Default installer: Exit
    dvi: {DIF_DESTROYPRIVATEDATA – exit(0xe000020e)} 21:21:46.259
    <<< Section end 2014/06/06 21:21:46.259

    请问是为什么啊。

    1. 1. 在inf文件中指定CatalogFile,同时在安装包中包含相应.cat文件。
      2. 相信你已经做了,但仍指出:因你的驱动未经签名,启动时选择禁用数字签名启动项。

  5. 您好我寫了兩個driver都是用VS2013+wdk8.1
    照您所說的把KMDF改為1.09,compile後的driver在xp上安裝
    一個可正常安裝,但另一個安裝時會出現
    「Windows 無法載入這個硬體的裝置驅動程式。驅動程式可能已損毀或遺失。 (代碼 39)」這個問題…
    可否請教是那裡出了問題?或我該從那個方向去debug?

  6. 请问张大侠,我们用WDF做了一个驱动,用的是VS2013加WDK8.1的编译环境,就按照您说的方法。在WIN7下用的是WDF1.10的库,在XP下用的是1.09的库 在WIN7下驱动很稳定
    但是XP下就出问题,好像是定时器出问题
    但那里出问题不定,有时候是在定时器函数里,有时候好像是在 WdfTimerStop(pDeviceExtension->timerForKdbInput, TRUE);这个语句
    或则 WdfTimerStart(pDeviceExtension->timerForKdbInput, WDF_REL_TIMEOUT_IN_MS(1)); 这个语句
    请问大侠知道是什么原因引起的么 ,多谢了!

发表评论

电子邮件地址不会被公开。