首页 > 解决方案 > 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

标签: assemblyservicestdcall

解决方案


已解决问题是表的值在它应该是指向表的指针时被传递。

该行应为... mov rax,rv(StartServiceCtrlDispatcher,ADDR service_table)

此外,在 64 位模式下只有一个调用约定,因此没有发现其他问题。


推荐阅读