大理寺少卿 发表于 2025-1-20 20:29:57

驱动开发与系统原理-驱动中的双向链表

#include<ntifs.h>

VOID DriverUnload(PDRIVER_OBJECT pDriver) {
    UNREFERENCED_PARAMETER(pDriver);//对没引用的参数进行处理

    DbgPrint("Unload success!\n");

}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) {//驱动对象指针,注册表路径 DriverEntry不能改
    //指明该参数未被使用,避免被编译器警告
    UNREFERENCED_PARAMETER(pRegPath);
    //注册卸载函数,作用是指定用哪个函数来完成卸载
    pDriverObject->DriverUnload = DriverUnload;

    //定义结构
      typedef struct _TestListEntry{
      int m_data;
      LIST_ENTRY m_ListEntry;
    }TestListEntry,*PTestListEntry;

    //声明一个头结点
      LIST_ENTRY ListHeader = { 0 };

    //初始化头结点
      InitializeListHead(&ListHeader);

    //声明带数据的结构
      TestListEntry EntryA = { 0 };
      TestListEntry EntryB = { 0 };
      TestListEntry EntryC = { 0 };
      TestListEntry EntryD = { 0 };

    //给数据成员赋值
      EntryA.m_data = 11;
      EntryB.m_data = 22;
      EntryC.m_data = 33;
      EntryD.m_data = 44;

    //插入数据
      InsertHeadList(&ListHeader, &EntryA.m_ListEntry);//头插法
      InsertTailList(&ListHeader, &EntryB.m_ListEntry);//尾插法
      InsertTailList(&ListHeader, &EntryC.m_ListEntry);
      InsertHeadList(&ListHeader, &EntryD.m_ListEntry);

    //循环遍历链表
      PLIST_ENTRY pListEntry=NULL;
      //删除节点
      RemoveHeadList(&ListHeader);//删除第一个
      RemoveTailList(&ListHeader);//删除最后一个
      pListEntry = ListHeader.Flink;
      while (pListEntry!=&ListHeader)
      {
      PTestListEntry pTestEntry = CONTAINING_RECORD(pListEntry, TestListEntry, m_ListEntry);
      DbgPrint("%d", pTestEntry->m_data);
      pListEntry = pListEntry->Flink;
      }

    return STATUS_SUCCESS;//状态成功0,一定要有返回值
}
页: [1]
查看完整版本: 驱动开发与系统原理-驱动中的双向链表