7
QueryDosDevice(L"E:", DeviceName, MAX_PATH);

(E:はSDカードです)

DeviceName は「\Device\HarddiskVolume3」です

それを次のようなものに「変換」するにはどうすればよいですか"\\.\PHYSICALDRIVE1"

4

2 に答える 2

20

ボリュームは、ディスク上に存在する 1 つ以上のパーティションで構成されます。したがって、E: は必ずしもシステム内の単一のディスクにマップされるとは限りません (ソフトウェア RAID を考えてください)。

Win32 でボリュームを PhysicalDrive 名にマップする方法は、最初にボリュームを開き、次に IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS を送信することです。これにより、ボリュームがまたがるすべてのパーティションに対して 1 つの DISK_EXTENT エントリを持つ構造が得られます。

typedef struct _VOLUME_DISK_EXTENTS {
  DWORD       NumberOfDiskExtents;
  DISK_EXTENT Extents[ANYSIZE_ARRAY];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;

エクステントにはディスク番号があります。

typedef struct _DISK_EXTENT {
  DWORD         DiskNumber;
  LARGE_INTEGER StartingOffset;
  LARGE_INTEGER ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;

DiskNumber は PhsyicalDriveX リンクに入るものなので、「\\.\PhysicalDrive%d」でその番号をスプリントできます。

-スコット

于 2010-09-29T17:48:13.877 に答える
2

いずれにせよ WMI を使用しているので、 から始めWin32_LogicalDiskToPartitionます。側面ではWin32_LogicalDisk、キャプションはドライブ文字になります。次にWin32_DiskDriveToDiskPartition、どの物理ドライブがそのパーティションを保持しているかを確認するために使用します。

于 2010-09-29T17:42:31.993 に答える