Partitionen einer Festplatte



  • Hallo zusammen,

    vorab soll erwähnt sein, dass ich Neuling in diesem Forum bin.
    Habe schon einige Foren durchsucht und leider nichts gefunden, deshalb entschuldigt, falls dieses Thema etliche Male durchgekaut worden ist!

    Zu meinem Problem:
    Gibt es eine Möglichkeit unter C bzw. C++ die Partitionen einer Festplatte auszulesen?
    Mich würde interessieren, wieviele Partitionen es mit viel GB gibt und viel Kapazität ihr noch bleibt!

    Bisher ist es so, dass ich die Platte explizit angeben muss, möchte aber sowas wie ne Schleife haben die alle Partitionen durchgeht z.B.: C:\ bis Z:\

    Mit der Funktion GetDiskFreeSpaceEx bekomme ich schon mal die Werte von der explizit angegebenen Platte.

    Hoffe ihr habt genug Info von mir bekommen, falls dies nicht der Fall ist, führe ich das Problem gerne weiter aus, aber ich denke ihr versteht mein Problem.

    Hab schon gegoogelt, leider auch ohne Erfolg...
    Hoffe hier kann mir einer helfen.

    Vielen Dank im Vorraus 👍

    Lieben Gruß
    El!



  • Es gab vor ein paar Tagen eine ähnliche Frage, in der änlicher Code entstand:

    #include <fstream>
    #include <iostream>
    #include <vector>
    int main(int argc, char* argv[])
    {
    	std::ifstream s; 
    
    	std::vector<char> t;
    	t.resize(512);
    	t.reserve(512);
        s.open( "\\\\.\\C:", std::ios_base::in | std::ios_base::binary ); 
    
        if ( !s ) 
        {
            std::cout << "konnte nicht geoeffnet werden\n"; 
            return 20;
        }
    
        s.read(&t[0],512);
        s.close(); 
        reutrn 0;
    }
    

    Mir ist das befremdlich und das was ich "gelesen" habe konnt ich nicht so recht verifizieren. Ich weiß also nicht ob man auf den Arm genommen wurde oder ob das wirklich so geht. Da ich mich nie mit soetwas beschäftigt habe, kann ich nicht sagen ob es klappt.

    [edit]
    das seek rausgenommen denn das Beispiel sollte auf den Bootsektor abzielen, hatte es beim experimentieren reingesetzt weil ich mal mitten drinn 5MB lesen wollte und beim aufbereiten vergessen. Zudem ein return eingefügt falls der Stream nicht zu öffnen ist
    [/edit]



  • Hi!

    Wenn du das s.seekg(512); weglassen würdest, könntest du mit obigen Code den Bootsektor der Partition C: auslesen. Leider bekommst du damit nicht raus wieviel Partitionen tatsächlich vorhanden sind.
    Oft stehen die gewünschten Informationen im Bootsektor, allerdings ist das abhängig vom jeweiligen Dateisystem, mit welchen der Datenträger Formatiert wurde.

    grüße



  • Wenn man so wirklich an das laufwerk kommt, könnte man das bitte in die FAQ aufnehmen ?



  • Steh ich nun total neben mir oder übersehe ich tatsächlich nur das seek?!



  • [edit]
    das seek rausgenommen denn das Beispiel sollte auf den Bootsektor abzielen, hatte es beim experimentieren reingesetzt weil ich mal mitten drinn 5MB lesen wollte und beim aufbereiten vergessen. Zudem ein return eingefügt falls der Stream nicht zu öffnen ist
    [/edit]



  • Ja schon, das sah ich schon bei deinem ersten Beitrag.

    Nur bin ich der Meinung, dass hier kein seek vorhanden ist...

    #include <fstream>
    #include <iostream>
    #include <vector>
    int main(int argc, char* argv[])
    {
    std::ifstream s;

    std::vector<char> t;
    t.resize(512);
    t.reserve(512);
    s.open( "\\\.\\C:", std::ios_base::in | std::ios_base::binary );

    if ( !s )
    {
    std::cout << "konnte nicht geoeffnet werden\n";
    return 20;
    }

    s.read(&t[0],512);
    s.close();
    reutrn 0;
    }

    Oder bin ich nun komplett bekloppt 🙂
    Vielleicht bekomm ich ja auch gleich die Pappnase auf 🤡



  • Na das Seek steht da nicht mehr, weil ich es, wie es im Edit steht, entfernt habe 🤡

    Ich hatte den Beitrag damals gelesen und da wurde der Bootsektor genommen. Ich hatte mir das dann einfach zusammen gebastelt und wollte auch in diesem Beitrag auf den Bootsektor hinaus.

    Da für mich nur Datenmüll kam hatte ich mich mit seek auf verschiedene "Positionen" gesetzt und einfach mal nen großen Block gelesen.

    Kurz: Du siehst kein seek weil da kein seek (mehr) steht 😉

    Bevor David gepostet hat stand da (sinngemäß, hatte noch bereinigungen vom VS egeinen kram gemacht):

    #include <fstream> 
    #include <iostream> 
    #include <vector> 
    int main(int argc, char* argv[]) 
    { 
        std::ifstream s; 
    
        std::vector<char> t; 
        t.resize(512); 
        t.reserve(512); 
        s.open( "\\\\.\\C:", std::ios_base::in | std::ios_base::binary ); 
    
        if ( !s ) 
        { 
            std::cout << "konnte nicht geoeffnet werden\n"; 
            return 20; 
        } 
    
        s.seekg(512); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        s.read(&t[0],512); 
        s.close(); 
        reutrn 0; 
    }
    


  • Nu hab ichs gerafft 🙂

    Vielen Dank erstmal! Ich probier da mal einwenig rum!
    Sonst meld ich mich nochmal!

    Frohes schaffen noch!

    P.S.: Sehr effektives Forum!
    --> Da werden Sie geholfen 🕶



  • Doch Knuddlbaer das funktioniert wirklich.

    Hier mal schnell ein Dump meines Bootsektors!

    eb 52 90 4e 54 46 53 20 20 20 20 00 02 08 00 00
    00 00 00 00 00 f8 00 00 3f 00 ff 00 3f 00 00 00
    00 00 00 00 80 00 80 00 b0 b5 51 08 00 00 00 00
    00 00 0c 00 00 00 00 00 5b 1b 85 00 00 00 00 00
    f6 00 00 00 01 00 00 00 78 78 bf bc a1 bf bc 98
    00 00 00 00 fa 33 c0 8e d0 bc 00 7c fb b8 c0 07
    8e d8 e8 16 00 b8 00 0d 8e c0 33 db c6 06 0e 00
    10 e8 53 00 68 00 0d 68 6a 02 cb 8a 16 24 00 b4
    08 cd 13 73 05 b9 ff ff 8a f1 66 0f b6 c6 40 66
    0f b6 d1 80 e2 3f f7 e2 86 cd c0 ed 06 41 66 0f
    b7 c9 66 f7 e1 66 a3 20 00 c3 b4 41 bb aa 55 8a
    16 24 00 cd 13 72 0f 81 fb 55 aa 75 09 f6 c1 01
    74 04 fe 06 14 00 c3 66 60 1e 06 66 a1 10 00 66
    03 06 1c 00 66 3b 06 20 00 0f 82 3a 00 1e 66 6a
    00 66 50 06 53 66 68 10 00 01 00 80 3e 14 00 00
    0f 85 0c 00 e8 b3 ff 80 3e 14 00 00 0f 84 61 00
    b4 42 8a 16 24 00 16 1f 8b f4 cd 13 66 58 5b 07
    66 58 66 58 1f eb 2d 66 33 d2 66 0f b7 0e 18 00
    66 f7 f1 fe c2 8a ca 66 8b d0 66 c1 ea 10 f7 36
    1a 00 86 d6 8a 16 24 00 8a e8 c0 e4 06 0a cc b8
    01 02 cd 13 0f 82 19 00 8c c0 05 20 00 8e c0 66
    ff 06 10 00 ff 0e 0e 00 0f 85 6f ff 07 1f 66 61
    c3 a0 f8 01 e8 09 00 a0 fb 01 e8 03 00 fb eb fe
    b4 01 8b f0 ac 3c 00 74 09 b4 0e bb 07 00 cd 10
    eb f2 c3 0d 0a 46 65 68 6c 65 72 20 62 65 69 6d
    20 4c 65 73 65 6e 20 64 65 73 20 44 61 74 65 6e
    74 72 84 67 65 72 73 00 0d 0a 4e 54 4c 44 52 20
    66 65 68 6c 74 00 0d 0a 4e 54 4c 44 52 20 69 73
    74 20 6b 6f 6d 70 72 69 6d 69 65 72 74 00 0d 0a
    4e 65 75 73 74 61 72 74 20 6d 69 74 20 53 74 72
    67 2b 41 6c 74 2b 45 6e 74 66 0d 0a 00 00 00 00
    00 00 00 00 00 00 00 00 83 a8 b6 ce 00 00 55 aa
    

    3 Bytes - Jmp Instruction

    eb 52 90 .. .. .. .. .. .. .. .. .. .. .. .. ..
    

    8 Bytes - OEM ID

    .. .. .. 4e 54 46 53 20 20 20 20 .. .. .. .. .. -> NTFS
    

    25 Bytes - BPB
    48 Bytes Extended BPB

    .. .. .. .. .. .. .. .. .. .. .. 00 02 08 00 00 -> 2 Bytes/Sektor, 8 Sektors/Cluster, 8 Reserved Sectors
    00 00 00 00 00 f8 00 00 3f 00 ff 00 3f 00 00 00 -> F8 (Media Descriptor), 16.128 Sectors/Track, 65.280 Heads
    						   1.056.964.608 Hidden Sectors
    00 00 00 00 80 00 80 00 b0 b5 51 08 00 00 00 00 -> 12.733.172.616.261.533.696 Total Sectors
    00 00 0c 00 00 00 00 00 5b 1b 85 00 00 00 00 00 -> 13.194.139.533.312 Logical Cluster Num for $MFT
    						   6.564.987.116.869.124.096 Logical Cluster Num for $MFTMirr
    f6 00 00 00 01 00 00 00 ff ff ff ff ff ff ff ff -> 4.127.195.136 Clusters Per File Record Segment
    						   268.435.456 Clusters Per Index Block
    						   ffffffffffffffff Volume Serial Number
    00 00 00 00 .. .. .. .. .. .. .. .. .. .. .. .. -> 00 00 00 00 Checksum
    

    426 Bytes - Bootstrap Code

    .. .. .. .. fa 33 c0 8e d0 bc 00 7c fb b8 c0 07
    8e d8 e8 16 00 b8 00 0d 8e c0 33 db c6 06 0e 00
    10 e8 53 00 68 00 0d 68 6a 02 cb 8a 16 24 00 b4
    08 cd 13 73 05 b9 ff ff 8a f1 66 0f b6 c6 40 66
    0f b6 d1 80 e2 3f f7 e2 86 cd c0 ed 06 41 66 0f
    b7 c9 66 f7 e1 66 a3 20 00 c3 b4 41 bb aa 55 8a
    16 24 00 cd 13 72 0f 81 fb 55 aa 75 09 f6 c1 01
    74 04 fe 06 14 00 c3 66 60 1e 06 66 a1 10 00 66
    03 06 1c 00 66 3b 06 20 00 0f 82 3a 00 1e 66 6a
    00 66 50 06 53 66 68 10 00 01 00 80 3e 14 00 00
    0f 85 0c 00 e8 b3 ff 80 3e 14 00 00 0f 84 61 00
    b4 42 8a 16 24 00 16 1f 8b f4 cd 13 66 58 5b 07
    66 58 66 58 1f eb 2d 66 33 d2 66 0f b7 0e 18 00
    66 f7 f1 fe c2 8a ca 66 8b d0 66 c1 ea 10 f7 36
    1a 00 86 d6 8a 16 24 00 8a e8 c0 e4 06 0a cc b8
    01 02 cd 13 0f 82 19 00 8c c0 05 20 00 8e c0 66
    ff 06 10 00 ff 0e 0e 00 0f 85 6f ff 07 1f 66 61
    c3 a0 f8 01 e8 09 00 a0 fb 01 e8 03 00 fb eb fe
    b4 01 8b f0 ac 3c 00 74 09 b4 0e bb 07 00 cd 10
    eb f2 c3 0d 0a 46 65 68 6c 65 72 20 62 65 69 6d
    20 4c 65 73 65 6e 20 64 65 73 20 44 61 74 65 6e
    74 72 84 67 65 72 73 00 0d 0a 4e 54 4c 44 52 20
    66 65 68 6c 74 00 0d 0a 4e 54 4c 44 52 20 69 73
    74 20 6b 6f 6d 70 72 69 6d 69 65 72 74 00 0d 0a
    4e 65 75 73 74 61 72 74 20 6d 69 74 20 53 74 72
    67 2b 41 6c 74 2b 45 6e 74 66 0d 0a 00 00 00 00
    00 00 00 00 00 00 00 00 83 a8 b6 ce 00 00 .. ..
    

    2 Bytes - End Of Sektor Marker

    .. .. .. .. .. .. .. .. .. .. .. .. .. .. 55 aa
    

    Hier noch weiterführende Informationen: http://www.ntfs.com/ntfs-partition-boot-sector.htm

    Auf die Partition kann zugegriffen werden mit:

    std::fstream f( "\\\\.\\C:", std::ios_base::in | std::ios_base::binary );
    

    Allgemein also:

    \.\Bezeichnung:

    Danach kann mit ganz normalen Leseoperationen gearbeitet werden.

    grüße



  • Hallo,

    dann schon mal vielen Dank. Ist das ganze Standartkonform ? Ich habe nie gelesen das man mittels \\\.\<Laufwerk> zugriffe auf diese Art machen kann, zumal in dem Beitrag "damals" noch was mit \\\.\\Partition0 stand.

    Hast Du zufällig einen Link der das Thema weiterbehandelt ?

    fstream \\\.\\

    ist kein guter Suchbegriff für Googel 😞



  • Das is Plattformabhängig. Unter Windows kannst du per \.\c: auf deine Partitionen zugreifen. Unter Linux sind alle Partitionen unter \dev\ zu finden, z.B. \dev\hda1.

    grüße



  • Besten Dank!


Anmelden zum Antworten