DateiStream mit Assembler unter WIN NT(XP)
-
Hallo,
wie schon der Titel sagt möchte ich gerne mit einer Art Stream in eine Datei schreiben. Also Datei erstellen und so Funktioniert und Hinein schreiben auch schon. Das alles mit den Funktionen aus der Win API32 CreateFile und WriteFile.
Wie kann ich mir aber eine Art Stream schaffen? Gibt es da eine Funktion in der API für oder eine andere Möglichkeit?
-
Worum genau geht es hier, bzw. was hat das mit Assembler zu tun?
"Stream" ist ein recht abstrakter Begriff, bzw. Konstrukt (in C++ Klassen).
Willst du eine C++ (Stream-)Klasse in Assembler implementieren? Oder hast du Fragen zur Verwendung von WinAPI-Funktionen in Assembler?
Fuer alles andere waere dein Thema woanders besser aufgehoben (zB. im WinAPI-Forum).
-
Hi,
ja es geht schon um Assembler. Rufe die API Funktionen mit invoke auf..Obwohl.vielleicht hast du recht und es gehört wirklich ins API Forum. Also ich suche einfach nur eine Funktion mit der ich in eine Datei schreiben kann. Aber nicht irgendwie sondern ich möchte immer text hinten dran hängen!
-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum Assembler in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dann oeffne die Datei doch einfach, gehe mit SetFilePointer ans Ende und schreibe normal mit WriteFile rein. Sehe da irgendwie nicht die Schwierigkeit...
-
Jede Datei die in Windows erzeugt wird ist ein "Daten-Stream"... :xmas1:
-
.586 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\shlwapi.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\shlwapi.lib ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .data Datei db "kernel32.dll",0 Daten db "QWERTZUIOPÜSDFGHJKLÖÄYXCVBNM",0 MSGCaption db "Information",0 MSGCreate db "Die Datei konnte nicht erstellt werden",0 MSGWrite db "Die Datei konnte nicht befüllt werden",0 MSGErstellt db "Die Datei wurde erstellt. Befüllung läuft....",0 MSGEnde db "Die Datei wurde gefüllt",0 MSGZeiger db "Der Zeiger konnte nicht bewegt werden",0 ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .data? Bytes db ? Handle dd ? Pointer dd ? Point dd ? ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .code start: xor eax, eax xor ebx, ebx invoke CreateFile, addr Datei, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je NotCreate mov Handle, eax invoke MessageBox, NULL, addr MSGErstellt, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Write: call SetFilePos invoke MessageBox, NULL, addr Point, addr MSGCaption, MB_OK invoke WriteFile, Handle, addr Daten, 28, addr Bytes, NULL cmp eax, 0 jz NotWrite inc ebx cmp ebx, 3 jne Write invoke MessageBox, NULL, addr MSGEnde, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Exit: invoke CloseHandle, Handle invoke ExitProcess, NULL ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NotCreate: invoke MessageBox, NULL, addr MSGCreate, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NotWrite: invoke MessageBox, NULL, addr MSGWrite, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NoPointer: invoke MessageBox, NULL, addr MSGZeiger, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SetFilePos: invoke SetFilePointer, Handle, 0, Point, FILE_END cmp eax, INVALID_SET_FILE_POINTER je NoPointer mov Pointer, eax ret ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- end startEigentlich sollte ih damit an das Ende einer Datei schreiben können. Also wenn man sich den Sprung zum SetFilePos wegdenkt. Aber bei der 2 Runde(von 3) gibt der mir eine Exeption. Wieso?
Und das mit dem SetFilePointer funktioniert auch nicht so ganz. Folgendes habe ich vor:Der string soll 3 mal hintereinander in eine Datei geschrieben werden OHNE den Text zu überschreiben. Also quasi append. Aber das will nicht so wie ich es gerne hätte.
Dann habe ich es mit SetFilePoint versucht(den Code stimmt nicht mit dem getesteten Code überein) aber wenn ich den Zeiger ans Ende setzen will bekomme ich einen Fehler:-(
-
Korriiert (funktioniert aber immer noch nicht)
.586 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\shlwapi.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\shlwapi.lib ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .data Datei db "kernel32.dll",0 Daten db "QWERTZUIOPÜSDFGHJKLÖÄYXCVBNM",0 MSGCaption db "Information",0 MSGCreate db "Die Datei konnte nicht erstellt werden",0 MSGWrite db "Die Datei konnte nicht befüllt werden",0 MSGErstellt db "Die Datei wurde erstellt. Befüllung läuft....",0 MSGEnde db "Die Datei wurde gefüllt",0 MSGZeiger db "Der Zeiger konnte nicht bewegt werden",0 ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .data? Bytes db ? Handle dd ? Pointer dd ? Point dd ? ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .code start: xor eax, eax xor ebx, ebx invoke CreateFile, addr Datei, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je NotCreate mov Handle, eax invoke MessageBox, NULL, addr MSGErstellt, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Write: ;call SetFilePos ;invoke MessageBox, NULL, addr Point, addr MSGCaption, MB_OK invoke WriteFile, Handle, addr Daten, 28, addr Bytes, NULL cmp eax, 0 jne NotWrite inc ebx cmp ebx, 3 jne Write invoke MessageBox, NULL, addr MSGEnde, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Exit: invoke CloseHandle, Handle invoke ExitProcess, NULL ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NotCreate: invoke MessageBox, NULL, addr MSGCreate, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NotWrite: invoke MessageBox, NULL, addr MSGWrite, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NoPointer: invoke MessageBox, NULL, addr MSGZeiger, addr MSGCaption, MB_OK jmp Exit ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SetFilePos: invoke SetFilePointer, Handle, 0, Point, FILE_END cmp eax, INVALID_SET_FILE_POINTER je NoPointer mov Pointer, eax ret ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- end start
-
Hi,
ich kenne mich mit 586 asm leider net so aus, aber den pointer aufs ende der Datei also praktisch auf EOF zu setzen war noch nie eine gute idee, probier es doch mal mit EOF-1,cmp eax, 0 jne NotWrite inc ebx cmp ebx, 3 jne Writeals Counter ungeignet wenn es nicht die gleichen register sind

mov ebx,3 ... counter: tst ebx //test if zero brne Write_string //brunch if not equal, return after finish dec ebx //decrement ebx jmp counter //jump to label counter Exit:Vielleicht konnte ich Dir helfen

-
also daran wird es irgendwie nicht gelegen haben. haben den code mal ein bisschen umgebaut:
.data? Bytes db ? Handle dd ? Pointer dd ? ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .code start: xor eax, eax xor ebx, ebx invoke CreateFile, addr Datei, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax, INVALID_HANDLE_VALUE je NotCreate mov Handle, eax invoke MessageBox, NULL, addr MSGErstellt, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Write: invoke WriteFile, Handle, addr Daten, 28, addr Bytes, NULL cmp eax, 0 jz NotWrite invoke SetFilePointer, Handle, 0, 0, FILE_END inc ebx cmp ebx, 3 jne Write invoke MessageBox, NULL, addr MSGEnde, addr MSGCaption, MB_OK ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Exit: invoke CloseHandle, Handle invoke ExitProcess, NULL ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NotCreate: invoke MessageBox, NULL, addr MSGCreate, addr MSGCaption, MB_OK jmp ExitWas mir aber aufgefallen ist, ist folgendes. wenn ich das im debugger laufen lasse pusht der bei der 2 Runde nicht mehr den Handle der datei für die Func SetFilePointer auf den Stack sondern 0.
-
Der typische Rückgabewert in form des Handles besagt doch normalerweise das alles glatt gelaufen ist, ist der Rückgabewert 0 so ist meist ein Fehler aufgetreten. In diesem Fall schätze ich mal das es sich um einen Zugriffsfehler handelt, ruf mal GetLastError + MsgBox danach auf, unter
http://msdn.microsoft.com/en-us/library/ms681381.aspx
findest Du dann die Fehlerbeschreibung.Hier habe ich noch ein schööönes Beispiel für file io in masm32 für Dich
http://www.masm32.com/board/index.php?topic=2389.0Vlt hilft Dir das ja weiter, greeetz
-
Super!!!!!!!!!
Das hat geholfen:-)Danke für deine Antwort und alle anderen natürlich auch;-)