Windows生物识别框架示例umdf驱动程序:该设备无法启动。 (代码10)

时间:2019-02-19 03:04:26

标签: c++ wdk umdf wbf wbdi

我正在尝试运行Windows biometric driver sample,但是我不懂驱动程序开发

我已更改了inx文件中的硬件ID,并重建了驱动程序项目,并将生成的驱动程序安装在Windows 10 Pro 1803版中。

我正在使用指纹Morpho设备1300 E3

驱动程序已成功安装,但出现一个错误:

此设备无法启动。 (代码10) 指定的请求不是目标设备的有效操作。

我查看了文件C:\Windows\INF\setupapi.dev.log

它显示接下来的警告:

     sig:                     {_VERIFY_FILE_SIGNATURE} 10:13:03.130
     sig:                          Key      = wudfbiousbsample.inf
     sig:                          FilePath = C:\WINDOWS\System32\DriverStore\Temp\{ee9ffca3-751f-0b4e-a7ac-dce2543d995e}\wudfbiousbsample.inf
     sig:                          Catalog  = C:\WINDOWS\System32\DriverStore\Temp\{ee9ffca3-751f-0b4e-a7ac-dce2543d995e}\biometrics.cat
!    sig:                          Verifying file against specific (valid) catalog failed.
!    sig:                          Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
!!!  dvi:                     Device not started: Device has problem: 0x0a (CM_PROB_FAILED_START), problem status: 0xc0000450.

但是我在本地计算机上的受信任的根证书颁发机构和受信任的发布者上安装了TestCertificate

我还检查了EventViewer: 应用程序和服务日志> Microsoft \ Windows \ CodeIntegrity 应用程序和服务日志> Microsoft \ Windows \ Biometrics

我尝试使用wdfverifier.exe following some videos from msdn进行调试,但该过程未启动,因此无法调试:(

我验证了Visual Studio没有对EngineAdapter.dll插件文件进行签名,因此我禁用了驱动程序签名,并在this paper之后手动进行了签名。但是我得到了相同的错误代码10:(

我还想知道错误代码10是否是预期的行为,因为未实现EngineAdapter.dll的代码。

更新:我正在Windows 10 Pro 1709版虚拟机VMWare上进行测试,但出现其他错误:

此设备无法正常运行,因为Windows无法加载该设备所需的驱动程序。 (代码31)

!!!  dvi:                     Device not started: Device has problem: 0x1f (CM_PROB_FAILED_ADD), problem status: 0xc0000001.

和同样的警告:

     sig:           {_VERIFY_FILE_SIGNATURE} 17:19:01.646
     sig:                Key      = wudfbiousbsample.inf
     sig:                FilePath = C:\Windows\System32\DriverStore\Temp\{85323f79-3f5f-f84c-a52b-639b6ae57db1}\wudfbiousbsample.inf
     sig:                Catalog  = C:\Windows\System32\DriverStore\Temp\{85323f79-3f5f-f84c-a52b-639b6ae57db1}\biometrics.cat
!    sig:                Verifying file against specific (valid) catalog failed.
!    sig:                Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
     sig:           {_VERIFY_FILE_SIGNATURE exit(0x800b0109)} 17:19:01.661
     sig:           {_VERIFY_FILE_SIGNATURE} 17:19:01.676
     sig:                Key      = wudfbiousbsample.inf
     sig:                FilePath = C:\Windows\System32\DriverStore\Temp\{85323f79-3f5f-f84c-a52b-639b6ae57db1}\wudfbiousbsample.inf
     sig:                Catalog  = C:\Windows\System32\DriverStore\Temp\{85323f79-3f5f-f84c-a52b-639b6ae57db1}\biometrics.cat
     sig:                Success: File is signed in Authenticode(tm) catalog.
     sig:                Error 0xe0000241: The INF was signed with an Authenticode(tm) catalog from a trusted publisher.
     sig:           {_VERIFY_FILE_SIGNATURE exit(0xe0000241)} 17:19:01.708
     sto:      {DRIVERSTORE IMPORT VALIDATE: exit(0x00000000)} 17:19:01.739

完整日志文件在setupapi.dev.log

我希望驱动程序无法加载,因为有关证书或错误的警告可能在其他地方。

如果有人可以给我一些建议,请继续。我现在被困住了:(

非常感谢。

1 个答案:

答案 0 :(得分:0)

当我能够安装我的生物识别驱动程序时,所有操作都开始了,但是显示了“黄色感叹号”和一条通用消息“此设备无法启动。(代码10)”

生物特征样本项目不包含示例,该示例显示了如何在Visual Studio中正确签名EngineAdapter.dll this resource (page 33-34),其中显示了如何在项目属性Build Events-> Post Build Event < / strong>:

Command Line: signtool sign /v /ac "Path_to_cross_certificate_DigiCert Assured ID Root CA.crt" /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f "path_to_my_certificate_file.pfx" /p mypassword "$(Platform)\$(ConfigurationName)\EngineAdapter.dll"
Use In Build: Yes

接下来的This first video tutorial显示了使用WDK wdfverifier.exe 中的工具调试umdf驱动程序的示例。 我无法将调试器附加到驱动程序进程中,因为该进程不存在。但是我可以在启动前调试,以免进程崩溃。

要使用 wdfverifier.exe 进行调试,我采取了以下步骤:

“设置”标签: 选中选项“在请求时自动启动用户模式调试器”,在输入“主机进程将等待”中指定15秒

“首选项”标签: 选中“使用WinDbg”,然后

在设备管理器中禁用/启用我的设备

WinDbg启动,我可以检查驱动程序模块是否装有下一条命令:

lm m *bio*
//the module is not loaded, use g commant to continue
g
//again see if the module was loaded
lm m *bio*
//module shows up, great!

现在我可以设置断点,但是在此之前我必须向WinDbg指定符号文件(* .pdb)和驱动程序源代码以及下一条命令(如果您构建 package 项目,我正在参考引擎适配器项目来构建 WudfBioUsbSample ):

.symfix
.srcpath+ C:\Users\myuser\Documents\Windows-driver-samples\biometrics\driver    
.sympath+ C:\Users\myuser\Documents\Windows-driver-samples\biometrics\driver\x64\Debug

.reload /f

接下来,我可以设置一个断点:

//x command is used to search if the method exist
x WudfBioUsbSample!CBiometricDriver::*
x WudfBioUsbSample!CBiometricDevice::*
x WudfBioUsbSample!CBiometricDevice::OnGetAttributes
//examples of breakpoints
bp WudfBioUsbSample!CBiometricDriver::OnDeviceAdd
bp WudfBioUsbSample!CBiometricDevice::OnGetAttributes
bp WudfBioUsbSample!CBiometricDevice::CreateUsbIoTargets

显示错误的位置是CreateUsbIoTargets方法。这些错误已由JinZhuXing在this github issue

中修复。

修复驱动程序代码并调试方法 CreateUsbIoTargets 运行正常

仍然显示给我黄色感叹号,但是这次错误出在EngineAdapter.dll中。下一个错误显示在EventViewer中:应用程序和服务日志> Microsoft \ Windows \ Biometrics

模块的“引擎适配器”初始化例程失败,错误为:0x80004001

EngineAdapter项目方法返回了 E_NOTIMPL ,我只是将其更改为返回了所有方法的 S_OK 。生物单位成功建立。

引擎插件的调试是通过Visual Studio完成的。这是我遵循的步骤:

使用wdfverifier.exe将WinDbg附加到我的umdf驱动程序的进程中,并为OnGetAttributes方法设置一个断点(当我启动/重新启动Windows Biometric Service时将调用此方法)此断点将使该服务先等待调用EngineAdapter插件代码。

x WudfBioUsbSample!CBiometricDevice::OnGetAttributes
bp WudfBioUsbSample!CBiometricDevice::OnGetAttributes
g

重新启动或启动Windows Biometric Service(任务管理器->“服务”选项卡上的 WbioSrvc

复制进程ID(PID)

以管理员身份运行Visual Studio,打开WBDIsample项目

使用菜单调试->附加到进程...

输入以下值:

Connection Type: Windows User Mode Debugger
Connection Target: Localhost

Check "Show processes from all users" 

Filter by Process ID 
Select the process and Click Attach button.

WbioQueryEngineInterface,EngineAdapterAttach,EngineAdapterDetach 上设置断点 sample implementation is on msdn

在WinDbg上运行命令g(执行)

g

此后,您可以在Visual Studio上调试插件的代码。

剩下的是为生物识别驱动程序和设备所需的插件实现代码