【问题标题】:Driver load/unload fails if WinDbg attached with breakpoint如果 WinDbg 附加断点,驱动程序加载/卸载失败
【发布时间】:2012-06-09 15:47:28
【问题描述】:

我刚开始开发驱动程序。对于一些加载、卸载和调试的实验,我编写了以下简单的驱动程序:

#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(如果您运行 GUI 内核调试器),*
  • 在调试器机器的键盘上。 *
  • *
  • 这不是错误或系统崩溃 *
  • *
  • 如果您不打算闯入调试器,请按“g”键,然后按 *
  • 现在按“Enter”键。此消息可能会立即再次出现。如果是*
  • 确实,请再次按“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,word ptr [rax+44h]

最后,如果我现在继续执行,我会得到一个 BSOD ...

这里有什么问题?是我的代码错误还是我设置的断点不正确?

【问题讨论】:

    标签: driver windbg device-driver wdk


    【解决方案1】:

    您要查找的命令是 sxe ld:MyDriver1

    这将在驱动程序映射到内存但在调用 MyDriver1!DriverEntry 之前中断,并允许您在 DriverEntry 处放置断点。

    命令bu MyDriver1 在驱动程序映像的PE 头的第一个字节中放置一个断点。

    此外,在卸载驱动程序后清理断点,否则会导致调试器修改可能分配给其他内容的内存。

    【讨论】:

    • 你是对的。整个事情都是由错误配置的断点造成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多