我的任务是跟踪从Windows服务添加和删除磁盘驱动器。我使用RegisterServiceCtrlHandlerEx和RegisterDeviceNotification来实现这一点。我的服务控制处理程序例程成功接收SERVICE_CONTROL_DEVICEEVENT控制代码,并处理GUID_DEVINTERFACE_VOLUME clsss的DBT_DEVICEAREMIVAL和DBT_DEVICEREMOVECOMPLETE事件。顺便说一下,Windows不会将DBT_DEVICEQUERYREMOVE,DBT_DEVICEQUERYREMOVEFAILED,DBT_DEVICEREMOVEPENDING事件发送到我的例程,但现在我想解决另一个问题。将卷GUID路径转换为设备路径
当我接收DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE事件和dbch_devicetype是DBT_DEVTYP_DEVICEINTERFACE我可以从DEV_BROADCAST_DEVICEINTERFACE结构的dbcc_name字段读取设备名称。它看起来是这样的:\ \ STORAGE#RemovableMedia#7 & 331a4e33 RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
我可以在这个字符串中使用GetVolumeNameForVolumeMountPoint过程仅在DBT_DEVICEARRIVAL转换成卷GUID路径事件。在DBT_DEVICEREMOVECOMPLETE事件GetVolumeNameForVolumeMountPoint返回错误3(系统找不到指定的路径)。
另一方面,在服务启动期间,我使用FindFirstVolume/FindNextVolume扫描系统中的所有卷,并返回给我所有卷的卷GUID路径列表。
因此,如果卷存在时,我的服务启动我可以收到其卷GUID路径。如果该卷将被删除,而我的服务正在运行的话,我会收到设备的名称(如\?\ STORAGE#RemovableMedia#7 & 331a4e33 RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b})从 DBT_DEVICEREMOVECOMPLETE事件。
正如我上面写的,我不能在DBT_DEVICEREMOVECOMPLETE事件期间使用GetVolumeNameForVolumeMountPoint来获取卷GUID路径。所以我想找到一种方法将从FindFirstVolume/FindNextVolume收到的卷GUID路径转换为设备名称。我需要这个维护我自己的系统中的可移动磁盘驱动器列表。
请给我一些关于这个问题的建议。
您的回答很有用,但我需要添加一些说明。正如你所描述的,我尝试使用SetupDiEnumDeviceInfo和SetupDiGetDeviceRegistryProperty。但这样我无法获得设备路径。正确的方法是使用SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail。 –
听起来不错。很高兴你找到了一个方法! –