Ошибка загрузки / выгрузки драйвера, если 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: fffff800
028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff880
03572010 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-заголовка образа драйвера.
Кроме того, очищайте точки останова после выгрузки драйвера, иначе вы заставите отладчик изменить память, которая может быть выделена для чего-то другого.