Системный Вызов NtLoadDriver Выдает Код Ошибки C0000258

#c# #windows #driver #system-calls #internals

Вопрос:

Я надеюсь, что вы все в добром здравии


Я пишу загрузчик драйверов, который использует syscall для большей части своих функций в качестве хобби-проекта (в C#, просто чтобы прояснить это)

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

Однако один вызов syscall, «NtLoadDriver», всегда завершается неудачей при обстоятельствах, в которых он должен работать. Т. е.,

  1. Служба драйверов должна быть зарегистрирована в разделе «РеестрМашинаСистемаТекущий контрольный наборСлужбы» с соответствующими значениями
  2. Вызывающая программа должна иметь значение LoadDriverPrivilege со значением включено
  3. Вызывающая программа повышена, имеет права администратора

Код NTSTATUS: STATUS_NO_CALLBACK_ACTIVE C0000258

Описание: Системную службу возврата обратного вызова нельзя выполнить, если обратный вызов не активен.

К сожалению, это ошибка, которую я не могу понять. Может быть, кто-то сможет объяснить это проще.


Я использую загрузчик драйверов OSR для проверки того, зарегистрирована/незарегистрирована служба или запущена/остановлена. И я могу подтвердить, что служба зарегистрирована, и ее можно запускать и останавливать с помощью загрузчика драйверов OSR. И я также могу получить доступ к драйверу, как только он запустится.


Я провел тест, чтобы проверить, не ошиблась ли моя сигнатура функции для NtLoadDriver, или структура UNICODE_STRING, которую я использовал, была неправильной. Итак, я перенес NtLoadDriver из ntdll.dll и проверено с помощью этого. Я использовал ту же подпись, которую использовал для делегата syscall, и передал точно такой же аргумент.

И, к моему удивлению, он, кажется, работает идеально и дает успешный результат (NT_SUCCESS).


Итак, вопрос сводится к следующему: почему NtLoadDriver не работает при прямом вызове через системный вызов? И почему это работает при использовании экспорта ntdll?

Мое предположение состоит в том, что ntdll.dll выполняет некоторую инициализацию и пишет некоторый код вокруг NtLoadDriver, который заставляет его работать. У меня нет навыков обратного проектирования, чтобы на самом деле подтвердить это.


Любая помощь будет оценена по достоинству.

Заранее спасибо.