2013年3月23日土曜日

ドライブ名とディスクの対応関係を調べる方法

以前から少し気になっていたことを調べてみました。またすぐに忘れそうなので、記録として残しておきます。
おおざっぱには次のようになります。


  1. ディスクの一覧を取得して、それぞれのディスクに対して、そのディスクの下に繋がっているボリューム名一覧を得ます。
  2. 個々のボリューム名と、それに対応する物理デバイスオブジェクト名(SPDRP_PHYSICAL_DEVICE_OBJECT_NAME)の対応関係を調べます。
  3. その一方で、個々のドライブレター(A~Z)とそれに対応する物理デバイスオブジェクト名の対応関係を調べます。
これで、ドライブレター<-->物理デバイスオブジェクト名<-->ボリューム名<-->ディスクまで繋がりました。もちろん、ボリューム名<-->ディスクの関係は一対一とは限りません。

具体的には次のようなAPIを使いました。
  1. SetupDiGetClassDevs()にGUID_DEVINTERFACE_DISKを渡して物理ディスクの一覧を得て、SetupDiEnumDeviceInfo()で個々のディスクに対して、そのディスクのDEVINSTをCM_Get_Device_ID_List()関数にCM_GETIDLIST_FILTER_REMOVALRELATIONSフラグ付きで渡すと、そのディスクの下にあるボリューム名の一覧が得られます。
  2. SetupDiGetClassDevs()にGUID_DEVINTERFACE_VOLUMEを渡してボリュームの一覧を得て、SetupDiEnumDeviceInfo()で個々のボリュームに対して、そのボリュームのSP_DEVINFO_DATAをSetupDiGetDeviceRegistryProperty()関数にSPDRP_PHYSICAL_DEVICE_OBJECT_NAMEフラグ付きで渡すと、物理デバイスオブジェクト名が得られます。
  3. A~Zまでのドライブレターに対して、QueryDosDevice()を実行することで、物理デバイスオブジェクト名が得られます。

「物理デバイスオブジェクト名」という名称は正しくないのかもしれませんが、上の1~3の説明の中で同じものであることを示すために便宜的にそう呼ぶことにしています。

0 件のコメント:

コメントを投稿