1

我基于 Windows DDK 的示例“passthru”编写了一个简单的数据包过滤驱动程序,当我打开过滤功能时,操作系统崩溃,我从 WinDbg 收到以下消息:

Microsoft (R) Windows 调试器版本 6.12.0002.633 X86 版权所有 (c) Microsoft Corporation。版权所有。

加载转储文件 [D:\iCheckTool\dump\MEMORY.DMP] 内核摘要转储文件:只有内核地址空间可用

警告:路径元素开头的空格符号搜索路径为:D:\iCheckTool\dump;SRV*E:\DebuggingSymbols*http://msdl.microsoft.com/download/symbols;SRV*C:\MyLocalSymbols*http://192.168.20.25/zfprisymbols/ 可执行搜索路径为:Windows XP Kernel Version 2600 (Service包 3) MP (2 procs) 免费 x86 兼容产品:WinNt,套件:TerminalServer SingleUserTS 构建者:2600.xpsp_sp3_qfe.120504-1617 机器名称:内核基础 = 0x804d8000 PsLoadedModuleList = 0x8055e720 调试会话时间:9 月 11 日星期二 09:41: 2012 年 2 月 828 日(UTC + 8:00)系统正常运行时间:0 天 0:02:30.578 加载内核符号 .................... ...................................................... .............................. 加载用户符号 PEB被调出 (Peb.Ldr = 7ffd800c)。键入“.hh dbgerr001”


  • *
  • 错误检查分析 *
  • *

使用 !analyze -v 获取详细的调试信息。

错误检查 C5、{4、2、1、8054c10f}

可能是由于:Pool_Corruption (nt!ExDeferredFreePool+109)

跟进:池腐败

1:kd>!分析-v


  • *
  • 错误检查分析 *
  • *

DRIVER_CORRUPTED_EXPOOL (c5) 试图以过高的中断请求级别 (IRQL) 访问可分页(或完全无效)地址。这是由损坏系统池的驱动程序引起的。针对任何新的(或可疑的)驱动程序运行驱动程序验证程序,如果没有发现罪魁祸首,则使用 gflags 启用特殊池。参数: Arg1:00000004,内存引用 Arg2:00000002,IRQL Arg3:00000001,值 0 = 读取操作,1 = 写入操作 Arg4:8054c10f,引用内存的地址

调试细节:

BUGCHECK_STR:0xC5_2

当前_IRQL:2

FAULTING_IP: nt!ExDeferredFreePool+109 8054c10f 895f04 mov
dword ptr [edi+4],ebx

DEFAULT_BUCKET_ID:DRIVER_FAULT

PROCESS_NAME:explorer.exe

trap_frame:b42555dc - (.trap 0xfffffffffb425555dc)errcode = 00000002 eax = 89cc1c60 ebx = 89e4ded8 ecx = 000001ff edx = 89cc2a78 esi = 80565d20 edi = 00000000 EIP = 8054C10F ESP = B4255650 EBP = B4255650 EI NZ = 0 NV UP EI NZ AC PE cy cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010297 nt!ExDeferredFreePool+0x109: 8054c10f 895f04 mov dword ptr [edi+4],ebx ds:0023:00000004=??? ???重置默认范围

LOCK_ADDRESS: 8055c4e0 -- (!locks 8055c4e0)

资源@nt!PiEngineLock (0x8055c4e0) 可用争用计数 = 1 1 总锁

PNP_TRIAGE:锁定地址:0x8055c4e0 线程数:0 线程地址:0x00000000 线程等待:0x0

LAST_CONTROL_TRANSFER:从 8054c10f 到 80545768

STACK_TEXT:!!!!!b42555dc 8054c10f badb0d00 89cc2a78 b8338538 NT KiTrap0E + 0x238 b4255690 8054c75f 00000001 8055c100 00020019 NT ExDeferredFreePool + 0x109 b42556d0 8058635e 899522e8 00000000 b42557d8新台币ExFreePoolWithTag + 0x47f b42556fc 805878b8 c0000023 00000007 8058758c NT PiGetDeviceRegistryProperty +量0x108 b425578c bf879f40 8a523030 00000001 00000100 NT IoGetDeviceProperty + 0x25e b42558f8 bf879735 00000000 e1b5e008 00000000 WIN32K DrvEnumDisplayDevices + 0x33b b425591c 8054268c 00000000 00000000 0007ecc4 WIN32K NtUserEnumDisplayDevices + 0x7c b425591c 7c92e514 00000000 00000000 0007ecc4 NT KiFastCallEntry + 0xFC有警告:!!!IP帧中没有任何已知的模块。以下框架可能是错误的。0007f010 00000000 00000000 00000000 00000000 0x7c92e514

堆栈命令:kb

FOLLOWUP_IP: nt!ExDeferredFreePool+109 8054c10f 895f04 mov
dword ptr [edi+4],ebx

SYMBOL_STACK_INDEX:1

SYMBOL_NAME: nt!ExDeferredFreePool+109

FOLLOWUP_NAME:池腐败

IMAGE_NAME:Pool_Corruption

DEBUG_FLR_IMAGE_TIMESTAMP:0

MODULE_NAME:Pool_Corruption

FAILURE_BUCKET_ID: 0xC5_2_nt!ExDeferredFreePool+109

BUCKET_ID: 0xC5_2_nt!ExDeferredFreePool+109

跟进:池腐败

谁能告诉我是什么导致了这个问题以及如何解决它?谢谢。

4

1 回答 1

0

显然,您试图写入无效的内存区域(地址 = 0x4)。除此之外,您发布的调试器分析并没有太大帮助。您可以尝试在调试器中找到您的驱动程序堆栈(在您发布的调试输出中不存在)以获取失败的代码,但不能保证。其他解决此问题的方法包括将调试打印添加到您的代码中并使用 DbgView 捕获它(您可以稍后从内存转储中提取它们)。您还可以连接内核调试器并在错误发生时捕获错误。

于 2012-10-18T21:16:02.400 回答