问题描述
我们有一个可编程的专有USB加密狗(不是存储设备),可以将其插入运行Windows CE7的计算机中。有了加密狗,我们可以使用一个API。一种简单的API函数是“ checkIfDongleInserted”函数。
USB加密狗在插入运行中的计算机时即被识别,即在Wince注册表的HKLM\Drivers\Active
下列出,我们可以使用checkIfDongleInserted
函数找到它。
但是,如果我们在加密狗保持插入状态下重新启动计算机,则该设备将无法再识别,即,它不会显示在注册表中,并且API函数会失败。如果我们手动重新插入加密狗,则会再次被识别。
有趣的其他设备(USB记忆棒,USB键盘,USB鼠标)也能正常工作,并且在机器重新插入后仍保持插入状态时,可以很好地识别它们。
检查USB加密狗的驱动程序后,我发现它实现了USBInstallDriver接口。研究此界面后,我进入了https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms923254(v=msdn.10),在评论中它表示
所以我的猜测是,在计算机运行时重新启动此“ USB驱动程序模块”(从客户端应用程序)可能是识别USB加密狗的想法。尽管我看不到客户端应用程序会发生这种情况。
在插入设备时引导时未检测到该特定设备的原因可能是什么? 有没有一种方法可以识别它,而无需手动重新插入?
解决方法
受this的启发,我找到了解决方案。 我以为我必须重新启动USB控制器是正确的,只是我不知道该怎么做。 经过进一步研究,我发现HCD(主机控制器驱动程序)是检测插入的USB设备的驱动程序,需要再次重新加载。完成后,它将再次检测到我已经插入的USB加密狗。
使用FindFirstDevice查找设备(在本例中为Host控制器),然后使用DeactivateDevice()卸载驱动程序,并在不久之后再次使用ActivateDeviceEx()加载驱动程序。
这是没有任何错误处理的代码(我在另一台PC上,并且懒于复制所有内容,因此我只用C语言粗略地编写了以上步骤)
DeviceSearchType searchType = DeviceSearchByDeviceName;
DEVMGR_DEVICE_INFORMATION deviceInfo;
//Find HCD
handle = FindFirstDevice(searchType,L"HCD*",&deviceInfo);
//Save the deviceKey to later be able to ActivateDeviceEx()
WCHAR* deviceKey = deviceInfo.szDeviceKey;
DeactivateDevice(deviceInfo.hDevice);
Sleep(100); //to make sure
ActivateDeviceEx(deviceKey,NULL,NULL);