我的印象中,我最早使用的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上。
从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系统上了。
*更早KMDF版本则对Win2K亦有支持,但本文觉得,只有XP值得讨论。
13,897 total views, 6 views today
张佩,你好。
请教一个问题:我写了一个TDI 驱动,已经过签名认证。在一些Win7 64 位机器上,它能正常运行;而在部分Win7 64 位系统上,不能正常工作,在这些机器上,通过DeviceTree 可以看到它,并且在它的上面,还有另一个叫做TaoKernel 的TDI 驱动。
请帮我分析下,为什么驱动装上后,仍然不能工作?
谢谢。
你driver已经起来了,只是功能不work。你调试过吗?
谢谢你。
出问题的是个远程环境,所以不好调试。不过事后证实,驱动是正常的,只是触发驱动工作的条件没有产生。
张老师,这一个提示对我帮助很大!支持!
张佩,你好。我一直没明白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的驱动呢?
请教一下,有个pci的驱动,在winxp上运行没问题。但是在win7,下面先使用工具,读出io空间寄存器的值都是正确的,但是,驱动一安装上,马上,它的值就变了。而且,在有的windows系统中,一开始那个io空间中的值就不对。
这样的具体问题我无法凭空解释。如需帮助debug,发mail给我。
你好,我 在这个地址上下载的一个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. 在inf文件中指定CatalogFile,同时在安装包中包含相应.cat文件。
2. 相信你已经做了,但仍指出:因你的驱动未经签名,启动时选择禁用数字签名启动项。
张老师,直接更改KMDF版本到1.9的话,就编译不过去了啊,环境还要修改吗
我WDK7,8.0,8.1都安装了
张老师,您好我用vs2012(中文版) + wdk8.0 配置属性里没有您讲的那个选项
VS2012还不支持驱动编译。
qer
您好我寫了兩個driver都是用VS2013+wdk8.1
照您所說的把KMDF改為1.09,compile後的driver在xp上安裝
一個可正常安裝,但另一個安裝時會出現
「Windows 無法載入這個硬體的裝置驅動程式。驅動程式可能已損毀或遺失。 (代碼 39)」這個問題…
可否請教是那裡出了問題?或我該從那個方向去debug?
应该在入口函数(DriverEntry)处设置断点,并check此函数的返回值。
请问张大侠,我们用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)); 这个语句
请问大侠知道是什么原因引起的么 ,多谢了!