《Windows内核安全与驱动开发》阅读笔记 -- 索引目录

《Windows内核安全与驱动开发》 3.2 内存与链表

1. 尝试生成一个链表头并将其初始化。

2. 尝试向内存中申请两个链表结点,并且初始化该结点,将该结点插入到链表中,其数据结构如下。

typedef struct {
LIST_ENTRY list_entry;
INT id;
}StuInfo,*PStuInfo;

3. 遍历“问题2”中生成的链表,并调用 DbgPrint 打印出来。

4. 将问题2中的链表清空(并释放内存),最后判断该链表是否为空。

5. 有几种删除链表结点的方法。

6. 遍历链表时,如果 LIST_ENTRY 成员不在开头,应该如何操作?


答案

1. 尝试生成一个链表头并将其初始化。

// 定义并初始化链表头
LIST_ENTRY my_list_entry;
InitializeListHead(&my_list_entry);

2. 尝试向内存中申请两个链表结点,并且初始化该结点,将该结点插入到链表中,其数据结构如下。

//
// 向内存中申请一个结点,并插入到链表中。
//
PStuInfo pStu1 = ExAllocatePoolWithTag(NonPagedPool, sizeof(StuInfo),MEN_NAME);
if (!pStu1) {
return STATUS_INSUFFICIENT_RESOURCES;
}
pStu1->id = ;
InsertHeadList(&my_list_entry, (PLIST_ENTRY) pStu1); PStuInfo pStu2 = ExAllocatePoolWithTag(NonPagedPool, sizeof(StuInfo), MEN_NAME);
if (!pStu2) {
return STATUS_INSUFFICIENT_RESOURCES;
}
pStu2->id = ;
InsertHeadList(&my_list_entry, (PLIST_ENTRY)pStu2);

3. 遍历“问题2”中生成的链表,并调用 DbgPrint 打印出来

//
// 遍历链表
//
for (PLIST_ENTRY p = my_list_entry.Flink; p != &my_list_entry; p = p->Flink) {
DbgPrint("%d\n", ((PStuInfo)p)->id);
}

4. 将问题2中的链表清空(并释放内存),最后判断该链表是否为空。

//
// 全部删除链表
//
PLIST_ENTRY p; while (!IsListEmpty(&my_list_entry)) {
p = RemoveHeadList(&my_list_entry); // 获取被移除链表元素
ExFreePool((PStuInfo)p); } // 判断链表是否为空
if (IsListEmpty(&my_list_entry)) {
DbgPrint("链表已空\n");
}
else {
DbgPrint("链表未空\n");
}

5. 三种方法,移除链表头(RemoveHeadList);移除链表尾(RemoveTailList);移除中间元素(RemoveEntryList)。

6. 使用一个宏 CONTAINING_RECORD.

完整代码:

 #include <ntifs.h>
#define MEN_NAME 'abc'
// 定义链表结构
typedef struct {
LIST_ENTRY list_entry;
INT id;
}StuInfo,*PStuInfo; //提供一个卸载函数,让程序能卸载,如果没有这个函数,驱动将不能卸载。
VOID UnDriver(PDRIVER_OBJECT driver)
{
KdPrint(("卸载驱动成功"));
}
//入口函数,相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
// 定义并初始化链表头
LIST_ENTRY my_list_entry;
InitializeListHead(&my_list_entry); //
// 向内存中申请一个结点,并插入到链表中。
//
PStuInfo pStu1 = ExAllocatePoolWithTag(NonPagedPool, sizeof(StuInfo),MEN_NAME);
if (!pStu1) {
return STATUS_INSUFFICIENT_RESOURCES;
}
pStu1->id = ;
InsertHeadList(&my_list_entry, (PLIST_ENTRY) pStu1); PStuInfo pStu2 = ExAllocatePoolWithTag(NonPagedPool, sizeof(StuInfo), MEN_NAME);
if (!pStu2) {
return STATUS_INSUFFICIENT_RESOURCES;
}
pStu2->id = ;
InsertHeadList(&my_list_entry, (PLIST_ENTRY)pStu2); //
// 遍历链表
//
for (PLIST_ENTRY p = my_list_entry.Flink; p != &my_list_entry; p = p->Flink) {
DbgPrint("%d\n", ((PStuInfo)p)->id);
} //
// 全部删除链表
//
PLIST_ENTRY p; while (!IsListEmpty(&my_list_entry)) {
p = RemoveHeadList(&my_list_entry); // 获取被移除链表元素
ExFreePool((PStuInfo)p); } // 判断链表是否为空
if (IsListEmpty(&my_list_entry)) {
DbgPrint("链表已空\n");
}
else {
DbgPrint("链表未空\n");
} driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}

《Windows内核安全与驱动开发》 3.2 内存与链表的更多相关文章

  1. Windows内核安全与驱动开发

    这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...

  2. 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问

    国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...

  3. 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...

  4. 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...

  5. 《Windows内核安全与驱动开发》 2.3 重要的数据结构

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 2.3 重要的数据结构 一.驱动对象  Windows内核采用__的编程方式 ...

  6. 《Windows内核安全与驱动开发》 3.1 字符串操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.1 字符串操作 一.字符串的初始化 1. 判断下列代码为什么会蓝屏? U ...

  7. 《Windows内核安全与驱动开发》4.1 文件操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...

  8. 《Windows内核安全与驱动开发》4.3 时间与定时器

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.3  时间与定时器 一.获取自系统启动以来的毫秒数 /* 函数作用:求自操 ...

  9. 《Windows内核安全与驱动开发》 4.4 线程与事件

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 4.4 线程与事件 一.开辟一个线程,参数为(打印内容+打印次数),利用线程 ...

随机推荐

  1. 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之让代码更优雅

    [前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励. ...

  2. 14 Zabbix4.4.0系统实现监控checkpoint设备

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 14 Zabbix4.4.0系统实现监控checkpoint设备 1. 前期规划信息 2. 配置 ...

  3. css3 preserve-3d 的理解 注意IOS上的兼容

    css3 preserve-3d 的理解 <pre><!DOCTYPE html><html lang="en"> <head> & ...

  4. python 读取文件路径

    python 读取文件路径 一定要用绝对路径不能用相对路径 不然读取不出来 <pre>img = cv.imread("F:\\wef\\wef\\jiaoben\\e\\1.j ...

  5. Unity 横版2D移动跳跃问题——关于一段跳与二段跳

    1.初始条件: 1.角色只绑定一个碰撞体,移动时施加力或给予速度,用跳跃次数JumpTimes或者bool值OnGround判断是否在地面. 2.只用一个tilemap搭建2D场景,因此所有tilem ...

  6. kubespray2.11安装kubernetes1.15

    关于kubespray Kubespray是开源的kubernetes部署工具,整合了ansible,可以方便的部署高可用集群环境,官网地址:https://github.com/kubernetes ...

  7. 深入理解计算机系统 第二章 信息的表示和处理 part1

    欣哥划的重点: 第二章比较难,建议至少掌握下面几个知识点: 1. 字节顺序 : 大端和小端 2. 运行 图2-24, 图2-25程序 show-bytes.c 观察结果,看看有什么问题 3. 理解布尔 ...

  8. Resources for embedded SQL engine

    1. Official Website for SQLite: http://www.sqlite.org/ 2. .Net Wrapper for SQLite (System.Data.SQLit ...

  9. go中的数据结构通道-channel

    1. channel的使用 很多文章介绍channel的时候都和并发揉在一起,这里我想把它当做一种数据结构来单独介绍它的实现原理. channel,通道.golang中用于数据传递的一种数据结构.是g ...

  10. nyoj 349 (poj 1094) (拓扑排序)

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...