Как открыть дескриптор раздела, чтобы получить информацию о нем на динамическом диске?

Для входа в мое приложение мне нужно получить информацию о физических разделах на диске, такую ​​как информация, предоставленная в PARTITION_INFORMATION_EX. У меня нет проблем сделать это для «Базовых дисков», используя следующий метод:

Сначала предположим следующую конфигурацию диска:

введите здесь описание изображения

Тогда следующий код работает нормально:

//Say, if I want to get info for partion 1 on disk 0 (or volume C:)
HANDLE hPart = ::CreateFile(L"\\\\?\\GLOBALROOT\\Device\\Harddisk0\\Partition1", 
    GENERIC_READ, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    OPEN_EXISTING,  0, NULL);
if(hPart != INVALID_HANDLE_VALUE)
{
    PARTITION_INFORMATION_EX pix = {0};
    DWORD bytesReturned = 0;
    if(::DeviceIoControl(hPart, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, &pix, sizeof(pix), &bytesReturned, NULL))
    {
        //Got info OK
    }

    ::CloseHandle(hPart);
}

Но если я попытаюсь получить информацию о «динамическом разделе», скажем, диске 2, разделе 1 (или второй половине составного тома F:) и попытаюсь использовать "\\\\?\\GLOBALROOT\\Device\\Harddisk2\\Partition1" в вызове CreateFile, произойдет сбой с кодом ошибки 2. , или ERROR_FILE_NOT_FOUND.

Итак, вопрос в том, как мне получить информацию о разделе на динамическом диске?


person c00000fd    schedule 28.10.2015    source источник
comment
Пробовали ли вы использовать WinObj, чтобы узнать, какие на самом деле имена устройств есть в вашей системе? Может дать вам полезную подсказку.   -  person Harry Johnston    schedule 29.10.2015
comment
@HarryJohnston: Я бы хотел, чтобы в WinObj была функция поиска. Я попытался найти, и хотя я могу найти символические ссылки для (дисковых) устройств, я не вижу для них всех разделов, как я получаю из оснастки, как показано выше.   -  person c00000fd    schedule 29.10.2015


Ответы (1)


Прочтите документацию:

базовые и динамические диски

В частности, в этом разделе содержится подсказка:

Определение типа диска

Не существует специальной функции для программного определения типа диска, на котором находится конкретный файл или каталог. Есть непрямой метод.

Сначала позвоните GetVolumePathName. Затем вызовите CreateFile, чтобы открыть том, используя путь. Затем используйте IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS с дескриптором тома, чтобы получить номер диска, и используйте номер диска для построения пути к диску, например "\\?\PhysicalDriveX". Наконец, используйте IOCTL_DISK_GET_DRIVE_LAYOUT_EX, чтобы получить список разделов, и проверьте PartitionType для каждой записи в списке разделов.

person Remy Lebeau    schedule 28.10.2015
comment
Спасибо. Я тоже нашел. К сожалению, последнее утверждение о IOCTL_DISK_GET_DRIVE_LAYOUT_EX неверно. Или, я должен сказать, это относится только к базовым дискам. В случае динамического диска, такого как Диск 2 на моем снимке экрана, он будет отображаться как один полноразмерный раздел для динамического диска. - person c00000fd; 28.10.2015
comment
Да, документация по управляющему коду подтверждает это: поддерживается только на динамических дисках, которые являются загрузочными или системными дисками, или имеют сохраненные записи в таблице разделов. По сути, он говорит вам о реальных базовых разделах физического диска, а не о динамических томах более высокого уровня. - person Harry Johnston; 29.10.2015
comment
Я думаю, что для получения информации о динамических дисках вам, возможно, придется использовать VDS или Windows Storage Management API в зависимости от ситуации. - person Harry Johnston; 29.10.2015
comment
@HarryJohnston: я никогда не использовал VDS. У вас нет образца кода C, не так ли? - person c00000fd; 29.10.2015
comment
Нет, я тоже никогда не пользовалась. - person Harry Johnston; 29.10.2015