Я ищу об этом с прошлой недели, почти все ссылки на 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 и жестких дисков.
Спасибо.