Obter tamanho de volume no Windows

Estou escrevendo uma biblioteca para extrair informações sobre discos físicos, partições e volumes em um sistema Windows (XP ou posterior).

Estou tentando obter a capacidade de um volume. Aqui estão as abordagens que eu conheço e a razão pela qual cada falha:

GetDiskFreeSpaceEx - Afetado pela cota do usuário.IOCTL_DISK_GET_DRIVE_GEOMETRY_EX - Obtém o tamanho do disco físico inteiro, mesmo quando chamado usando um identificador de volume.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS - Não conta para sobrecarga de RAID.IOCTL_DISK_GET_LENGTH_INFO - Falha com acesso negado. (Na verdade, isso requerGENERIC_READ acesso, ao contrário de todas as outras consultas, eGENERIC_READ requer acesso de administrador.)IOCTL_STORAGE_READ_CAPACITY - Não disponível no XP, também compartilha as desvantagens deIOCTL_DISK_GET_LENGTH_INFO eIOCTL_DISK_GET_DRIVE_GEOMETRY_EXFSCTL_GET_VOLUME_BITMAP + GetFreeDiskSpace para o tamanho do cluster - RequerGENERIC_READ (acesso de administrador) e fornece o tamanho da área de dados do sistema de arquivos, não o volume inteiro.IOCTL_DISK_GET_PARTITION_INFO - RequerGENERIC_READ (acesso de administrador) e também falhou em um disco conectado via USB (possivelmente usando particionamento de superfloppy)

Estranhamente, o número de clusters deFSCTL_GET_VOLUME_BITMAP e WMICIM_LogicalDisk.Size propriedade concorda, e ambos são 4096 bytes menores do que o valor deIOCTL_DISK_GET_LENGTH_INFO.

Qual é a maneira correta de obter capacidade de volume? Como todas as outras consultas funcionam sem acesso de administrador, estou procurando uma solução com menos privilégios para isso também.

questionAnswers(1)

yourAnswerToTheQuestion