Я провел дополнительное расследование благодаря комментариям @ RemyLebeau:
HANDLE dev = CreateFile(..., GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
if (dev == INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError(); // then MessageBox
}
else
{
BOOL ret = DeviceIoControl(dev, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &diskInfo, sizeof(diskInfo), &dwResult, NULL);
if (ret == FALSE)
{
DWORD err = GetLastError(); // then MessageBox
}
CloseHandle(dev);
}
на компьютере, на котором произошел сбой (компьютер с Windows 10). Я обнаружил, что CreateFile
завершился успешно, но затем DeviceIoControl
завершился неудачей с GetLastError
, равным 1
, т.е. ERROR_INVALID_FUNCTION
(см. Коды системных ошибок (0-499) ).
Заключение (цитирую комментарий Реми):
Это означает, что IOCTL_DISK_GET_PARTITION_INFO не поддерживается устройством, которое вы передали в DeviceIoControl ().
Я тогда попробовал с IOCTL_DISK_GET_PARTITION_INFO_EX
:
PARTITION_INFORMATION_EX diskInfo;
BOOL ret = DeviceIoControl(dev, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, &diskInfo, sizeof(diskInfo), &lpBytesReturned, NULL);
и тогда это сработало. Я мог видеть, что diskInfo.PartitionStyle
было PARTITION_STYLE_GPT
(= 1), и это было причиной, по которой IOCTL_DISK_GET_PARTITION_INFO
потерпел неудачу. Я цитирую комментарий Реми снова:
IOCTL_DISK_GET_PARTITION_INFO не поддерживается на многораздельных дисках GPT.
Итак, вот вывод:
используйте IOCTL_DISK_GET_PARTITION_INFO_EX
вместо IOCTL_DISK_GET_PARTITION_INFO
вероятно, вместо этого проще использовать GetVolumeInformation()
и просто сравнить, если в результате получается строка "NTFS"
, как в другом ответе
в моем конкретном случае я изначально хотел проверить, является ли том NTFS или нет , прежде чем попытается выполнить индексацию с помощью DeviceIoControl(hVol, FSCTL_ENUM_USN_DATA, ...)
, потому что я думал, что такие запросы MFT будут ограничены томами NTFS. На самом деле, более простым решением было бы НЕ ИСПЫТАТЬ, если это NTFS или нет , и просто выполнить FSCTL_ENUM_USN_DATA
. Худшее, что может случиться, это то, что FSCTL_ENUM_USN_DATA
завершается с ошибкой ERROR_INVALID_FUNCTION
, согласно документации:
"ERROR_INVALID_FUNCTION Файловая система на указанном томе не поддерживает этот управляющий код."