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 aa3 Bytes - Jmp Instruction
eb 52 90 .. .. .. .. .. .. .. .. .. .. .. .. ..8 Bytes - OEM ID
.. .. .. 4e 54 46 53 20 20 20 20 .. .. .. .. .. -> NTFS25 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 Checksum426 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 aaHier 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!