windows - ボリュームGUIDパスをデバイスパスに変換する

windows winapi windows-services

私の仕事は、Windowsサービスからのディスクドライブの追加と削除を追跡することです。 RegisterServiceCtrlHandlerExとRegisterDeviceNotificationを使用してこれを実装しています。私のサービスコントロールハンドラルーチンは、SERVICE_CONTROL_DEVICEEVENTコントロールコードを正常に受信し、GUID_DEVINTERFACE_VOLUME clsssのDBT_DEVICEARRIVALおよびDBT_DEVICEREMOVECOMPLETEイベントを処理します。ちなみに、ウィンドウは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パスを受け取ることができます。そして、サービスの実行中にそのボリュームが削除される場合、デバイス名(\?\ STORAGE#RemovableMedia#7&331a4e33&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}など)を受け取ります
DBT_DEVICEREMOVECOMPLETEイベント。

上で書いたように、DBT_DEVICEREMOVECOMPLETEイベント中にGetVolumeNameForVolumeMountPointを使用してボリュームGUIDパスを取得することはできません。そこで、FindFirstVolume / FindNextVolumeから受け取ったボリュームGUIDパスをデバイス名に変換する方法を見つけたいと思います。これは、システムにある現在のリムーバブルディスクドライブの独自のリストを維持するために必要です。

この問題についてアドバイスをください。
答え
独自のデバイスリストを作成するためのデバイスを列挙するには、SetupAPIを使用できます。


SetupAPIルーチンを使用すると、すべてのデバイスを
指定されたデバイスインターフェイスクラスとのデバイスパスを取得します
端末。


まず、デバイスクラスの適切なGUIDを使用してSetupDiGetClassDevsを呼び出します。 GUID_DEVINTERFACE_VOLUME、次にSetupDiEnumDeviceInfoを繰り返し呼び出してデバイスを反復します。

それを行う方法を示すサンプルコード:


Knowledge base articleすべてを表示
プロセスの別の説明はhereにあります。セクション「USBデバイスのファイルハンドルを作成するには、次の手順を使用します」を参照してください。


個々のデバイスは、SetupDiGetDeviceRegistryPropertyを使用してプロパティ(パスはその中にあります)を照会できます。
関連記事

c++ - Windowsネットワークマッピングのラベルの設定

windows - カスタム404エラーページ

windows - Cygwin sshセッションからqwinstaを適切に実行することは可能ですか?

c# - Windowsログオフの遅延(XP、Vistaおよび7)

windows - C++ / W32-サウンドの録音、Direct ShowまたはWaveInOpen?

windows - libusb-win32:ドライバーフィルターの自動インストール

c# - ファイルのICopyHook.CopyCallbackまたはその代替はありますか?

windows - PowerShellを使用して、空のフォルダーのリストをあるボリュームから別のボリュームに移動する

windows - Windowsでユーザーを作成せずにパスワードが有効かどうかを確認することはできますか?

windows - 複数のクライアントデータベースをホストするためのVPS上のMicrosoft SQL Server-これは正しい方法ですか?