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_EXFSCTL_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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta