【发布时间】:2018-05-06 04:23:48
【问题描述】:
我正在汇编中编写服务。 当我调用 StartServiceCtrlDispatcher 时,我收到错误代码:3221225477 (C0000005h),我认为这是访问冲突异常。
空表没有错误,所有表指针都经过测试。
所以我在想,也许这与 WINAPI / sdtcall 调用约定有关。
调用有 2 个参数,所以在我的例子中它们是四字,总共 16 个字节。我关闭了堆栈帧并清除了 ret 上的 16 个字节,但仍然存在访问冲突。
我已经在互联网上搜索了可能的原因,尝试了加载并花费了数小时但没有成功。我希望有人能读到这篇文章并知道答案。
也许我没有正确理解 stdcall 约定?
请查看我的测试代码,我期待您的建议。谢谢你:)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.data
szName db "MyTestService",0
service_table dq QWORD PTR [szName]
dq QWORD PTR [myServiceMain]
dq 0,0
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.code
myServiceStart PROC
mov rax,rv(StartServiceCtrlDispatcher,service_table)
ret
myServiceStart ENDP
NOSTACKFRAME
myServiceMain PROC
ret 16
myServiceMain ENDP
STACKFRAME
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end
【问题讨论】: