//一般驱动层不使用数据结构,一般Ring3层

双向链表可以将链表形成一个环.BLINK指针指向前一个元素,FLINK指针指向下一个元素.
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

初始化
双向链表都是以一个链表头作为链表的第一个元素.初始化链表头就是把Flink和Blink都指向自己,此时就是空链.使用InitializeListHead函数.

  1. #include <ntifs.h>
  2.  
  3. typedef struct _ITEM_
  4. {
  5. union
  6. {
  7. LIST_ENTRY ListEntry;
  8. SINGLE_LIST_ENTRY SingleListEntry;
  9. }u;
  10. ULONG ItemData;
  11. }ITEM,*PITEM;
  12.  
  13. void SingleListTest();//单链表
  14. void ListTest();//双链表
  15.  
  16. VOID DriverUnload(PDRIVER_OBJECT DriverObject);
  17.  
  18. #include "List.h"
  19.  
  20. //bp List!DriverEntry
  21. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
  22. {
  23. NTSTATUS Status = STATUS_SUCCESS;
  24. PDEVICE_OBJECT DeviceObject = NULL;
  25.  
  26. DriverObject->DriverUnload = DriverUnload;
  27.  
  28. //ListTest();//双向链表
  29. SingleListTest();//单链表
  30.  
  31. return Status;
  32. }
  33.  
  34. void ListTest()
  35. {
  36. LIST_ENTRY ListHead;
  37. PITEM Item = NULL;
  38.  
  39. ULONG i = ;
  40.  
  41. //初始化链表
  42. InitializeListHead(&ListHead);
  43.  
  44. for (i = ; i < ; i++)
  45. {
  46. Item = (PITEM)
  47. ExAllocatePool(PagedPool, sizeof(ITEM));
  48. Item->ItemData = i;
  49. InsertHeadList(&ListHead, &Item->u.ListEntry);
  50. }
  51.  
  52. while (!IsListEmpty(&ListHead))
  53. {
  54. PLIST_ENTRY ListEntry = RemoveTailList(&ListHead);
  55.  
  56. DbgPrint("%d\r\n", ((PITEM)ListEntry)->ItemData);
  57. ExFreePool((PITEM)ListEntry);
  58. }
  59. }
  60.  
  61. void SingleListTest()
  62. {
  63. SINGLE_LIST_ENTRY ListHead;
  64.  
  65. PITEM Item = NULL;
  66. ULONG i = ;
  67. //初始化链表
  68. InitializeListHead(&ListHead);
  69. for (i = ; i < ; i++)
  70. {
  71. Item = (PITEM)
  72. ExAllocatePool(PagedPool, sizeof(ITEM));
  73. Item->ItemData = i;
  74. PushEntryList(&ListHead, &Item->u.SingleListEntry);
  75. }
  76.  
  77. while (!IsListEmpty(&ListHead))
  78. {
  79. PSINGLE_LIST_ENTRY ListEntry = PopEntryList(&ListHead);
  80.  
  81. DbgPrint("%d\n", ((PITEM)ListEntry)->ItemData);
  82. ExFreePool((PITEM)ListEntry);
  83. }
  84.  
  85. }
  86.  
  87. VOID DriverUnload(PDRIVER_OBJECT DriverObject)
  88. {
  89. DbgPrint("DriverUnload()\r\n");
  90. }

Ring0 - 链表的更多相关文章

  1. spin lock自旋锁 双链表操作(多线程安全)(Ring0)

    通过spin lock自旋锁 ,为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法: ExInterlockedInsertHeadList(&a ...

  2. 枚举进程——暴力搜索内存(Ring0)

    上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程. 一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的.这样我们就有了找到它的方法. ...

  3. 计算机操作系统处理机调度读后感—–关于进程概念的剖析。从RING3到RING0(32位操作系统)

    计算机操作系统处理机调度读后感: 笔者在看操作系统西安电子科技大学那本书的时候,初次感觉本科教的不会太难,所以没有认真的看,但是随后这本书讲的刷新了我的世界观.这本书居然是ring0级别的,这时不禁吐 ...

  4. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  5. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  6. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  7. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  8. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  9. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

随机推荐

  1. python------模块定义、导入、优化 ------->xml模块

    1. xml模块 引用参考原文链接:https://www.cnblogs.com/python-gm/p/8032465.html      谢谢 xml是实现不同语言或程序之间进行数据交换的协议, ...

  2. python Console menu

    I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...

  3. Android学习--------实现增删改查数据库操作以及实现相似微信好友对话管理操作

    版权声明:本文为博主原创文章,转载请注明原文地址.谢谢~ https://blog.csdn.net/u011250851/article/details/26169409 近期的一个实验用到东西挺多 ...

  4. AI 学习

    极简状态机: /* 脚本名称: 脚本作者: 建立时间: 脚本功能: 版本号: */ using UnityEngine; using System.Collections; namespace Voi ...

  5. 修改VS2017模板文件,添加文件头部自定义注释

    找到Class.cs文件 找到VS2017安装目录下面的Class.cs文件,一般在C盘或者D盘 模块文件位置: 接口模版:C:\Program Files (x86)\Microsoft Visua ...

  6. 关于TP5的一对一、一对多同时存在的关联查询

    主表SQL(tp_member) CREATE TABLE `tp_member` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `us ...

  7. TestNG.xml参数配置-如何控制部分执行@test方法

    如果在methods中标识了@test的方法,也可以在method中通过include和exclude来控制需要执行哪些方法 <include name="testMethod1&qu ...

  8. Centos Java环境(转)

    https://jingyan.baidu.com/article/d7130635e6118213fdf47589.htm 解压jdk的安装包.   将解压后的文件夹重命名,便于后续操作(非必需) ...

  9. attr()、prop()、css() 的区别

    .attr( ) 可以设置元素的属性(也就是给元素新增加一个原来并不存在的属性)也可以获取元素的本来就有的属性以及额外设置的属性.如果要获取的属性没有设置,那么获取到的结果是 undefined; . ...

  10. py-day1-1 python的基本运算符和语句

    整体注释:  选中目标  ctrl + ?    基础: 运算符: **  表示幂函数 in  和 not in  : 比较运算符: 基本语法: pass 代表空代码,无意义,仅仅用于表示代码块: 引 ...