Obtener tamaño de volumen en Windows
Estoy escribiendo una biblioteca para extraer información sobre discos físicos, particiones y volúmenes en un sistema Windows (XP o posterior).
Estoy tratando de obtener la capacidad de un volumen. Estos son los enfoques que conozco y la razón por la que cada uno falla:
GetDiskFreeSpaceEx
- Afectado por la cuota de usuario.IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
- Obtiene el tamaño de todo el disco físico, incluso cuando se invoca mediante un controlador de volumen.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
- No tiene en cuenta los gastos generales de RAID.IOCTL_DISK_GET_LENGTH_INFO
- Falla con el acceso denegado. (En realidad, requiereGENERIC_READ
acceso, a diferencia de todas las demás consultas, yGENERIC_READ
requiere acceso de administrador.)IOCTL_STORAGE_READ_CAPACITY
- No disponible en XP, también comparte los inconvenientes deIOCTL_DISK_GET_LENGTH_INFO
yIOCTL_DISK_GET_DRIVE_GEOMETRY_EX
FSCTL_GET_VOLUME_BITMAP
+ GetFreeDiskSpace
para el tamaño del grupo - RequiereGENERIC_READ
(acceso de administrador) y proporciona el tamaño del área de datos del sistema de archivos, no todo el volumen.IOCTL_DISK_GET_PARTITION_INFO
- requiereGENERIC_READ
(acceso de administrador) y también falló en un disco con conexión USB (posiblemente utilizando partición superfloppy)Curiosamente, el número de agrupaciones deFSCTL_GET_VOLUME_BITMAP
y WMICIM_LogicalDisk.Size
propiedad de acuerdo, y ambos son 4096 bytes más pequeños que el valor deIOCTL_DISK_GET_LENGTH_INFO
.
¿Cuál es la forma correcta de obtener capacidad de volumen? Como todas las demás consultas funcionan sin acceso de administrador, también estoy buscando una solución con privilegios mínimos para esto.