导致我的NDIS微型端口驱动程序在XP OS上崩溃的原因

时间:2012-09-11 08:51:20

标签: ndis miniport

我根据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],ebx

     

DEFAULT_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],ebx

     

SYMBOL_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

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

1 个答案:

答案 0 :(得分:0)

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