Visual Studio 2022中MASM调用WinExec返回0,命令无法执行
WinExec调用返回0问题的排查与解决
1. 修正参数传递逻辑
x64 MASM环境下遵循fastcall调用约定,WinExec的两个参数必须按以下方式传递:
- 第一个参数(命令行字符串指针)存入
RCX - 第二个参数(窗口显示模式,如
SW_SHOW=5)存入RDX
同时必须保证命令行字符串是ASCII编码且以0结尾,MASM定义时需显式添加终止符:
.data cmd db "notepad.exe", 0 ; 正确的ASCII终止字符串 SW_SHOW equ 5 ; 窗口显示参数 .code main proc ; 假设已通过LoadLibraryA+GetProcAddress获取WinExec地址到winExecAddr mov rcx, offset cmd mov rdx, SW_SHOW call qword ptr [winExecAddr] ; WinExec返回值>31表示成功,0则失败 main endp
2. 检查命令行格式
- 若命令包含空格/特殊路径,需用引号包裹,汇编中双引号需转义:
cmd db "\"C:\Program Files\Notepad++\notepad++.exe\"", 0 - 避免遗漏字符串终止符,这会导致API读取到无效内存,返回0。
3. 获取具体错误码定位问题
WinExec返回0时,调用GetLastError(同样从Kernel32.dll获取地址)可拿到错误码:
call qword ptr [winExecAddr] test eax, eax jz get_err ; 成功分支逻辑 jmp exit_proc get_err: call qword ptr [getLastErrorAddr] ; eax中存储错误码,常见值: ; 2 = 文件不存在 | 5 = 权限不足 | 11 = 程序格式不匹配(32/64位不兼容) exit_proc:
4. 匹配项目与目标程序位数
- 若汇编项目是x64,确保要执行的程序是64位;x86项目则对应32位程序,否则会返回
ERROR_BAD_FORMAT(11)。 - x86环境下调用约定为cdecl,参数需从右到左压栈:
push SW_SHOW push offset cmd call dword ptr [winExecAddr]
内容的提问来源于stack exchange,提问作者ihateassembly
相关产品推荐
相关产品推荐

