www.mikrocontroller.net

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


Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ..."



Autor: Der Hubert (Gast)
Datum:

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

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich schonmal gemacht:
HANDLE hDevice;

void sd_init(void)
{

   hDevice = CreateFile("\\\\.\\H:", 
                    GENERIC_READ | GENERIC_WRITE,
                    0,
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes

}

void sd_write(uint32_t adress, void *p_src)
{
  uint32_t nByteswritten;
  
  SetFilePointer(hDevice, adress, NULL, FILE_BEGIN);
  WriteFile(hDevice, p_src, 512, &nByteswritten, NULL);
}

void sd_read (uint32_t adress, void *p_dst)
{
  uint32_t nBytesread;
  
  SetFilePointer(hDevice, adress, NULL, FILE_BEGIN);
  ReadFile(hDevice, p_dst, 512, &nBytesread, NULL);

}

Allerdings alles etwas Quick and Dirty. Und bei CreateFile natürlich den 
Laufwerksbuchstaben der SD Karte angeben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.