Сопоставить физический диск по логическому (не HDD)
От: hordi  
Дата: 13.08.09 07:24
Оценка:
Приветствую

Необходимо получить номер физического диска по имени логического диска, а также Partition Number по имени.
Использую DeviceIoControl с сообщениями IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS и IOCTL_STORAGE_GET_DEVICE_NUMBER, но для CDROM и сетевых дисков получаю ошибку "Function not supported"... Начинаю подумывать, что для не HDD дисков это в принципе невозможно.

Вот полностью функция, которую я использую.


void getVolumeDiskNumber(int& diskNumber,int& partitionNumber,const wchar_t& drive)
{
  unicodeString buf = boost::str( boost::wformat(L"\\\\.\\%1%:") % drive );

  HANDLE hDevice = CreateFile( buf.c_str(),0,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);    
  if(hDevice == INVALID_HANDLE_VALUE){
    diskNumber = partitionNumber = -1;
    return;
  }

  DWORD junk;

  VOLUME_DISK_EXTENTS ob;
  BOOL ret = DeviceIoControl(hDevice,  // device to be queried
      IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,  // operation to perform
      NULL, 0, // no input buffer
      &ob, sizeof(ob),     // output buffer
      &junk,                 // # bytes returned
      (LPOVERLAPPED) NULL);  // synchronous I/O

  if(ret){
    diskNumber = ob.Extents->DiskNumber;
  }else{
    diskNumber = -1;
  }

  STORAGE_DEVICE_NUMBER sdn = {0};
  DWORD BytesReturned;
  ret = DeviceIoControl(hDevice, 
    IOCTL_STORAGE_GET_DEVICE_NUMBER,
    NULL,            // lpInBuffer
    0,                // nInBufferSize
    &sdn,            // output buffer
    sizeof(sdn),    // size of output buffer
    &BytesReturned, // number of bytes returned
    NULL            // OVERLAPPED structure
    );

  if(ret){
    partitionNumber = sdn.PartitionNumber;
  }else{
    partitionNumber = -1;
  }

  CloseHandle(hDevice);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.