Служба Windows - сборка - ошибка StartServiceCtrlDispatcher 3221225477 - PullRequest
0 голосов
/ 06 мая 2018

Пишу сервис по сборке. Когда я вызываю StartServiceCtrlDispatcher, я получаю код ошибки: 3221225477 (C0000005h), который, по моему мнению, является исключением из-за нарушения прав доступа.

Нет ошибок с пустой таблицей и проверены все указатели таблицы.

Так что я думаю, может быть, это как-то связано с соглашением о вызовах WINAPI / sdtcall.

Вызов имеет 2 параметра, поэтому в моем случае они будут четырехзначными словами, всего 16 байтов. Я выключил фреймы стека и очистил 16 байт в ret и все еще нарушил доступ.

Я бродил по интернету из-за возможных причин, пробовал грузы и часами безуспешно. Я надеюсь, что кто-то прочитает это и узнает ответ.

Может быть, я не правильно понимаю соглашение 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

1 Ответ

0 голосов
/ 09 мая 2018

РЕШИТЬ Проблема заключалась в том, что значение таблицы передавалось, когда она должна была быть указателем на таблицу.

строка должна читать ... mov rax, rv (StartServiceCtrlDispatcher, ADDR service_table)

Кроме того, существует только одно соглашение о вызовах в 64-битном режиме, поэтому других проблем не обнаружено.

...