Я только начал с разработки драйверов. Для экспериментов с загрузкой, выгрузкой и отладкой я написал следующий простой драйвер:
#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: fffff800
028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff880
03572010 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 ...
Что здесь не так? У меня неправильный код или я неправильно устанавливаю точки останова?