Как сопоставить логические диски физическому?
От: bigredcat  
Дата: 12.06.09 08:38
Оценка:
Имею список имен дисковых устройств.
Необходимо определить имена логических дисков (томов) принадлежащих физическому диску.
Как это сделать?
Re: Как сопоставить логические диски физическому?
От: x64 Россия  
Дата: 12.06.09 08:43
Оценка:
B>Имею список имен дисковых устройств.
B>Необходимо определить имена логических дисков (томов) принадлежащих физическому диску.
B>Как это сделать?

Этот вопрос регулярно появляется здесь в том или ином виде примерно раз в два месяца. И отвечали на него все кому не лень было, в т.ч. и я. Научитесь наконец-то пользоваться поиском.
Re[2]: Как сопоставить логические диски физическому?
От: bigredcat  
Дата: 12.06.09 09:20
Оценка:
x64>Этот вопрос регулярно появляется здесь в том или ином виде примерно раз в два месяца. И отвечали на него все кому не лень было, в т.ч. и я. Научитесь наконец-то пользоваться поиском.

Виноват, исправлюсь (интерфейс форума сильно смущает)
Re: Как сопоставить логические диски физическому?
От: maks__  
Дата: 13.06.09 19:37
Оценка: 1 (1)
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;
}
Re[2]: Как сопоставить логические диски физическому?
От: bigredcat  
Дата: 17.06.09 16:08
Оценка:
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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.