電子書籍の厳選無料作品が豊富!

 任意のファイルが保存されているディスクの固有情報を取得するプログラムを作成しています。固有情報は論理ディスクでは取得できないため、「C:\sample.txt」の「C:」といった論理ドライブ名から「PHYSICALDRIVE0」のような物理ドライブ名を取得する方法を探しています。

なお開発環境はVisual C++ 2008/Win32 SDKの組み合わせとなります。

A 回答 (1件)

方法 (1)



WMI ( Windows Management Instrumentation ) を使ってこれらを
関連付けする方法はどうでしょうか?

WQL 文
SELECT * from Win32_LogicalDiskToPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
Dependent: \\hostname\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
(略)

WQL 文
SELECT * from Win32_DiskDriveToDiskPartition

結果
Antecedent: \\hostname\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
Dependent: \\hostname\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
(略)

WMI を VC++ からお使いに方法については以下の URL をご参照ください。

WMI C++ Application Examples (Windows)
http://msdn2.microsoft.com/en-us/library/aa39455 …

WQL (SQL for WMI) (Windows)
http://msdn2.microsoft.com/en-us/library/aa39460 …

CodeProject Making WMI Queries In C++. Free source code and programming help
http://www.codeproject.com/KB/system/UsingWMI.aspx


方法 (2)

ドライブ情報を取得するツールがベクターにあり、この方法は WMI を使いません。
ソースも同梱されています。
volumeinfo displays the Volume Infomations.
http://www.vector.co.jp/soft/dl/winnt/util/se328 …
※ \\.\PHYSICALDRIVE0 ではなく WIN32API の QueryDosDevice で
  取得できる \Device\HardDiskVolume0 ですが。


蛇足にしかなりませんが。
CLI を使ったマネージドコードならこれだけで呼び出すことが可能です。
※ 処理に時間がかかります。
----------------
// 参照追加 System.Management
// using namespace System::Management;
System::String^ logdrv_to_phydev(System::String^ drive)
{
System::String^ strClassName = "Win32_LogicalDisk='" + drive->Trim()->Substring(0,1) + ":'";
ManagementObject^ mo = gcnew ManagementObject(strClassName);
for each (ManagementObject^ mo1 in mo->GetRelated("Win32_DiskPartition"))
{
for each (ManagementObject^ mo2 in mo1->GetRelated("Win32_Diskdrive"))
return mo2["Name"]->ToString();
}
}
----------------
// 呼出例
// 結果: \\.\PHYSICALDRIVE0
Console::WriteLine(logdrv_to_phydev("C"));
----------------
    • good
    • 0
この回答へのお礼

 WMIに関する情報を検索することで、DeviceIoControlとIOCTL_STORAGE_QUERY_PROPERTYの組み合わせでも番号を取得できることがわかりました。ご回答いただき、ありがとうございます。

お礼日時:2008/03/29 16:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!