zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    JavaScript异步编程1——Promise的初步使用
    Pailler
    ElGamal
    RSA
    密码基础
    博客园中:为文章添加版权保护
    DCT实现水印嵌入与提取(带攻击)
    量子:基于EPR块对的两步量子直接通信
    量子:拜占庭协议和测谎问题的量子协议的实验证明
    liunx:网络命令
  • 原文地址:https://www.cnblogs.com/qintangtao/p/3011888.html
Copyright © 2011-2022 走看看