Windows内核编程之:链表

注意:

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);

    }

}

 

 

你可能感兴趣的:(windows)