我目前正在使用具有分支逻辑的应用程序,具体取决于是否将特定USB驱动器插入系统。它通过轮询所有驱动器号来查找每个驱动器根目录上的路径。
这适用于大多数计算机,但通常,此应用程序在启动时运行,并插入USB驱动器。此外,一些机器特别慢,并且在Windows启动后花费很长时间来加载USB驱动器。在这些机器中,代码会检查此驱动器是否存在,无法找到驱动器,并执行错误的分支。
可以在检查驱动器之前等待一分钟。我希望让应用程序在检查驱动器之前等待所有USB设备(或仅仅是大容量存储设备)加载,或者更智能的东西。
不幸的是,我不熟悉等待所有USB设备完成加载所需的方法,以及一般的DDK。我see可以通过GUID_DEVINTERFACE_USB_DEVICE
注册设备通知窗口,可能会收到DBT_DEVICEARRIVAL
,DBT_DEVNODES_CHANGED
和WM_DEVICECHANGE
等消息,我不知道的区别。
但是,在程序执行之前,USB驱动器可能已经插入并检测到(但没有驱动器号)。因此,注册所有设备更改通知是没有意义的。如果可以识别插入但未加载的设备(可能带有SetupDiEnumDeviceInterfaces
),然后注册"已加载"所有这些设备上的通知,它可能会工作。我不熟悉这些,所以指针(或示例代码)将非常有用。
答案 0 :(得分:0)
我认为你不能。
问题在于你要区分两种实际上并不明显的情况,即在启动时插入USB设备并在以后插入它的情况。
您必须知道USB是一种协议,需要在USB从设备中提供非常重要的智能。他们与USB主机(即您的操作系统)交换多条消息。这种交换不是即时的。例如,您的USB硬盘驱动器需要获得超过100mA电源的许可。要回答这个问题,Windows的电源驱动程序必须启动并运行。只有当答案到来时,光盘才会旋转。
所以,有一个完整的消息序列正在进行,驱动器号只显示得相当晚。 Windows必须知道存在多少分区。所以在这次交流中,新的设备一直在创造。
当您在积极添加设备时枚举设备 时,您真的会遇到麻烦。 SetupDiEnumDeviceInterfaces
API不对快照进行操作(我们知道因为没有Close方法);你要求第N个设备,直到你得到一个“没有设备”错误,你知道N很大。但是当设备仍在积极添加时,N会发生变化。我没有看到保证列表顺序是按年龄;也可以在中间添加设备。
答案 1 :(得分:0)
我不认为获取有关为新插件设备安装驱动程序的通知会对您有所帮助。重复插入同一设备时,通常只在第一次安装驱动程序。
此外,USB闪存驱动器虽然在物理上看起来像一个紧凑型设备,但由Windows至少有三个PnP设备代表:USB大容量存储设备(代表USB端点),磁盘设备(代表内部的物理磁盘)闪存驱动器)和一个或多个Volume设备(在您的情况下每个代表一个卷=分区)。可以将驱动器号分配给音量设备。
您可以做的是监控Volume设备的到达和删除(RegisterDeviceNotification for GUID_DEVINTERFACE_VOLUME)并检查到达的每个卷设备(我相信Setup API允许您跟踪它的"父母"到USB堆栈)。