【问题标题】:USB dongle (non-storage device) not recognized after rebooted while plugged in插入后重新启动后无法识别 USB 加密狗(非存储设备)
【发布时间】:2021-01-19 23:49:57
【问题描述】:

我们有一个可编程的专有 USB 加密狗(不是存储设备),我们将它插入运行 Windows CE7 的机器中。有了加密狗,我们可以使用一个 API。一个简单的 API 函数是“checkIfDongleInserted”函数。 USB加密狗插入运行机器时被识别,即它在HKLM\Drivers\Active下的Wince注册表中列出,我们可以通过checkIfDongleInserted函数找到它。 但是,如果我们在加密狗仍然插入的情况下重新启动机器,则设备将不再被识别,即它不会出现在注册表中并且 API 函数会失败。如果我们手动重新插入加密狗,那么它会再次被识别。 有趣的是,其他设备(USB 记忆棒、USB 键盘、USB 鼠标)可以正常工作,并且在机器重新启动后可以很好地识别,而这些设备仍处于插入状态。

在检查 USB 加密狗的驱动程序后,我发现它实现了 USBInstallDriver 接口。研究这个界面让我找到了https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms923254(v=msdn.10),在评论中它说

USB驱动模块在无法识别时调用该函数 设备已连接到 USB 端口

所以我的猜测是,在机器运行时重新启动这个“USB 驱动程序模块”(从客户端应用程序)可能是识别 USB 加密狗的一个想法。虽然我没有从客户端应用程序中看到这种情况。

这个特定设备在插入时在引导时未被检测到的原因可能是什么? 有没有不用手动重新插入就能识别的方法?

【问题讨论】:

  • 尝试在其他机器上检查设备。如果它在其他机器上运行,那么最好的猜测是驱动程序已损坏。删除驱动程序并重新安装。

标签: windows-ce


【解决方案1】:

受到this 帖子的启发,我找到了解决方案。 我的假设是正确的,我必须重新启动 USB 控制器,我只是不知道该怎么做。 经过进一步研究,我发现 HCD(主机控制器驱动程序)是检测插入的 USB 设备的驱动程序,我需要重新加载。这样做后,它会再次检测到我已经插入的 USB 加密狗。

使用 FindFirstDevice 查找设备(在本例中为主机控制器),然后使用 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,0,NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多