flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
阅读:2380回复:12

执行ExFreePool函数出现的怪异问题!

楼主#
更多 发布于:2007-08-27 19:34
程序的执行情况是这样的:
一个全局链表。
一个操作全局链表的函数,在该函数中查找全局链表,找到要删除的元素后,将该元素脱链,然后执行ExFreePool函数,同时出现蓝屏,代码为0x00000019.
实在不知是什么原因。
如下源码:

NTSTATUS NodeRemove(
    DWORD flag
    
   )
{
        PNODE_BLOCK NodeBlock;
    KIRQL WriteOldirql;
    PLIST_ENTRY List;

    ExAcquireSpinLock(&WrLock,&WrOldIrql);//全局锁

      List=g_List.ListHead.Flink;

        for(;List && List!=g_List.ListHead;List=List->Flink)
        {
        
      
         NodeBlock=*(PNODE_BLOCK )((DWORD *)List);
          if(NodeBlock.flag==flag)
          {
              RemoveEntryList(List);//脱链
        
             if(NodeBlock!=NULL)
                          
                 ExFreePool(NodeBlock);//free,softice跟踪,走到这,一执行就蓝屏(0x00000019)
             ExReleaseSpinLock(&WrLock,WrOldIrql);                
              return 1;
          }
      
        }
        ExReleaseSpinLock(&WrLock,WrOldIrql);
        return 0;
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-08-27 19:54
重复删除释放了,不要过分相信WINDOWS的同步机制,特别是在多核心的情况下,还是不能完全保证完全的同步。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-27 20:25
引用第1楼wowocock于2007-08-27 19:54发表的  :
重复删除释放了,不要过分相信WINDOWS的同步机制,特别是在多核心的情况下,还是不能完全保证完全的同步。


我在跟踪进入NodeRemove函数时,第一次执行ExFreePool()函数,就出现蓝屏(0x00000019)。
删除这个数据,只在这个函数里面。
这好像不是出现重复删除的错误吧
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-08-27 20:29
如果不是重复删除,那就是你自己对缓冲区操作有问题,导致溢出,破坏了POOL HEADER了,仔细检查下吧。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-27 21:14
引用第3楼wowocock于2007-08-27 20:29发表的  :
如果不是重复删除,那就是你自己对缓冲区操作有问题,导致溢出,破坏了POOL HEADER了,仔细检查下吧。



我检查了一下NodeBlock这个数据结构的赋值操作,都在允许范围内,而且基本是些简单操作。
缓冲区操作应该也没有问题。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-28 09:45
for(;List && List!=g_List.ListHead;List=List->Flink)
=>
for(;List && List!=&g_List.ListHead;List=List->Flink)


还有你分配内存是如何分配的。
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-28 13:07
引用第5楼tooflat于2007-08-28 09:45发表的  :
for(;List && List!=g_List.ListHead;List=List->Flink)
=>
for(;List && List!=&g_List.ListHead;List=List->Flink)


.......



版主的眼睛好贼哦:)
蓝屏的问题应该不在这
蓝屏是在第一次执行ExFreePool()函数时,就发生了,代码是0x00000019

我分配内存基本是这样的:
NTSTATUS NodeInsert()
{
PNODE_BLOCK EntryNode=NULL;

EntryNode=(PNODE_BLOCK)ExAllocatePool(NonPagedPool, sizeof(NODE_BLOCK));,然后就调用系

统函数InsertHeadList()插入全局双向链表里
}
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-28 18:45
引用第6楼flying2008于2007-08-28 13:07发表的  :



版主的眼睛好贼哦:)
蓝屏的问题应该不在这
.......



我的眼睛对代码敏感,赫赫。

看情况应该是分配内存的代码有问题,你得是直接复制的代码吗??
EntryNode=(PNODE_BLOCK)ExAllocatePool(NonPagedPool, sizeof(NODE_BLOCK));

会不会被你写成了:

EntryNode=(PNODE_BLOCK)ExAllocatePool(NonPagedPool, sizeof(PNODE_BLOCK));,
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-28 18:47
是释放内存的问题,你看看你的NodeBlock这个变量是什么,它成了你分配的内存的值。不是指针本身。
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-28 20:37
引用第7楼tooflat于2007-08-28 18:45发表的  :



我的眼睛对代码敏感,赫赫。

.......

这种错误我自己还能查出来的:)

据我多方查证,排除以下错误:
1、内存溢出
2、重复删除
3、内存分配操作
估计是内存池机制的问题,我看了一些资料,没找到有价值的东西。
newkey
驱动小牛
驱动小牛
  • 注册日期2002-10-03
  • 最后登录2013-10-13
  • 粉丝1
  • 关注0
  • 积分45分
  • 威望392点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-09-04 12:46
加上driver verify跑
www.xDrv.com
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
11楼#
发布于:2007-09-05 04:12

 自己实现一个链表多方便,非要搞个所谓的m$方式来实现~~
没有战争就没有进步 X3工作组 为您提供最好的军火
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-09-05 08:24
哇卡卡,V大说的是,自己构造的似乎没有问题.
游客

返回顶部