从汇编语言的txt文件传输文本

时间:2016-08-23 13:32:41

标签: assembly masm masm32

因此我尝试使用masm学习汇编语言并进行一些练习编码,并且想知道我的代码有什么问题

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib

.DATA
FileNameFrom db "file1.txt",0
FileNameTo db "file2.txt", 0

.DATA?
hFile HANDLE ?
hFile2 HANDLE ?
BWritten db ?
hMemory HANDLE ?
pMemory DWORD ?
SizeReadWrite DWORD ?
newfiletext dd ?

.CONST
MEMSIZE equ 65535

 .CODE
start: 

;-------;                                                       CREATE/OPEN
    push NULL
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push NULL
    push 0
    push GENERIC_READ
    push offset FileNameFrom
    call CreateFile
;-------;
;or ~ invoke CreateFile,addr FileName,GENERIC_READ,0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    mov hFile, eax


    invoke GlobalAlloc, GMEM_MOVEABLE OR GMEM_ZEROINIT, MEMSIZE
    mov hMemory, eax
    invoke GlobalLock, hMemory
    mov pMemory, eax


;-------;                                                           READ
    push NULL
    push offset SizeReadWrite
    push MEMSIZE-1
    push pMemory
    push hFile
    call ReadFile
;-------;;;or ~ invoke ReadFile,hFile,pMemory, MEMSIZE-1,ADDR SizeReadWrite,NULL 



    push NULL
    push hFile
    call GetFileSize
    mov newfiletext, eax

    invoke CloseHandle, hFile
                                                                 ; WRITE


    push NULL
    push FILE_ATTRIBUTE_NORMAL
    push CREATE_ALWAYS
    push NULL
    push 0
    push GENERIC_ALL
    push offset FileNameTo
    call CreateFile
    mov hFile, eax


    push 0
    push offset BWritten
    push newfiletext     
    push offset pMemory 
    push hFile
    call WriteFile    


    invoke GlobalUnlock, pMemory
    invoke GlobalFree, hMemory
    invoke CloseHandle, hFile

end start

我想要做的是打开现有文件(file1)然后读取内容,创建另一个文件(file2),然后将文本从file1复制到file2。我能够创建file2.txt但是当我打开它时,它是空白的。

1 个答案:

答案 0 :(得分:2)

您拨打WriteFile时出现错误:

push offset pMemory   <-- The offset operator shouldn't be used here
push hFile
call WriteFile    

另外,请勿使用GENERIC_ALL。使用您需要的最少访问权限,例如GENERIC_WRITEGENERIC_READ OR GENERIC_WRITE。使用GENERIC_ALL时,您可能会要求访问当前用户没有权限。

让我们为您的代码添加一些错误检查:

include \masm32\include\msvcrt.inc
includelib  \masm32\lib\msvcrt.lib

...

szErrMsg db "GetLastError: %x",13,10,0

...
push GENERIC_ALL
push offset FileNameTo
call CreateFileA
mov hFile, eax

cmp eax,INVALID_HANDLE_VALUE
jne open_ok
invoke GetLastError
invoke crt_printf,addr szErrMsg,eax
open_ok:

现在运行程序会在控制台中输出GetLastError: 5。谷歌搜索&#34; getlasterror代码&#34; 会产生this page,我们发现5表示ERROR_ACCESS_DENIED