DateiStream mit Assembler unter WIN NT(XP)



  • 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...


  • Mod

    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 start
    

    Eigentlich 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     Write
    

    als 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 Exit
    

    Was 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.0

    Vlt hilft Dir das ja weiter, greeetz



  • Super!!!!!!!!!
    Das hat geholfen:-)

    Danke für deine Antwort und alle anderen natürlich auch;-)


Anmelden zum Antworten