Том на физический диск

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

(E: SD-карта)

Имя устройства: "\ Device \ HarddiskVolume3"

Как мне "преобразовать" его во что-то вроде "\\.\PHYSICALDRIVE1"


person Cornwell    schedule 29.09.2010    source источник
comment
Какова ваша цель? Почему вы хотите конвертировать его в такой формат? Или вы просто хотите получить глобальный уникальный индекс устройства?   -  person Karel Petranek    schedule 29.09.2010
comment
Это не диск, это действительно просто том.   -  person Hans Passant    schedule 29.09.2010
comment
Я пытаюсь получить информацию с помощью WMI. Мне нужно это знать, чтобы сопоставить DeviceID из класса Win32_DiskDrive.   -  person Cornwell    schedule 29.09.2010


Ответы (2)


Тома состоят из одного или нескольких разделов, расположенных на дисках. Итак, E: не обязательно сопоставляется с одним диском в системе (подумайте о программном RAID).

Способ сопоставления томов с именами PhysicalDrive в Win32 заключается в том, чтобы сначала открыть том, а затем отправить IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Это даст вам структуру с одной записью 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"

-скотт

person snoone    schedule 29.09.2010

Поскольку вы все равно используете WMI, начните с Win32_LogicalDiskToPartition. На стороне Win32_LogicalDisk заголовок будет буквой диска. Затем используйте Win32_DiskDriveToDiskPartition, чтобы узнать, на каком физическом диске находится этот раздел.

person Jerry Coffin    schedule 29.09.2010