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

2024-04-18

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

#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 64 位编译了带有调试符号的驱动程序,将其复制到目标系统并使用 OSR Driver Loader 加载并运行它。

Everything works fine and I can unload and load the driver:enter image description here

我可以使用串行连接与 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!RtlpBreakWithStatus指令: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,字指针 [rax+44h]

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

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


您正在寻找的命令是 sxeld:MyDriver1

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 WinDbg 附加断点,则驱动程序加载/卸载失败 的相关文章

  • 如何从 Microsoft 获得适用于 Windows 10 的微型过滤器驱动程序的签名

    我创建了自己的迷你过滤器驱动程序 例如迷你间谍 示例来自Windows 驱动程序示例 https github com Microsoft Windows driver samples tree master filesys miniFil
  • 如何识别STATUS_INVALID_CRUNTIME_PARAMETER异常

    平台是Windows 7 SP1 我最近花了一些时间调试由于代码将无效参数传递给 安全 CRT 函数之一而引起的问题 结果 我的应用程序立即中止 没有任何警告或任何内容 甚至没有崩溃对话框 起初 我尝试通过将 Windbg 附加到我的应用程
  • glGenFramebuffers 还是 glGenFramebuffersEXT?

    我很困惑 要在 Windows 上的 OpenGL 1 x 中使用帧缓冲区对象扩展 FBO 我应使用以下哪一个 wglGetProcAddress glGenFramebuffers or wglGetProcAddress glGenFr
  • 卸载仍有实例的 kext

    我正在更新其中一台设备的驱动程序 并希望 kextunload 旧驱动程序并 kextload 新驱动程序 这样就不再需要重新启动 安装后我尝试 sudo kextunload System Library Extensions Drive
  • 如何拦截并翻译USB事件

    我想使用飞利浦 LFH 2330 查看图像 使用 Windows Image Viewer 或其他查看器 如 IrfanView 等 LFH 2330 是一款带有四个踏板的脚踏控制器 参见here http www aaaaudio net
  • 调用栈和反汇编疑问

    三大疑点 1 假设我得到如下调用堆栈 user32 dll InternalCallWinProc 20 0x28 bytes user32 dll UserCallWinProcCheckWow 32 0xb7 bytes user32
  • 内存映射 IO - 它是如何完成的?

    我已经了解了端口映射 IO 和内存映射 IO 之间的区别 但我无法弄清楚内存映射 Io 在现代操作系统 windows 或 linux 中是如何实现的 我所知道的是 物理内存的一部分被保留用于与硬件通信 并且有一个 MMIO 单元负责处理总
  • 如何阻止 Windbg 成为交互式调试器?

    正确的撤消方法是什么Windbg I在 Vista Win7 上 难道只是删除 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows NT CurrentVersion AeDebug 中的注册表项那么
  • 如何在 WinDbg 中删除断点 ntdll!DbgBreakPoint+0x1

    我正在调试一个在将 WinDbg 设置为事后调试器时崩溃的程序 我在地址 77f7f571 设置了断点 当它被触发时 我常常得到以下信息 ERROR Symbol file could not be found Defaulted to e
  • 如何在windows下制作Qt mysql驱动?

    我已经在linux中多次构建了qsqlmysql so 我完全熟悉这个过程 但现在在愚蠢的窗口中 无论我做什么 我都无法构建它 我使用的是Qt5 12 1 最新 和Microsoft VS enterprise 2017编译器 我已经下载了
  • 如何将windbg命令重定向到文件而不在windbg控制台上回显输出?

    logopen不是答案 因为它让命令输出到windbg控制台 例如 sosex dumpgen 2产生大量输出 我不想在调试器控制台中看到这些输出 现在我正在使用以下内容 shell i ci dumpgen 2 cmd c more gt
  • 如何在 Unix 中从键盘设备捕获用户输入?

    我想从键盘设备捕获所有用户输入 一次读取一个字节 我编写了以下代码 但它不起作用 if fd open dev char O RDONLY 1 tty open dev tty O RDONLY tcsetattr 0 TCSANOW or
  • WinDBG - 查找实际的(非托管)异常

    我试图在托管 非托管混合代码中找到实际的异常 问题是我有一个 Net 类 它捕获所有未处理的异常 然后创建一个转储 因此当我查看转储时 存在混合的托管 非托管代码 并且我无法真正获取实际的非托管异常 更糟糕的是 Net 似乎有自己的例外 所
  • 我是否需要在 Linux 3.12 驱动程序中“启用”PCIe 内存区域?

    我有从 PCIe 驱动程序的probe 函数调用的代码 大致基于此post https stackoverflow com a 5195061 32836 EDIT 基于安德烈亚斯 邦贝 https stackoverflow com a
  • 如何实现从一个进程到另一个进程的快速上下文切换?

    我需要在沙箱进程上运行不安全的本机代码 并且需要减少进程切换的瓶颈 两个进程 控制器和沙箱 共享两个自动重置events http msdn microsoft com en us library windows desktop aa964
  • 为应用程序创建自定义 odbc 驱动程序

    好的 我有一个简单的数据库引擎 它是用 vb6 编写的专有产品 用于我的一个应用程序 我想为它创建一个 ODBC 驱动程序 这样我就可以将我的一些其他应用程序 需要数据库 与我的数据库引擎而不是 microsoft sql 他们当前正在使用
  • WinDbg:APPLICATION_HANG_WRONG_SYMBOLS

    我对 WinDbg 还很陌生 我正在尝试找到一个导致我的应用程序无缘无故挂起的错误 我不确定我做的事情是否正确 但我知道我需要系统 dll 以及我正在调试的 exe 的符号 因此 我这样设置符号路径 srv c websymbols htt
  • 如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

    我将ojdbc6 jar复制到tomcat安装文件夹中的lib文件夹中 当我部署在 JDBC 连接中使用 Oracle 驱动程序的 Web 应用程序时 服务器说找不到驱动程序类 我被迫手动执行 DriverManager registerD
  • 如何“安装”自定义 Windows 驱动程序?

    我计划用 C 语言编写一个基本的 Windows 注册表过滤器 该过滤器的目的是挂钩所有 用户和内核特权 注册表调用 以便我可以在我的程序中使用它们 我基本上是复制 Mark Rusinovich 的 regmon 进程监视器 但更基本 我
  • 在内核模块中执行shell命令

    是否可以在内核模块中执行shell命令 我知道我们可以在用户空间 C 代码中使用system子程序 我正在调试一个存在内存泄漏问题的内核模块 在无限循环中执行 insmod 和 rmmod module ko 后 8G RAM 的系统在几分

随机推荐