Hallo zusammen, ich hab da mal eine Frage. Hat schon mal jemand versucht eine beliebige Datei unter Windows per C++ auf eine Speicherkarte an eine ganz bestimmte Position (Sektor, Cluster...) zu schreiben? Wenn ja - wie geht sowas?? Ganz ganz früher hat man mal sowas wie eine DOS-Interrupt INT13 dafür genommen. Aber jetzt??? Kann mir jemand eiterhelfen?? huibuh07
Mit CreateFile(...) kannst du auch die Volumes physikalisch ansprechen, wie das geht steht in der MSDN. Dann kann man im RAW Modus drauf zu greifen. Allerdings erfordert das Administrator-Rechte und genaues Wissen darüber, was man macht, sonst ist u.U. die Karte dann nicht mehr lesbar.
Du willst also gar keine Datei schreiben, sondern unter Umgehung des Dateisystems direkt auf dem Medium herumschreiben. Das geht, indem das betreffende Laufwerk als sogenanntes "Raw-Device" angesteuert wird. Damit ist das gesamte Laufwerk eine Datei, Schreib- und Lesezugriffe sollten an Sektorgrenzen ausgerichtet sein und immer in ganzzahligen Vielfachen einer Sektorgröße erfolgen. Mehr dazu in der Dokumentation der Win32-API-Funktion CreateFile: http://msdn2.microsoft.com/en-US/library/aa363858.aspx Abschnitt "Physical Disks and Volumes", beginnend mit der Textzeile "When opening a volume or floppy drive ..."
Ich denke, das dürfte bei kleineren Sachen wesentlich einfacher zu managen sein, als ein Dateisystem zu verwalten ....
@rufus Danke für den Link. Ich glaube das funktioniert. Werd mich in der nächsten Zeit mal dran machen und ein kleines Programm schreiben. Gruß huibuh07
Habe ich schonmal gemacht:
1 | HANDLE hDevice; |
2 | |
3 | void sd_init(void) |
4 | {
|
5 | |
6 | hDevice = CreateFile("\\\\.\\H:", |
7 | GENERIC_READ | GENERIC_WRITE, |
8 | 0, |
9 | NULL, // default security attributes |
10 | OPEN_EXISTING, // disposition |
11 | 0, // file attributes |
12 | NULL); // do not copy file attributes |
13 | |
14 | }
|
15 | |
16 | void sd_write(uint32_t adress, void *p_src) |
17 | {
|
18 | uint32_t nByteswritten; |
19 | |
20 | SetFilePointer(hDevice, adress, NULL, FILE_BEGIN); |
21 | WriteFile(hDevice, p_src, 512, &nByteswritten, NULL); |
22 | }
|
23 | |
24 | void sd_read (uint32_t adress, void *p_dst) |
25 | {
|
26 | uint32_t nBytesread; |
27 | |
28 | SetFilePointer(hDevice, adress, NULL, FILE_BEGIN); |
29 | ReadFile(hDevice, p_dst, 512, &nBytesread, NULL); |
30 | |
31 | }
|
Allerdings alles etwas Quick and Dirty. Und bei CreateFile natürlich den Laufwerksbuchstaben der SD Karte angeben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.