阅读:2382回复:12
执行ExFreePool函数出现的怪异问题!
程序的执行情况是这样的:
一个全局链表。 一个操作全局链表的函数,在该函数中查找全局链表,找到要删除的元素后,将该元素脱链,然后执行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; } |
|
沙发#
发布于:2007-08-27 19:54
重复删除释放了,不要过分相信WINDOWS的同步机制,特别是在多核心的情况下,还是不能完全保证完全的同步。
|
|
|
板凳#
发布于:2007-08-27 20:25
引用第1楼wowocock于2007-08-27 19:54发表的 : 我在跟踪进入NodeRemove函数时,第一次执行ExFreePool()函数,就出现蓝屏(0x00000019)。 删除这个数据,只在这个函数里面。 这好像不是出现重复删除的错误吧 |
|
地板#
发布于:2007-08-27 20:29
如果不是重复删除,那就是你自己对缓冲区操作有问题,导致溢出,破坏了POOL HEADER了,仔细检查下吧。
|
|
|
地下室#
发布于:2007-08-27 21:14
引用第3楼wowocock于2007-08-27 20:29发表的 : 我检查了一下NodeBlock这个数据结构的赋值操作,都在允许范围内,而且基本是些简单操作。 缓冲区操作应该也没有问题。 |
|
5楼#
发布于:2007-08-28 09:45
for(;List && List!=g_List.ListHead;List=List->Flink)
=> for(;List && List!=&g_List.ListHead;List=List->Flink) 还有你分配内存是如何分配的。 |
|
6楼#
发布于:2007-08-28 13:07
引用第5楼tooflat于2007-08-28 09:45发表的 : 版主的眼睛好贼哦:) 蓝屏的问题应该不在这 蓝屏是在第一次执行ExFreePool()函数时,就发生了,代码是0x00000019 我分配内存基本是这样的: NTSTATUS NodeInsert() { PNODE_BLOCK EntryNode=NULL; EntryNode=(PNODE_BLOCK)ExAllocatePool(NonPagedPool, sizeof(NODE_BLOCK));,然后就调用系 统函数InsertHeadList()插入全局双向链表里 } |
|
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));, |
|
8楼#
发布于:2007-08-28 18:47
是释放内存的问题,你看看你的NodeBlock这个变量是什么,它成了你分配的内存的值。不是指针本身。
|
|
9楼#
发布于:2007-08-28 20:37
引用第7楼tooflat于2007-08-28 18:45发表的 : 这种错误我自己还能查出来的:) 据我多方查证,排除以下错误: 1、内存溢出 2、重复删除 3、内存分配操作 估计是内存池机制的问题,我看了一些资料,没找到有价值的东西。 |
|
10楼#
发布于:2007-09-04 12:46
加上driver verify跑
|
|
|
11楼#
发布于:2007-09-05 04:12
自己实现一个链表多方便,非要搞个所谓的m$方式来实现~~ |
|
|
驱动小牛
|
12楼#
发布于:2007-09-05 08:24
哇卡卡,V大说的是,自己构造的似乎没有问题.
|