Abrufen der Lautstärke unter Windows
Ich schreibe eine Bibliothek, um Informationen zu physischen Datenträgern, Partitionen und Volumes auf einem Windows-System (XP oder höher) zu extrahieren.
Ich versuche, die Kapazität eines Volumes zu ermitteln. Hier sind die mir bekannten Ansätze und der Grund, warum sie jeweils fehlschlagen:
GetDiskFreeSpaceEx
- Betroffen von der Benutzerkontingent.IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
- Ruft die Größe der gesamten physischen Festplatte ab, auch wenn sie mit einem Volume-Handle aufgerufen wird.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
- RAID-Overhead wird nicht berücksichtigt.IOCTL_DISK_GET_LENGTH_INFO
- Der Zugriff wird verweigert. (Eigentlich erfordert esGENERIC_READ
Zugriff, im Gegensatz zu allen anderen Abfragen, undGENERIC_READ
Administratorzugriff erforderlich.)IOCTL_STORAGE_READ_CAPACITY
- Nicht verfügbar auf XP, teilt auch die Nachteile vonIOCTL_DISK_GET_LENGTH_INFO
undIOCTL_DISK_GET_DRIVE_GEOMETRY_EX
FSCTL_GET_VOLUME_BITMAP
+ GetFreeDiskSpace
für Clustergröße - ErforderlichGENERIC_READ
(Administratorzugriff) und gibt die Größe des Datenbereichs des Dateisystems an, nicht das gesamte Volume.IOCTL_DISK_GET_PARTITION_INFO
- BenötigtGENERIC_READ
(Administratorzugriff) und auch auf einem USB-Laufwerk fehlgeschlagen (möglicherweise mit Superfloppy-Partitionierung)Seltsamerweise ist die Anzahl der Cluster ausFSCTL_GET_VOLUME_BITMAP
und WMI'sCIM_LogicalDisk.Size
Eigenschaft stimmen überein, und beide sind 4096 Byte kleiner als der Wert vonIOCTL_DISK_GET_LENGTH_INFO
.
Was ist der richtige Weg, um die Volumenkapazität zu erhalten? Da alle anderen Abfragen ohne Administratorzugriff ausgeführt werden, suche ich auch hier nach einer Lösung mit den geringsten Rechten.