我刚开始开发驱动程序。对于加载、卸载和调试的一些实验,我编写了以下简单的驱动程序:
#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(如果您运行 GUI 内核调试器),*
- 在调试器机器的键盘上。*
- *
- 这不是错误或系统崩溃 *
- *
- 如果您不打算闯入调试器,请按“g”键,然后 *
- 现在按“Enter”键。此消息可能会立即再次出现。如果它 *
- 确实,请再次按“g”和“Enter”。*
- *
nt!RtlpBreakWithStatus 指令: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,word ptr [rax+44h]
最后,如果我现在继续执行,我会得到一个 BSOD ......
这里有什么问题?是我的代码错误还是我设置的断点不正确?