Funktion für die Anzahl der Sektoren einer Speicherkarte
-
Windows XP.
-
In's WinAPI-Forum verschieben, bitte. Für Fragen bezüglich einem Betriebsystem, bitte in das jeweilige Unterforum posten.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Weis niemand was?
-
Kein_Geek schrieb:
Weis niemand was?
So geht es nicht schneller.
EDIT: Warst du schon auf MSDN?
-
Naja, am Einfachsten dürfte wohl Folgendes sein
bool GetDriveGeometry(DISK_GEOMETRY* pdg) { static int i; string dev("\\\\.\\PhysicalDrive"); if(i>9) // diese Sparkonvertierung kommt nur mit einstelligen Zahlen zurecht return false; dev+=i+'0'; HANDLE device = CreateFile(dev.c_str(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(device == INVALID_HANDLE_VALUE) return (false); cout << dev << "\n"; DWORD junk; BOOL result = DeviceIoControl(device, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, pdg, sizeof(DISK_GEOMETRY), &junk, NULL); CloseHandle(device); ++i; return result?true:false; } int main() { bool result; do { DISK_GEOMETRY dg; result = GetDriveGeometry (&dg); if (result) { cout << "Cylinders (low, high): " << dg.Cylinders.LowPart << ", " << dg.Cylinders.HighPart << endl; cout << "Tracks per cylinder : " << dg.TracksPerCylinder << endl; cout << "Sectors per track : " << dg.SectorsPerTrack << endl; cout << "Bytes per sector : " << dg.BytesPerSector << endl; __int64 cap=0; if(dg.Cylinders.HighPart) { cap = dg.Cylinders.HighPart; cap <<= 32; } cap+=dg.Cylinders.LowPart; cap*=dg.TracksPerCylinder; cap*=dg.SectorsPerTrack; cap*=dg.BytesPerSector; cap/=1024*1024*1024; cout << "~ " << cap << " GB\n"; cout << "-----------------------------------------------------------------"<<endl; } } while (result); return 0; }Der Code klappert also die einzelnen physikalisch verfügbaren Devices ab, bis der Aufruf von CreateFile oder DeviceIoControl fehlschlägt (oder i>9 ist
).
Um nähere Informationen über die Devices zu bekommen, kannst du mit SetupDiGetDeviceRegistryProperty und SetupDiGetDeviceRegistryProperty arbeiten.
-
_Falke schrieb:
Naja, am Einfachsten dürfte wohl Folgendes sein
bool GetDriveGeometry(DISK_GEOMETRY* pdg) { static int i; // (...)Das ist schon schmerzhaft.
Sowas sollte man nichtmal im Scherz schreiben.
-
Dass das Ganze nur dazu gedacht ist, das Prinzip zu zeigen, dürfte spätestens nach Sichten des Codes zum Anhängen der Zahl an den string klar sein.
Natürlich könnte i als Parameter übergeben werden, ich habs mir eben einfach gemacht.[Die eigentlich folgenden zwei Sätze habe ich doch noch gestrichen]
-
return result?true:false;

-
^^ schrieb:

do { if (result) { } } while (result);
-
Ich habe gerade nachgesehen: Es hat 8 Minuten gedauert, meinen Beitrag zu schreiben (Diffrenz zwischen dem vor- und dem letzten Beitrag gestern).
Das war anscheinend nicht lang genug, um wirklich guten Code zu schreiben. Aber noch einmal: Ich wollte nur das Prinzip zeigen.
Und @^^: int != bool
-
_Falke schrieb:
@^^: int != bool
BOOL result = ... return result?true:false;Und wenn es ein
intgewesen wäre, wäre dieser implizit konvertiert worden.
-
BOOL == int