Имею список имен дисковых устройств.
Необходимо определить имена логических дисков (томов) принадлежащих физическому диску.
Как это сделать?
B>Имею список имен дисковых устройств.
B>Необходимо определить имена логических дисков (томов) принадлежащих физическому диску.
int LogicalDiskToPhysDisk(LPCTSTR pszName)
{
if(!(pszName && pszName[1]==':' && pszName[2]==0)) return -1;
//вместо GENERIC_READ|GENERIC_WRITE передавать 0, чтобы работало не только под администратором
CHandle hDisk(CreateFile(CString("\\\\.\\") + pszName, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL));
RETURN_IF_NOT(FileOK(hDisk), -1);
BYTE buf[1024] = {0};
DWORD BytesReturned = 0;
BOOL bResult = DeviceIoControl(hDisk, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS , NULL, 0, &buf, sizeof(buf), &BytesReturned, NULL);
if(!bResult)
return -1;//"\Device\WMDisk0" - виртуальный диск
VOLUME_DISK_EXTENTS* pExt = (VOLUME_DISK_EXTENTS*)buf;
RETURN_IF_NOT(pExt->NumberOfDiskExtents>=1, -1);
return pExt->Extents[0].DiskNumber;
}
maks__
Спасибо.
Уже разобрался. Так и делаю... почти.
Мне была нужна поддержка динамических мультидисковых томов, поэтому небольшое дополнение
Вызываем DeviceIoControl с IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS в цикле,
пока DeviceIoControl == FALSE && GetLastError() == ERROR_MORE_DATA.
Основная задача при этом выделить буфер нужного размера, примерно так:
// Если функция DeviceIoControl == FALSE, проверяем код ошибки ...
if (GetLastError() == ERROR_MORE_DATA)
{
// ... если есть еще данные, выделяем память нужного размера.
LocalFree((HLOCAL)buf);
bufSize = sizeof(VOLUME_DISK_EXTENTS) +
((PVOLUME_DISK_EXTENTS)buf->NumberOfDiskExtents - 1) * sizeof (DISK_EXTENT);
}