Получить размер тома в Windows
Я пишу библиотеку для извлечения информации о физических дисках, разделах и томах в системе Windows (XP или более поздняя версия).
Я пытаюсь получить объем тома. Вот подходы, о которых я знаю, и причина, по которой каждый терпит неудачу:
GetDiskFreeSpaceEx
- влияет пользовательская квота.IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
- Получает размер всего физического диска, даже если он вызывается с помощью дескриптора тома.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
- Не учитывает накладные расходы RAID.IOCTL_DISK_GET_LENGTH_INFO
- Сбои с отказом в доступе. (На самом деле, это требуетGENERIC_READ
доступ, в отличие от всех других запросов, иGENERIC_READ
требуется доступ администратора.)IOCTL_STORAGE_READ_CAPACITY
- Не доступно на XP, также имеет недостаткиIOCTL_DISK_GET_LENGTH_INFO
а такжеIOCTL_DISK_GET_DRIVE_GEOMETRY_EX
FSCTL_GET_VOLUME_BITMAP
+ GetFreeDiskSpace
для размера кластера - ТребуетсяGENERIC_READ
(доступ администратора) и дает размер области данных файловой системы, а не весь том.IOCTL_DISK_GET_PARTITION_INFO
- ТребуетсяGENERIC_READ
(доступ с правами администратора), а также сбой на диске, подключенном через USB (возможно, с использованием разделов суперфлоппи)Как ни странно, количество кластеров изFSCTL_GET_VOLUME_BITMAP
и WMICIM_LogicalDisk.Size
свойство согласовано, и оба на 4096 байт меньше значения изIOCTL_DISK_GET_LENGTH_INFO
.
Как правильно получить объемную емкость? Поскольку все остальные запросы работают без доступа администратора, я ищу решение с наименьшими привилегиями для этого.