我在MASM64(ML64.exe)中编写小应用程序。其中一个功能是在注册表中设置值。我开始打开密钥但是有错误。
函数RegOpenKeyEx返回错误87,GetLastError返回0x36B7。
我的代码:
var worker = new Worker('myWorker');
worker.postMessage('hello');
worker.onmessage = function(msg) {
console.log('answer from worker',msg.data);
}
请帮帮我。在此先感谢您的帮助。
答案 0 :(得分:1)
你错误地使用堆栈操作。你的主要错误 - push rax
你真的在这里设置的不是第5个参数,而是什么都没有。和第5个参数是堆栈中的随机值。正确设置第5个参数 - mov [rsp+20h],rax
。看看堆栈对齐,GetLastError与此无关 - Reg *函数返回错误代码yorself但不设置lasterror。并且不为hReg使用全局变量,而是在堆栈中分配它。考试可以看起来像这样:
extrn ExitProcess : proc
extrn MessageBoxA : proc
extrn RegOpenKeyExA : proc
extrn RegSetValueExA : proc
extrn RegCloseKey : 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
szRegKeyName db "Software\Microsoft\Windows\CurrentVersion\Run",0
.code
hReg equ 28h
test proc
sub rsp, 38h
lea rax,[rsp+hReg]
mov [rsp+20h],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
test eax,eax
jnz @@1
mov rcx,[rsp+hReg]
call RegCloseKey
@@1:
add rsp, 38h
ret
test endp
end