RegOpenKeyEx returns MASM64 中的错误 87

RegOpenKeyEx returns error 87 in MASM64

我正在用 MASM64 (ML64.exe) 编写小型应用程序。其中一项功能是在注册表中设置值。我开始打开钥匙,但出现错误。

函数 RegOpenKeyEx returns 错误 87,和 GetLastError returns 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

请帮帮我。在此先感谢您的帮助。

你对栈的操作不正确。您的主要错误 - push rax 实际上您在这里设置的不是第 5 个参数,而是什么都没有。第 5 个参数是堆栈中的随机值。正确设置第 5 个参数 - mov [rsp+20h],rax 。在堆栈对齐和此处不相关的 GetLastError 上查看更多 - Reg* 函数 return 错误代码自己但不设置 lasterror。并且不为 hReg 使用全局变量,而是在堆栈中分配它。 examle 可能如下所示:

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