在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
相关产品推荐
相关产品推荐

