You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NASM x64汇编中调用CreateWindowExW遇参数异常求助

x64 NASM汇编调用CreateWindowExW参数错误的修复方案

以下是代码中存在的问题及对应的修复方法:

1. 函数名笔误

代码中调用了CreateWindowExW2,但声明的外部函数是CreateWindowExW,这会导致链接错误或调用错误地址,直接修改函数名即可:

call CreateWindowExW  ; 替换原有的call CreateWindowExW2

2. 栈空间分配不足(违反x64调用约定)

x64 Windows调用约定要求:

  • 调用者必须为被调用者预留32字节的阴影空间
  • 超过4个的参数需按顺序放在阴影空间之后,每个参数占8字节(栈按16字节对齐)

CreateWindowExW共有12个参数,前4个用寄存器传递,剩余8个参数共需8*8=64字节,加上32字节阴影空间,总共需要分配32+64=96字节栈空间,原代码中sub rsp, 80分配的空间不足,导致栈对齐错误,修改为:

sub rsp, 96  ; 替换原有的sub rsp, 80

调用完成后释放栈空间也要对应修改:

add rsp, 96  ; 替换原有的add rsp, 80

修正后的CreateWindowExW调用代码片段

; CreateWindowExW
        sub rsp, 96
        xor ecx, ecx                    ; No extended styles
        mov rdx, qword [r12 + WNDCLASSEXW.lpszClassName]
        lea r8, [rel windowName]        ; Window name
        mov r9, WS_OVERLAPPEDWINDOW     ; Generic window style
        mov r13, CW_USEDEFAULT          ; CW_USEDEFAULT for X, Y, nWidth, nHeight
        mov qword [rsp + 32 + 0], r13   ; X
        mov qword [rsp + 32 + 8], r13   ; Y
        mov qword [rsp + 32 + 16], r13  ; nWidth
        mov qword [rsp + 32 + 24], r13  ; nHeight
        mov qword [rsp + 32 + 32], rcx  ; hWndParent
        mov qword [rsp + 32 + 40], rcx  ; hMenu
        mov r13, qword [r12 + WNDCLASSEXW.hInstance]
        mov qword [rsp + 32 + 48], r13  ; hInstance
        mov qword [rsp + 32 + 56], rcx  ; lpParam
        call CreateWindowExW
        add rsp, 96

额外检查点

  • 确保className和windowName是正确的宽字符串(以0x0000结尾)
  • 确认WindowProcedure实现符合窗口过程的回调约定(x64下参数传递为RCX: hWnd, RDX: uMsg, R8: wParam, R9: lParam)

内容的提问来源于stack exchange,提问作者mobslicer152

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:47:03