2017-05-31 7 views
0

J'ai essayé de lire la chaîne écrite dans un fichier .txt et de l'imprimer sur la console. Mais il semble que je ne le fais pas correctement. Quelqu'un peut-il revoir mes codes et me dire ce qui ne va pas? Merci!masm32 Fonction ReadFile x86 -Windows

include \masm32\include\masm32rt.inc 

.data 
    txtFilter db "*.txt",0 

    txtFD WIN32_FIND_DATA <> 
    txtHandle HANDLE ? 
    fHandle HANDLE ? 

    bufferLength db ? 
    buffer db 5000 dup(?) 
    lnt db "1024",0 

    okay db "Okay!",0 
    dokay db "Dokay!",0 

.code 
start: 
    push offset txtFD 
    push offset txtFilter 
    call FindFirstFile 

    mov txtHandle, eax 

    push offset txtFD.cFileName 
    call StdOut 

    push 0 
    push FILE_ATTRIBUTE_NORMAL 
    push OPEN_EXISTING 
    push 0 
    push 0 
    push FILE_APPEND_DATA 
    push offset txtFD.cFileName 
    call CreateFile 

    .if eax == INVALID_HANDLE_VALUE 
    jmp _error 
    .else 
    mov fHandle, eax 
    .endif 

    push 0 
    push offset bufferLength 
    push offset lnt 
    push offset buffer 
    push fHandle 
    call ReadFile 

    jmp _next 

_error: 
    push offset dokay 
    call StdOut 
    jmp _next 

_okay: 
    push offset okay 
    call StdOut 

_next: 
    push offset buffer 
    call StdOut 

    push fHandle 
    call CloseHandle 

    push txtHandle 
    call FindClose 

    push 0 
    call ExitProcess 

end start 

Le code ne semble pas lire ce qui se trouve dans mon fichier txt. Cependant, je peux rechercher avec succès mon fichier txt et exécuter la fonction CreateFile

+0

Lorsque vous appelez ReadFile vous poussiez 'décalage lnt' plutôt que' lnt'. L'argument 'nNumberOfBytesToRead' est transmis par valeur, pas par adresse. –

+1

aussi je doute que vous devez fournir la longueur «lnt» comme chaîne ASCII. j'essaierais plutôt 'lnt dd 1024' – Tommylee2k

Répondre

1

Quatre questions:

  • bufferLength db ? réserves un seul octet. ReadFile va y stocker un DWORD et écraser trois octets de buffer. S'il y a une valeur NULL, StdOut arrêtera la sortie. Modifier la définition en bufferLength dd ?

  • lnt db "1024",0 est une chaîne. ReadFile attend une valeur DWORD. Changez-le en lnt dd 1024.

  • push FILE_APPEND_DATA crée un handle uniquement pour l'écriture. Changez-le en push GENERIC_READ.

  • push offset lnt passe un pointeur. Cependant, ReadFile attend une valeur DWORD. Changez-le en push lnt.

Comme ça:

include \masm32\include\masm32rt.inc 

.data 
    txtFilter db "*.txt",0 

    txtFD WIN32_FIND_DATA <> 
    txtHandle HANDLE ? 
    fHandle HANDLE ? 

; bufferLength db ? 
    bufferLength dd ? 
    buffer db 5000 dup(?) 
; lnt db "1024",0 
    lnt dd 1024 

    okay db "Okay!",0 
    dokay db "Dokay!",0 

.code 
start: 
    push offset txtFD 
    push offset txtFilter 
    call FindFirstFile 

    mov txtHandle, eax 

    push offset txtFD.cFileName 
    call StdOut 

    ; https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx 
    push 0       ; HANDLE hTemplateFile 
    push FILE_ATTRIBUTE_NORMAL  ; DWORD  dwFlagsAndAttributes 
    push OPEN_EXISTING    ; DWORD  dwCreationDisposition 
    push 0       ; LPSECURITY_ATTRIBUTES lpSecurityAttributes 
    push 0       ; DWORD  dwShareMode 
; push FILE_APPEND_DATA   ; DWORD  dwDesiredAccess 
    push GENERIC_READ    ; DWORD  dwDesiredAccess 
    push offset txtFD.cFileName  ; LPCTSTR lpFileName, 
    call CreateFile 

    .if eax == INVALID_HANDLE_VALUE 
     jmp _error 
    .else 
     mov fHandle, eax 
    .endif 

    ; https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx 
    push 0       ; LPOVERLAPPED lpOverlapped 
    push offset bufferLength  ; LPDWORD lpNumberOfBytesRead 
; push offset lnt     ; DWORD  nNumberOfBytesToRead 
    push lnt      ; DWORD  nNumberOfBytesToRead 
    push offset buffer    ; LPVOID lpBuffer 
    push fHandle     ; HANDLE hFile 
    call ReadFile 

    jmp _next 

_error: 
    push offset dokay 
    call StdOut 
    jmp _next 

_okay: 
    push offset okay 
    call StdOut 

_next: 
    push offset buffer 
    call StdOut 

    push fHandle 
    call CloseHandle 

    push txtHandle 
    call FindClose 

    push 0 
    call ExitProcess 

end st