Autor Thema: RawWrite neu erfinden  (Gelesen 7845 mal)

bscreator

  • Gast
Gespeichert
« am: 24. November 2009, 19:03 »
Hallo,
da ich nicht immer auf gegebene Software zurückgreifen möchte, sondern lieber immer wieder das "Rad neu erfinden" möchte, bin ich dabei, ein kleines C-Programm zu schreiben, welches eine Datei in den ersten Sektor einer Diskette schreibt.

Da gibt es jedoch ein Problem :
Wie, bzw. mit welchen Funktionen, kann ich den ersten Sektor einer Floppy unter Windows beschreiben ?
Brauch ich dafür irgendwelche Windows-API-Funktionen oder gibt es auch andere Möglichkeiten ?

Vielen Dank,
bsc

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. November 2009, 19:10 »
Achtung, Ungeprüftes Halbwissen ;)

Afaik musst du halt nur das Gerät an sich öffnen. Gerätepfade beginnen unter Win mit \\, Für Floppy A müsstest du \\.\a: öffnen (evtl. auch ohne den Doppelpunkt). Der ganze Spaß wird allerdings Adminrechte erfordern ;)
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. November 2009, 20:04 »
CreateFile, WriteFile, CloseHandle sind die Funktionen die du suchst

Versuch evtl mal sowas:

CreateFile('\\.\a:',GENERIC_READ,FILE_SHARE_WRITE or FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
Hab grad kein Diskettenlaufwerk, aber bei meiner C: Partition funktioniert es.
« Letzte Änderung: 24. November 2009, 20:14 von Cjreek »
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 24. November 2009, 21:21 »
Zum Beschreiben wäre GENERIC_WRITE auch ganz sinnvoll. :wink:

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. November 2009, 21:31 »
Zum Beschreiben wäre GENERIC_WRITE auch ganz sinnvoll. :wink:

Ach wassss.... Die Daten werden einfach auf die Diskette gelesen!  :-D
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

bscreator

  • Gast
Gespeichert
« Antwort #5 am: 25. November 2009, 13:02 »
Vielen Dank, aber...
...ich glaub da habt ihr mich falsch verstanden.
Die Daten sollen ja nicht auf irgendeine freie Stelle auf der Diskette geschrieben werden, sondern in den ersten Sektor der Diskette, den sog. Bootsektor.

Und bei den Funktionen CreateFile, CreateFileEx hab ich mal keinen speziellen Parameter für den Sektor gesehen.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 25. November 2009, 13:22 »
ich habe zwar keine Ahnung von Windows, aber es gibt sicherlich ein
seek(file, offset);mit dem du steuern kannst wo deine Daten landen sollen.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #7 am: 25. November 2009, 15:43 »
Wir haben dich richtig verstanden. Du öffnest die Datei \\.\A: wie beschrieben. Der Zeiger innerhalb der Datei liegt dann bei 0. Wenn du dann 512 Bytes schreibst, schreibst du also damit den Bootsektor. :wink:

btw: Ein Sektor sind 512 Bytes, deshalb kommt man auch ohne Angabe von Sektoren aus. :wink:

bscreator

  • Gast
Gespeichert
« Antwort #8 am: 26. November 2009, 20:47 »
Hallo,
hab mir mal das File durchgelesen aber da brauch ich noch eure Hilfe:

HANDLE WINAPI CreateFile(
  __in      LPCTSTR lpFileName,
  __in      DWORD dwDesiredAccess,
  __in      DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in      DWORD dwCreationDisposition,
  __in      DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);

Wie krieg ich eigentlich einen String, also den Dateinamen, in den Datentyp LPCTSTR ? Habs mit scanf und cin versucht, aber kein Erfolg.
« Letzte Änderung: 26. November 2009, 21:05 von bscreator »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #9 am: 26. November 2009, 20:54 »
Probiers doch einfach aus :wink:

(Bei Disketten ist es ja nicht so schlimm, wenn du was kaputt machst)

bscreator

  • Gast
Gespeichert
« Antwort #10 am: 26. November 2009, 21:07 »
Hallo,
hab mir mal das File durchgelesen aber da brauch ich noch eure Hilfe:


HANDLE WINAPI CreateFile(
  __in      LPCTSTR lpFileName,
  __in      DWORD dwDesiredAccess,
  __in      DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in      DWORD dwCreationDisposition,
  __in      DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);

Wie krieg ich eigentlich einen String, also den Dateinamen, in den Datentyp LPCTSTR ? Habs mit scanf und cin versucht, aber kein Erfolg.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #11 am: 26. November 2009, 21:16 »
Ja, die WinAPI und ihre tollen Datentypen. :-D

Das ist einfach ein Pointer auf ein Stringarray. Also bei C einfach einen String eintragen (char *).


LPCTSTR wird wohl für "Long Pointer to ConsTant STRing" stehen, nehme ich an.

bscreator

  • Gast
Gespeichert
« Antwort #12 am: 27. November 2009, 09:59 »
Hallo,
hab jetzt mal versucht, mit ansi C die Datei zu öffnen.
strcpy(filename,"\\\\.\\A:");
fp = fopen(filename, "r");

Das witzige ist, beim Lesen (r) liefert fp einen gültigen Filepointer zurück, bei anderen Modi (w,a,r+,a+,w+) liefert fp keinen gültigen Filepointer zurück.

bscreator

  • Gast
Gespeichert
« Antwort #13 am: 27. November 2009, 13:32 »
Hallo,
habs jetzt mal so ausprobiert :

wchar_t *myFile = L"\\\\.\\a:";
HANDLE hFile;
char DataBuffer[] = "This is some test data to write to the file.";
DWORD dwBytesToWrite = 10;
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;

hFile = CreateFile(myFile,GENERIC_ALL,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
printf("Error");
}


bErrorFlag = WriteFile(hFile,DataBuffer,dwBytesToWrite,&dwBytesWritten,NULL);
if (FALSE == bErrorFlag)
{
printf("Error");
}

CreateFile funktioniert, aber die Funktion WriteFile liefert immer 0 (für Fehler) zurück.

Habt ihr ne Ahnung, wo der Fehler liegt ?.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #14 am: 27. November 2009, 15:59 »
Ich würde mal versuchen, in ganzen Sektoren, also Vielfachen von 512 Bytes zu schreiben. :wink:

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 27. November 2009, 18:00 »
Hi,

Also ich denke du solltest noch FILE_SHARE_READ hinzufügen...

Ich würde CreateFile so aufrufen:

CreateFile(myFile,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_WRITE or FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Wegen WriteFile... Hab von C nicht viel Ahnung aber was passiert wenn du WriteFile so aufrufst:

WriteFile(hFile,&DataBuffer[0],dwBytesToWrite,&dwBytesWritten,NULL);
?
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #16 am: 27. November 2009, 18:55 »
&dwBytesWritten sieht falsch aus...

Ungeachtet dessen, dass die ungarische Notation saugt ;-)
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 27. November 2009, 19:20 »
Lass dir von DerHartmut nichts erzählen. ;)

CreateFile funktioniert, aber die Funktion WriteFile liefert immer 0 (für Fehler) zurück.

Habt ihr ne Ahnung, wo der Fehler liegt ?.
Schau dir mal den Rückgabewert von GetLastError() an.
« Letzte Änderung: 27. November 2009, 19:22 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #18 am: 29. November 2009, 20:30 »
Zitat
Ich würde mal versuchen, in ganzen Sektoren, also Vielfachen von 512 Bytes zu schreiben.

Danke, so hats funktioniert.

 

Einloggen