Ошибка загрузки / выгрузки драйвера, если 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) ‹Unloaded_MyDriver1.sys> + 0x1010

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

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

kd> bu MyDriver1

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

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

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


  • *
  • Вы видите это сообщение, потому что нажали либо *
  • CTRL + C (если вы запускаете отладчик ядра консоли) или, *
  • CTRL + BREAK (если вы запускаете отладчик ядра с графическим интерфейсом), *
  • на клавиатуре вашего отладчика. *
  • *
  • ЭТО НЕ ОШИБКА ИЛИ СБОЙ СИСТЕМЫ *
  • *
  • Если вы не собирались взламывать отладчик, нажмите клавишу «g», затем *
  • нажмите кнопку «Enter» сейчас. Это сообщение может немедленно появиться снова. Если это *
  • делает, снова нажмите "g" и "Enter". *
  • *

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

(0001) MyDriver1! DriverEntry ‹PERF> (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, word ptr [rax + 44h]

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

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


person Erik    schedule 09.06.2012    source источник


Ответы (1)


Вам нужна команда sxe ld: MyDriver1.

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

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

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

person John    schedule 11.06.2012
comment
Ты прав. Все это вызвано неправильно настроенными точками останова. - person Erik; 11.06.2012