如果WinDbg附带断点,则驱动程序加载/卸载失败

时间:2012-06-09 15:47:29

标签: driver windbg device-driver wdk

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

#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运行它。

一切正常,我可以卸载并加载驱动程序:enter image description here

我可以使用串行连接与WinDbg连接,并且可以成功中断并运行目标系统。但是,当我尝试设置断点时会出现问题。

我最初尝试设置这样的断点:

  

KD&GT; bp MyDriver1!DriverEntry

但问题是,如果我重新加载驱动程序并检查断点:

  

KD&GT; BL
  0 e fffff880`03572010 0001(0001)&lt; Unloaded_MyDriver1.sys&gt; + 0x1010

对于初学者来说,它看起来不太好(卸载?)并且在加载时没有发生中断。

所以,我发现在加载模块时可以设置断点:

  

KD&GT;我的MyDriver1

     

0 e fffff880`03578000 0001(0001)MyDriver1!DriverEntry&lt; PERF> (MyDriver1 +为0x0)

当我在上述命令后继续系统执行并加载驱动程序(net start MyDriver1)时,系统崩溃:

  

中断指令异常 - 代码80000003(第一次机会)

     
     
      
  • *
  •   
  • 您看到此消息是因为您按了*
  •   
  • CTRL + C(如果运行控制台内核调试程序)或*
  •   
  • CTRL + BREAK(如果您运行GUI内核调试程序),*
  •   在调试器机器的键盘上
  • 。 *
  •   
  • *
  •   
  • 这不是一个BUG或系统崩溃*
  •   
  • *
  •   
  • 如果您不打算进入调试器,请按“g”键,然后按*
  •   
  • 现在按“Enter”键。此消息可能会立即重新出现。如果它*
  •   
  • ,再次按“g”和“Enter”。 *
  •   
  • *      
  •   
     

nt!RtlpBreakWithStatusInstruction:fffff800 028ca490 cc int 3 kd > bu MyDriver1 kd> bl 0 e fffff880 03572010 0001

     

(0001)MyDriver1!DriverEntry&lt; PERF> (MyDriver1 +为0x0)

     

kd&gt; bc 0 kd&gt; bl 1 e fffff880`03578000 0001(0001)

     

MyDriver1!DriverEntry(MyDriver1 + 0x0)

     

KD&GT; g访问冲突 - 代码c0000005(!!!第二次机会!!!)

     

nt!IopUnloadDriver + 0x327:fffff800`02cb8b29 0fb74844 movzx

     

ecx,word ptr [rax + 44h]

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

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

1 个答案:

答案 0 :(得分:5)

您正在寻找的命令是     sxe ld:MyDriver1

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

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

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