Funktion für die Anzahl der Sektoren einer Speicherkarte



  • 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 int gewesen wäre, wäre dieser implizit konvertiert worden.



  • BOOL == int
    

Anmelden zum Antworten