注意:
LIST_ENTRY ListEntry; //LIST_ENTRY需要作为_MYDATASTRUCT结构体的一部分
判断链表是否为空
IsListEmpty(&head)
从首部插入链表
InsertHeadList(&linkListHead, &pData->ListEntry);
从尾部插入链表
InsertTailList(&linkListHead, &pData->ListEntry);
从首部删除链表
PLIST_ENTRY pEntry = RemoveHeadList(&linkListHead);
从尾部删除链表
RemoveTailList(&linkListHead);
*.h
typedef struct _MYDATASTRUCT{ ULONG number; LIST_ENTRY ListEntry; //LIST_ENTRY需要作为_MYDATASTRUCT结构体的一部分 }MYDATASTRUCT, *PMYDATASTRUCT;
*.cpp
/************************************************************************ * 函数名称:LinkListTest * 功能描述:驱动程序中使用链表 * 参数列表: * 返回 值:VOID *************************************************************************/ #pragma INITCODE VOID LinkListTest() { LIST_ENTRY linkListHead; //初始化链表头 InitializeListHead(&linkListHead); PMYDATASTRUCT pData; ULONG i = 0; KdPrint(("Begin Insert to link List\n")); for( i = 0; i < 10; i++ ) { //分配分页内存 pData = (PMYDATASTRUCT)ExAllocatePool(PagedPool, sizeof(MYDATASTRUCT)); pData->number = i; //从头部插入 InsertHeadList(&linkListHead, &pData->ListEntry); //从尾部插入 //InsertTailList(&linkListHead, &pData->ListEntry); } //从链表中取出,并显示 KdPrint(("Begin remove from link list\n")); //判断链表是否为空 while(!IsListEmpty(&linkListHead)) { //从尾部删除一个元素 只是从链表中删除该元素,内存还在 PLIST_ENTRY pEntry = RemoveTailList(&linkListHead); //PLIST_ENTRY pEntry = RemoveHeadList(&linkListHead); //算出自定义数据结构的指针 pData = CONTAINING_RECORD(pEntry, MYDATASTRUCT, ListEntry); KdPrint(("%d\n", pData->number)); //释放删除元素的内存 ExFreePool(&pData); } }