【发布时间】:2011-10-30 00:08:58
【问题描述】:
我的任务是跟踪从 Windows 服务中添加和删除磁盘驱动器。我使用 RegisterServiceCtrlHandlerEx 和 RegisterDeviceNotification 来实现这一点。我的服务控制处理程序例程成功接收 SERVICE_CONTROL_DEVICEEVENT 控制代码并处理 GUID_DEVINTERFACE_VOLUME clsss 的 DBT_DEVICEARRIVAL 和 DBT_DEVICEREMOVECOMPLETE 事件。顺便说一句,Windows 不会向我的例程发送 DBT_DEVICEQUERYREMOVE、DBT_DEVICEQUERYREMOVEFAILED、DBT_DEVICEREMOVEPENDING 事件,但现在我想解决另一个问题。
当我收到 DBT_DEVICEARRIVAL 和 DBT_DEVICEREMOVECOMPLETE 事件并且 dbch_devicetype 为 DBT_DEVTYP_DEVICEINTERFACE 时,我可以从 DEV_BROADCAST_DEVICEINTERFACE 结构的 dbcc_name 字段中读取设备名称。它看起来像这样:\?\STORAGE#RemovableMedia#7&331a4e33&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
我只能在 DBT_DEVICEARRIVAL 事件上使用 GetVolumeNameForVolumeMountPoint 过程将此字符串转换为卷 guid 路径。 DBT_DEVICEREMOVECOMPLETE事件GetVolumeNameForVolumeMountPoint返回错误3(系统找不到指定的路径)。
另一方面,在服务启动期间,我使用 FindFirstVolume/FindNextVolume 扫描系统中的所有卷,这会返回给我所有卷的卷 GUID 路径列表。
因此,如果在我的服务启动时卷存在,我可以接收其卷 GUID 路径。如果在我的服务运行时该卷将被删除,那么我将从 DBT_DEVICEREMOVECOMPLETE 事件。
正如我上面写的,我不能在 DBT_DEVICEREMOVECOMPLETE 事件期间使用 GetVolumeNameForVolumeMountPoint 来获取卷 GUID 路径。所以我想找到一种方法将从 FindFirstVolume/FindNextVolume 收到的卷 GUID 路径转换为设备名称。我需要这个来维护我自己的系统中现有可移动磁盘驱动器的列表。
请给我一些关于这个问题的建议。
【问题讨论】:
标签: windows winapi windows-services