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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:25:14