assembly - Windows 服务是程序集 - StartServiceCtrlDispatcher 错误 3221225477
问题描述
我正在汇编中编写服务。当我调用 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
解决方案
已解决问题是表的值在它应该是指向表的指针时被传递。
该行应为... mov rax,rv(StartServiceCtrlDispatcher,ADDR service_table)
此外,在 64 位模式下只有一个调用约定,因此没有发现其他问题。
推荐阅读
- argoproj - 如何根据消息值触发不同的模板?
- r - rvest 包的 read_html 问题
- xcode - 全新 XCode 安装显示已撤销的证书
- amazon-web-services - Amazon S3 aws:删除超过 5 天的文件夹
- javascript - 如何将 Vue 3 组件挂载到父组件?
- python-3.x - 即使我安装了 ffmpeg,Heroku 也不播放音乐
- elasticsearch - Elasticsearch 按匹配过滤文档
- sql - 查询外部表时优化CASE语句中的条件子句
- c++ - 在 ROS 中使用 boost::asio::serial_port 时出现段错误
- reactjs - 使用 React / Redux,如果我们改变 reducer 中的任何数据,为什么 UI 不能正确更新?