Приветствую
Необходимо получить номер физического диска по имени логического диска, а также 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);
}