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_EX
FSCTL_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.