Lowlevel

OffZone => Offtopic => Thema gestartet von: bscreator am 24. November 2009, 19:03

Titel: RawWrite neu erfinden
Beitrag von: bscreator 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
Titel: Re: RawWrite neu erfinden
Beitrag von: stultus 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 ;)
Titel: Re: RawWrite neu erfinden
Beitrag von: Cjreek am 24. November 2009, 20:04
CreateFile (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx), WriteFile (http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx), CloseHandle (http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx) 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: XanClic am 24. November 2009, 21:21
Zum Beschreiben wäre GENERIC_WRITE auch ganz sinnvoll. :wink:
Titel: Re: RawWrite neu erfinden
Beitrag von: Cjreek 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
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: MNemo 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: XanClic 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:
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: XanClic am 26. November 2009, 20:54
Probiers doch einfach aus :wink:

(Bei Disketten ist es ja nicht so schlimm, wenn du was kaputt machst)
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: XanClic 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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 ?.
Titel: Re: RawWrite neu erfinden
Beitrag von: XanClic am 27. November 2009, 15:59
Ich würde mal versuchen, in ganzen Sektoren, also Vielfachen von 512 Bytes zu schreiben. :wink:
Titel: Re: RawWrite neu erfinden
Beitrag von: Cjreek 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);
?
Titel: Re: RawWrite neu erfinden
Beitrag von: DerHartmut am 27. November 2009, 18:55
&dwBytesWritten sieht falsch aus...

Ungeachtet dessen, dass die ungarische Notation saugt ;-)
Titel: Re: RawWrite neu erfinden
Beitrag von: Jidder 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.
Titel: Re: RawWrite neu erfinden
Beitrag von: bscreator 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.