Буква диска против DevicePath - PullRequest
2 голосов
/ 24 января 2012

Я ищу об этом с прошлой недели, почти все ссылки на DriveLetter x DevicePath / Volume / Device ID / все, что фиолетово для меня.

Я разрабатываю приложение, которое перечисляет некоторые устройства хранения итакже HDI / WPD-устройства, использующие функции SetupApi с этими руководствамидля сопоставления устройств с буквой диска.Как?С результатом SetupApi, используя DevicePath для получения DiskNumber и PartitionNumber с DeviceIOControl.И это нормально !!!На самом деле не все.На самом деле для приводов CDROM я не могу его получить.

Вот мой код.

int bytesReturned = 0;
IOCTL.DiskExtents de1 = new IOCTL.DiskExtents();
int numDiskExtents = 0;
IntPtr ptrDe1 = Marshal.AllocHGlobal(Marshal.SizeOf(de1));
bool result = IOCTL.DeviceIoControl(FileHandle, IOCTL.IOControlCodes.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, IntPtr.Zero, 0, ptrDe1, Marshal.SizeOf(de1), bytesReturned, null);
if ((!result)) {
    Marshal.FreeHGlobal(ptrDe1);
    //libera a memória alocada.
    throw new System.ComponentModel.Win32Exception(); //is thrown here
} else {
    de1 = Marshal.PtrToStructure(ptrDe1, typeof(IOCTL.DiskExtents));
    Marshal.FreeHGlobal(ptrDe1);
    return de1.first.DiskNumber;
}

Для всех приводов CDROM, которые у меня есть, выбрасывается функция Неправильно.

Для получения FileHandle я использую и букву диска (например, "\. \ D:") и путь к устройству.И оба терпят неудачу.

Я не знаю, делаю ли я что-то не так, потому что эта работа для USB Mass Storage и жестких дисков.

Спасибо.

1 Ответ

1 голос
/ 25 января 2012

Теперь я использую VolumeName из DevicePath вместо DiskNumber и PartitionNumber.Мы получаем VolumeName из "\. \ C:" и DevicePath.

...