-
-
[求助]Windows驱动中如何使用LIST_ENTRY结构
-
发表于:
2014-3-18 15:03
12035
-
[求助]Windows驱动中如何使用LIST_ENTRY结构
今天想直接使用Windows自己提供的LIST_ENTRY结构。前面还算用的很好的,但是唯独有一个在移除节点时,里面仅提供了 RemoveHeadList、RemoveTailList、RemoveEntryList三种函数,都是从结尾或者头部移除节点。这样如果我要搜索一个特定的节点后,然后移除这个节点就无法实现?
求问大牛们,如何使用LIST_ENTRY结构来实现移除特定节点。。。。(不考虑自己实现链表),而且Windows内部大多数使用LIST_ENTRY结构的,难道就没有移除特定节点的需求么
另外还有一点:因为我使用了自旋锁,然后中断级是Dispatch Level。所以要求头结点和List_entry节点都必须固定。msdn里面是这么解释的:
is called at IRQL >= DISPATCH_LEVEL, the storage for the list entries must be memory-resident.
我估计意思就是头结点和节点都必须是在不可分页内存中,以前头结点是全局变量,所以我修改了代码如下,在堆中分配内存给头结点:
PLIST_ENTRY list_head;
KSPIN_LOCK list_lock;
VOID InitKernelList()
{
list_head = (PLIST_ENTRY)ExAllocatePoolWithTag(NonPagedPool, sizeof(LIST_ENTRY), 'Tg89');
InitializeListHead(list_head);
KeInitializeSpinLock(list_lock);
}
但是后来的第一次插入节点没有问题,再次插入的时候就发生了0x50蓝屏,PAGE_FAULT_IN_NONPAGED_AREA,这是为什么呢。
上面的List_ENTRY代码都在一个单独的.h和.c文件中,在主程序中使用extern引入全局变量
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)