Для входа в мое приложение мне нужно получить информацию о физических разделах на диске, такую как информация, представленная в 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 (или 2-й половине составного тома F :), и я пытаюсь использовать "\\\\?\\GLOBALROOT\\Device\\Harddisk2\\Partition1"
в вызове CreateFile
, это не с кодом ошибки 2, или ERROR_FILE_NOT_FOUND
,
Итак, вопрос в том, как мне получить информацию о разделе на динамическом диске?
Прочитайте документацию:
В частности, этот раздел содержит подсказку:
Определение типа диска
Не существует специальной функции для программного определения типа диска, на котором расположен конкретный файл или каталог. Есть косвенный метод.
Сначала позвоните
GetVolumePathName
, Затем позвонитеCreateFile
чтобы открыть том, используя путь. Далее используйтеIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
с ручкой тома, чтобы получить номер диска и используйте номер диска для построения пути к диску, например,"\\?\PhysicalDriveX"
, Наконец, используйтеIOCTL_DISK_GET_DRIVE_LAYOUT_EX
получить список разделов, и проверитьPartitionType
для каждой записи в списке разделов.
Других решений пока нет …