从汇编语言的 txt 文件传输文本
Transfering Text from a txt file on Assembly language
所以我正在尝试使用 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 但是当我打开它时,它是空白的。
您对 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
。谷歌搜索 "getlasterror codes" 得到 this page,我们发现 5
表示 ERROR_ACCESS_DENIED
.
所以我正在尝试使用 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 但是当我打开它时,它是空白的。
您对 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
。谷歌搜索 "getlasterror codes" 得到 this page,我们发现 5
表示 ERROR_ACCESS_DENIED
.