我的任務是跟蹤從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。 –
聽起來不錯。很高興你找到了一個方法! –