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.