Linux 拨号vps windows公众号手机端

Windows内核编程基础之使用LIST_ENTRY

lewis 6年前 (2019-08-08) 阅读数 7 #网络运维
文章标签 windows

在Windows内核编程中,`LIST_ENTRY`是一个非常重要的数据结构,用于实现双向链表。它定义在`ntdef.h`头文件中,其结构如下:

typedefstruct_LIST_ENTRY{
struct_LIST_ENTRY*Flink;
struct_LIST_ENTRY*Blink;
}LIST_ENTRY,*PLIST_ENTRY;

`LIST_ENTRY`结构包含两个指针成员:`Flink`和`Blink`。`Flink`指向链表中的下一个节点,而`Blink`指向链表中的前一个节点。

使用`LIST_ENTRY`来创建链表的步骤如下:

1. 首先,定义一个结构体来表示节点的数据类型。该结构体应该包含一个`LIST_ENTRY`类型的成员作为链表节点。

2. 创建一个`LIST_ENTRY`类型的头节点,通常称为`ListHead`。

3. 初始化`ListHead`的`Flink`和`Blink`指针为指向自身,表示链表为空。

4. 在需要添加节点时,创建一个新节点,并将其插入到链表中。

5. 在需要遍历链表时,使用`CONTAINING_RECORD`宏将`LIST_ENTRY`转换为实际节点类型的指针,从而获取节点的数据。

下面是一个示例代码,展示了如何使用`LIST_ENTRY`创建和遍历一个简单的链表:

#include
typedefstruct_MY_NODE{
LIST_ENTRYListEntry;
ULONGData;
}MY_NODE,*PMY_NODE;
LIST_ENTRYListHead;
VOIDCreateList()
{
InitializeListHead(&ListHead);
}
VOIDAddNode(ULONGdata)
{
PMY_NODEnewNode=(PMY_NODE)ExAllocatePoolWithTag(NonPagedPool,sizeof(MY_NODE),'Tag');
if(newNode!=NULL){
newNode->Data=data;
InsertTailList(&ListHead,&(newNode->ListEntry));
}
}
VOIDTraverseList()
{
PLIST_ENTRYentry;
PMY_NODEnode;
for(entry=ListHead.Flink;entry!=&ListHead;entry=entry->Flink){
node=CONTAINING_RECORD(entry,MY_NODE,ListEntry);
//处理节点数据
DbgPrint("Nodedata:%lu\n",node->Data);
}
}

在示例代码中,`CreateList`函数用于初始化链表头节点。`AddNode`函数用于向链表中添加新节点,并使用`InsertTailList`函数将新节点插入到链表末尾。`TraverseList`函数用于遍历链表,并使用`CONTAINING_RECORD`宏将`LIST_ENTRY`转换为实际的节点类型指针,从而获取节点的数据。

请注意,在实际的内核驱动开发中,需要包含适当的头文件和正确的环境设置,如DDK或WDK等。此外,应该根据实际需求对链表进行适当的初始化、插入节点和释放资源等操作。

版权声明

本文仅代表作者观点,不代表米安网络立场。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门