Ошибка загрузки / выгрузки драйвера, если WinDbg подключен с точкой останова

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

#include <ntddk.h> 

void DriverUnload(PDRIVER_OBJECT pDriverObject) 
{ 
    UNREFERENCED_PARAMETER(pDriverObject);
    DbgPrint("Driver unloading\n"); 
} 

NTSTATUS DriverEntry( 
    PDRIVER_OBJECT DriverObject, 
    PUNICODE_STRING RegistryPath) 
{ 
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    DriverObject->DriverUnload = DriverUnload; 
    DbgPrint("Hello, World\n"); 

    return STATUS_SUCCESS; 
}

Я скомпилировал драйвер для моей целевой системы, Windows 7 64bit, с символами отладки, скопировал его в целевую систему и загрузил и запустил с OSR Driver Loader.

Все отлично работает, и я могу выгрузить и загрузить драйвер:

Я могу соединиться с WinDbg, используя последовательное соединение, и могу успешно разорвать и запустить целевую систему. Однако проблема возникает, когда я пытаюсь установить точку останова.

Сначала я попытался установить точку останова следующим образом:

kd> bp MyDriver1! DriverEntry

но проблема была, если я перезагрузил драйвер и проверил точки останова:

kd> bl
0 e fffff880`03572010 0001 (0001) +0x1010

Для меня, как для новичка, это выглядело не очень хорошо (без нагрузки?), И при загрузке не происходило перерывов.

Итак, я обнаружил, что можно установить точку останова при загрузке модуля:

kd> bu MyDriver1

0 e fffff880`03578000 0001 (0001) MyDriver1! DriverEntry (MyDriver1+0x0)

Когда я продолжаю выполнение системы после вышеуказанной команды и загружаю драйвер (net start MyDriver1), система падает:

Исключение инструкции разрыва - код 80000003 (первый шанс)


  • *
  • Вы видите это сообщение, потому что вы нажали либо *
  • CTRL + C (если вы запускаете отладчик ядра консоли) или, *
  • CTRL + BREAK (если вы запускаете отладчик ядра с графическим интерфейсом), *
  • на клавиатуре вашего отладчика. *
  • *
  • Это не ошибка или системный сбой *
  • *
  • Если вы не намеревались взломать отладчик, нажмите клавишу "g", затем *
  • нажмите клавишу "Ввод" сейчас. Это сообщение может немедленно появиться Если оно *
  • делает, нажмите "g" и "Enter" снова. *
  • *

nt! RtlpBreakWithStatusInstruction: fffff800028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff88003572010 0001

(0001) MyDriver1! DriverEntry (MyDriver1+0x0)

kd> bc 0 kd> bl 1 e fffff880`03578000 0001 (0001)

MyDriver1! DriverEntry (MyDriver1+0x0)

kd> g Нарушение прав доступа - код c0000005 (!!! второй шанс!!!)

nt! IopUnloadDriver + 0x327: fffff800`02cb8b29 0fb74844 movzx

ecx, слово ptr [rax+44h]

Наконец, если я продолжу выполнение сейчас, я получу BSOD ...

Что здесь не так? Мой код неверен или я неправильно устанавливаю контрольные точки?

1 ответ

Решение

Команда, которую вы ищете: sxe ld:MyDriver1

Это сломается, когда драйвер отобразится в памяти, но перед вызовом MyDriver1!DriverEntry и позволит вам установить точки останова в DriverEntry.

Команда bu MyDriver1 ставит точку останова в первый байт PE-заголовка образа драйвера.

Кроме того, очищайте точки останова после выгрузки драйвера, иначе вы заставите отладчик изменить память, которая может быть выделена для чего-то другого.

Другие вопросы по тегам