話は、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 件のコメント:
コメントを投稿