我根据Windows DDK的'passthru'示例编写了一个简单的数据包过滤驱动程序,当我打开过滤器功能时,操作系统崩溃,我从WinDbg收到以下消息:
Microsoft(R)Windows调试器版本6.12.0002.633 X86版权所有(c) 微软公司。保留所有权利。
加载转储文件[D:\ iCheckTool \ dump \ MEMORY.DMP]内核摘要转储 文件:只有内核地址空间可用
警告:路径元素开头的空格符号搜索路径为: d:\ iCheckTool \转储; SRV * E:\ DebuggingSymbols * HTTP://msdl.microsoft.com/download/symbols; SRV * C:\ * MyLocalSymbols HTTP://192.168.20.25/zfprisymbols/ 可执行搜索路径是:Windows XP内核版本2600(服务 Pack 3)MP(2 procs)免费x86兼容产品:WinNt,套件: TerminalServer SingleUserTS建立者:2600.xpsp_sp3_qfe.120504-1617 机器名称:内核基数= 0x804d8000 PsLoadedModuleList = 0x8055e720 调试会话时间:Tue Sep 11 09:41:02.828 2012(UTC + 8:00)系统 正常运行时间:0天0:02:30.578加载内核符号 .................................................. ............. .................................................. ...........加载 用户符号PEB被分页(Peb.Ldr = 7ffd800c)。输入“.hh dbgerr001“有关详细信息,请加载已卸载的模块列表........
- *
- Bugcheck Analysis *
- *
使用!analyze -v获取详细的调试信息。
BugCheck C5,{4,2,1,8054c10f}
可能由以下原因引起:Pool_Corruption(nt!ExDeferredFreePool + 109)
跟进:Pool_corruption
1:kd> !analyze -v
- *
- Bugcheck Analysis *
- *
DRIVER_CORRUPTED_EXPOOL(c5)尝试访问可分页 (或完全无效)中断请求级别的地址(IRQL) 太高了。这是由已损坏的驱动程序引起的 系统池。针对任何新的(或可疑的)运行驱动程序验证程序 驱动程序,如果这不是罪魁祸首,那么使用gflags 启用特殊池。参数:Arg1:00000004,引用内存 Arg2:00000002,IRQL Arg3:00000001,值0 =读操作,1 = 写操作Arg4:8054c10f,引用内存的地址
调试详情:
BUGCHECK_STR:0xC5_2
CURRENT_IRQL:2
FAULTING_IP:nt!ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4],ebxDEFAULT_BUCKET_ID:DRIVER_FAULT
PROCESS_NAME:explorer.exe
TRAP_FRAME:b42555dc - (.trap 0xffffffffb42555dc)ErrCode = 00000002 eax = 89cc1c60 ebx = 89e4ded8 ecx = 000001ff edx = 89cc2a78 esi = 80565d20 edi = 00000000 eip = 8054c10f esp = b4255650 ebp = b4255690 iopl = 0 nv up ei ng n ac ac 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 - (!锁定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 nt!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
STACK_COMMAND:kb
FOLLOWUP_IP:nt!ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4],ebxSYMBOL_STACK_INDEX:1
SYMBOL_NAME:nt!ExDeferredFreePool + 109
FOLLOWUP_NAME:Pool_corruption
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
跟进:Pool_corruption
有人能告诉我是什么导致了这个问题以及如何解决这个问题? 感谢。
答案 0 :(得分:0)
显然,您试图写入无效的内存区域(地址= 0x4)。除此之外,您发布的调试器分析并没有太大帮助。您可以尝试在调试器中查找驱动程序堆栈(在发布的调试输出中不存在)以获取失败的代码,但不能保证。解决此问题的其他方法包括向代码添加调试打印并使用DbgView捕获它(稍后可以从内存转储中提取它们)。您还可以连接内核调试器并在错误发生时捕获错误。