2013年8月22日木曜日

Windows上でのUSBメモリとドライブの関係について

しつこいようですが、以前こちらに書いた内容がどうもまだしっくり来ていなかったので、再度まとめたいと思います。この件は、これで最後にしたいです。

話は、Windows PCに接続したUSBメモリ(マスストレージデバイス)とそのメモリ上のドライブとの関連をどうやって調べるか?ということです。

ポイントとなる概念は次の4つです。

  • USBデバイス
  • ディスク装置
  • ボリューム
  • ドライブ名
この4つの概念が、Windows上ではどのようにつながっているのか?どうやってその関係を調べることができるのか?という点をまとめます。


1.「USBデバイス」と「ディスク装置」の関係

これは一対一に対応しています。そして、デバイスツリー上(デバイスマネージャー上)でも親子関係が成立しています。つまり、CM_Get_Parent/CM_Get_Child APIを使って互いに行き来できます。もちろん、USBメモリが親で、ディスク装置が子になります。


2.「ディスク装置」と「ボリューム」の関係

ここが一番むずかしい部分です。一つのディスク装置に対して、複数のボリュームが対応づけられています。これは、1台のHDDに、複数のパーティションを作ることができるという事実に対応しています。
難しい理由は、Windows XPまでと、Vista以降とでは対応づけの方法が変わっているからです。
XPでは、「ディスク」と「ボリューム」はデバイスツリー上で親子関係を持っています(デバイスマネージャでも確認できます)。USBディスク装置のDEVINSTを得ることができたら、CM_Get_ChildやCM_Get_Sibling APIを使って、ディスク内のボリュームを列挙できます。
しかし、Windows8で確認してみると、「ディスク」の子として「ボリューム」は見あたりません。その代わりに、ディスク装置のDEVINSTを得たらCM_Get_Device_ID_List APIにCM_GETIDLIST_FILTER_REMOVALRELATIONSフラグを渡すことで、「ボリューム」のデバイスIDを得ることができます。


3.「ボリューム」と「ドライブ名(ドライブレター)」との関係

この2つを直接結びつけるものはありませんが、ボリュームのデバイスIDから得た「ボリューム名」と、ドライブレターから得た「ボリューム名」を比較することで、対応関係を調べることはできます。

というわけで、これらの関係を図にしてみました。



最初からこのような図があれば、こんなに悩むことはなかったんですがね。

誤りがあれば、教えてもらえるとありがたいです。

0 件のコメント:

コメントを投稿