Lowlevel
OffZone => Offtopic => Thema gestartet 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
-
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 ;)
-
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.
-
Zum Beschreiben wäre GENERIC_WRITE auch ganz sinnvoll. :wink:
-
Zum Beschreiben wäre GENERIC_WRITE auch ganz sinnvoll. :wink:
Ach wassss.... Die Daten werden einfach auf die Diskette gelesen! :-D
-
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.
-
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.
-
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:
-
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.
-
Probiers doch einfach aus :wink:
(Bei Disketten ist es ja nicht so schlimm, wenn du was kaputt machst)
-
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.
-
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.
-
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.
-
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 ?.
-
Ich würde mal versuchen, in ganzen Sektoren, also Vielfachen von 512 Bytes zu schreiben. :wink:
-
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);
?
-
&dwBytesWritten sieht falsch aus...
Ungeachtet dessen, dass die ungarische Notation saugt ;-)
-
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.
-
Ich würde mal versuchen, in ganzen Sektoren, also Vielfachen von 512 Bytes zu schreiben.
Danke, so hats funktioniert.