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;
}