登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 195|回复: 0

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

[复制链接]

78

主题

-6

回帖

71

积分

网站编辑

积分
71
发表于 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,一定要有返回值
  }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-5 07:10 , Processed in 0.193284 second(s), 23 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表