因此我尝试使用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但是当我打开它时,它是空白的。
答案 0 :(得分:2)
您拨打WriteFile
时出现错误:
push offset pMemory <-- The offset operator shouldn't be used here
push hFile
call WriteFile
另外,请勿使用GENERIC_ALL
。使用您需要的最少访问权限,例如GENERIC_WRITE
或GENERIC_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
。