FASM 64位模式调用winmm.dll触发0xc0000005异常问题排查
问题原因
错误码0xc0000005是内存访问违规,核心原因是64位Windows调用约定的栈对齐要求未被满足:
- x64 Windows强制规定,调用任何遵循标准约定的系统函数前,栈指针
RSP必须保持16字节对齐——很多系统函数内部会依赖movdqa这类只能在16字节对齐内存上执行的SIMD指令。 - 系统启动64位PE程序并调用入口点
start时,会先向栈中压入一个8字节的返回地址,导致此时RSP的偏移量为8字节,破坏了16字节对齐状态。 - 你的代码直接在入口点调用
mixerGetNumDevs,未修正栈对齐问题,触发了函数内部的内存访问违规。
32位Windows没有强制16字节栈对齐的要求,因此32位版本的程序可以正常运行。
修复方法
在入口点调用任何函数前,先调整RSP到16字节对齐状态,同时预留x64调用约定要求的32字节影子空间(供被调用函数使用):
format PE64 GUI 5.0 entry start include 'win64a.inc' section '.code' code readable executable start: sub rsp, 40 ; 8字节对齐调整 + 32字节影子空间,合计40字节 invoke mixerGetNumDevs invoke ExitProcess section '.idata' import data readable library kernel, 'kernel32.dll', wmm, 'winmm.dll' import kernel, ExitProcess, 'ExitProcess' import wmm, mixerGetNumDevs, 'mixerGetNumDevs'
内容的提问来源于stack exchange,提问作者Memnon
相关产品推荐
相关产品推荐

