Ring0 - 链表
//一般驱动层不使用数据结构,一般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函数.
#include <ntifs.h> typedef struct _ITEM_
{
union
{
LIST_ENTRY ListEntry;
SINGLE_LIST_ENTRY SingleListEntry;
}u;
ULONG ItemData;
}ITEM,*PITEM; void SingleListTest();//单链表
void ListTest();//双链表 VOID DriverUnload(PDRIVER_OBJECT DriverObject); #include "List.h" //bp List!DriverEntry
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL; DriverObject->DriverUnload = DriverUnload; //ListTest();//双向链表
SingleListTest();//单链表 return Status;
} void ListTest()
{
LIST_ENTRY ListHead;
PITEM Item = NULL; ULONG i = ; //初始化链表
InitializeListHead(&ListHead); for (i = ; i < ; i++)
{
Item = (PITEM)
ExAllocatePool(PagedPool, sizeof(ITEM));
Item->ItemData = i;
InsertHeadList(&ListHead, &Item->u.ListEntry);
} while (!IsListEmpty(&ListHead))
{
PLIST_ENTRY ListEntry = RemoveTailList(&ListHead); DbgPrint("%d\r\n", ((PITEM)ListEntry)->ItemData);
ExFreePool((PITEM)ListEntry);
}
} void SingleListTest()
{
SINGLE_LIST_ENTRY ListHead; PITEM Item = NULL;
ULONG i = ;
//初始化链表
InitializeListHead(&ListHead);
for (i = ; i < ; i++)
{
Item = (PITEM)
ExAllocatePool(PagedPool, sizeof(ITEM));
Item->ItemData = i;
PushEntryList(&ListHead, &Item->u.SingleListEntry);
} while (!IsListEmpty(&ListHead))
{
PSINGLE_LIST_ENTRY ListEntry = PopEntryList(&ListHead); DbgPrint("%d\n", ((PITEM)ListEntry)->ItemData);
ExFreePool((PITEM)ListEntry);
} } VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload()\r\n");
}
Ring0 - 链表的更多相关文章
- spin lock自旋锁 双链表操作(多线程安全)(Ring0)
通过spin lock自旋锁 ,为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法: ExInterlockedInsertHeadList(&a ...
- 枚举进程——暴力搜索内存(Ring0)
上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程. 一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的.这样我们就有了找到它的方法. ...
- 计算机操作系统处理机调度读后感—–关于进程概念的剖析。从RING3到RING0(32位操作系统)
计算机操作系统处理机调度读后感: 笔者在看操作系统西安电子科技大学那本书的时候,初次感觉本科教的不会太难,所以没有认真的看,但是随后这本书讲的刷新了我的世界观.这本书居然是ring0级别的,这时不禁吐 ...
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
随机推荐
- URL编码表(收集到的,为了方便查看)
URL编码表
- myBatis框架的配置部分
第一步:导包. 第二步:配置部分(第一部分) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- docker下搭建fastfds集群版
搭建过程参考 作者 https://me.csdn.net/feng_qi_1984 的课程视频 声明:集群版是在我之前写的单机版基础之上进行搭建的,我将安装了fastfds单机版的docker打包成 ...
- xencenter如何安装Centos7虚拟机系统
xencenter的ip地址192.168.245.134(win10系统) 首先我们在win10系统安装好xencenter(这个软件可以直接在xenserver启动后,通过访问xenserver的 ...
- MySQL Binlog信息查看
##=====================================## ## 在MySQL内部查看binlog文件列表 ## SHOW BINARY LOGS; ##=========== ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- 不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &
错误 1 error C2662: “int SqQueue<ElementType>::getLength(void)”: 不能将“this”指针从“const SqQueue<E ...
- Golang 端口复用测试
先给出结论: 同一个进程,使用一个端口,然后连接关闭,大约需要30s后才可再次使用这个端口. 测试 首先使用端口9001连接服务端,发送数据,然后关闭连接,接着再次使用端口9001连接服务端,如果连接 ...
- 关于STM32 ADC自校准的个人理解
前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解文章大体说的是自校准前要先将ADON位置1,之后再校准. 本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又 ...
- JAVA高并发系列
高并发Java(1):前言 高并发Java(2):多线程基础 高并发Java(3):Java内存模型和线程安全 高并发Java(4):无锁 高并发Java(5):JDK并发包1 高并发Java(6): ...