【发布时间】:2016-11-06 12:47:09
【问题描述】:
我正在用 MASM64 (ML64.exe) 编写小型应用程序。其中一项功能是在注册表中设置值。我开始打开钥匙,但有一个错误。
函数 RegOpenKeyEx 返回错误 87,GetLastError 返回 0x36B7。
我的代码:
extrn ExitProcess : proc
extrn MessageBoxA : proc
extrn RegOpenKeyExA : proc
extrn RegSetValueExA : proc
extrn RegCloseKey : proc
extrn GetLastError : proc
.const
HKEY_CURRENT_USER equ 80000001h
KEY_SET_VALUE equ 2
KEY_CREATE_SUB_KEY equ 4
KEY_WOW64_64KEY equ 0100h
KEY_WRITE equ 00020006h
REG_SZ equ 00000001h
.data
hReg dq 0
szRegKeyName db "Software\Microsoft\Windows\CurrentVersion\Run",0
.code
Main proc
sub rsp, 30h
lea rax, hReg
push rax
mov r9, KEY_SET_VALUE+KEY_CREATE_SUB_KEY+KEY_WOW64_64KEY
mov r8, 0
lea rdx, szRegKeyName
mov rcx, HKEY_CURRENT_USER
call RegOpenKeyExA ;returns 87
call GetLastError ;returns 0x36B7
add rsp, 30h
xor rcx, rcx
call ExitProcess
Main endp
end
请帮助我。提前感谢您的帮助。
【问题讨论】:
-
你没有正确使用x64 abi,你不能忽略影子空间。先用C写这段代码,看看编译器生成的机器码。
-
除此之外,调用 GetLastError 是没有意义的。返回值是错误代码。阅读文档。
-
@HansPassant 那么如何修复此代码?你知道哪里错了吗?
-
您还忘记了 pdata 部分中的unwind codes。