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

Windows biometric framework sample umdf driver: This device cannot start. (Code 10)

我正在尝试 运行 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

我还检查了事件查看器: 应用程序和服务日志 > 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

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

如果有人可以给我一些小建议以继续。我现在卡住了:(

非常感谢。

一切都是在我能够安装我的生物识别驱动程序时开始的,但它显示 "Yellow Exclamation Mark" 和一条通用消息 "This device cannot start. (Code 10)"

生物识别示例项目不包含如何使用 Visual Studio 正确签名的示例 EngineAdapter.dll 我发现 this resource (page 33-34) 其中显示 如何在项目上签名 EngineAdapter属性构建事件 -> Post 构建事件:

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 中的工具调试 umdf 驱动程序的示例 wdfverifier.exe 我无法将调试器附加到我的驱动程序进程,因为该进程不存在。但是我可以在进程崩溃之前在启动时进行调试。

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

设置选项卡: 勾选选项"Automatically Launch user-mode debugger when requested",在输入"Host Process will wait"

中指定15秒

首选项选项卡: 检查"Use WinDbg",然后

Disable/Enable 我的设备在设备管理器上

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 并参考 EngineAdapter 项目):

.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 运行s Ok

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

模块的 "Engine Adapter" 初始化例程失败,出现错误:0x80004001

EngineAdapter 项目方法 returning E_NOTIMPL 我只是将其更改为 return S_OK 而不是所有方法。生物识别单元创建成功。

此外,引擎插件的调试是通过 Visual Studio 完成的。以下是我遵循的步骤:

使用 wdfverifier.exe 将 WinDbg 附加到我的 umdf 驱动程序的进程并为 OnGetAttributes 方法设置一个断点(当我 start/restart Windows 生物识别服务时调用此方法)此断点将使服务在调用 EngineAdapter 插件代码之前等待。

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

重新启动或启动 Windows 生物识别服务(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 (Go)

g

之后你可以在Visual Studio.

调试插件的代码

剩下的就是实现生物识别驱动程序的代码和您设备的必要插件