Forum: PC-Programmierung Datei ab best. Sektor auf eine Speicherkarte


von TK (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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 ..."



von Der Hubert (Gast)


Lesenswert?

Ich denke, das dürfte bei kleineren Sachen wesentlich einfacher zu 
managen sein, als ein Dateisystem zu verwalten ....

von TK (Gast)


Lesenswert?

@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

von Simon K. (simon) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.