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

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

一、开辟一个线程,参数为(打印内容+打印次数),利用线程实现打印。(申请堆内存防止栈清空)

#include <ntifs.h>

typedef struct {
int num;
UNICODE_STRING str;
}MyContext, * PMyContext; static KEVENT event; // 全局变量中定义一个事件 /*
函数作用:线程函数,探究Event的作用
参数1 context - 线程参数
*/
void MyThradProc(IN PVOID context) {
PMyContext p = (PMyContext)context; //
// 将内容打印到日志中
//
DbgPrint("num is %wZ", p->str);
DbgPrint("这是在次线程中");
//
// 激活该事件
//
KeSetEvent(&event, , FALSE);
PsTerminateSystemThread(STATUS_SUCCESS); } void TestEvent() {
HANDLE ThreadHandle; // 线程数组
MyContext p; // 线程参数数组
NTSTATUS status; // 状态 //
// 初始化时间,让主线程等待
//
KeInitializeEvent(&event, SynchronizationEvent, FALSE); //
// 为线程参数数组开辟内存
//
RtlInitUnicodeString(&p.str, L"hello world!"); DbgPrint("这是在主线程中··\n");
DbgPrint("字符串为 :%wZ\n", &p.str);
//
// 开辟线程
//
status = PsCreateSystemThread(&ThreadHandle, , NULL, NULL, NULL, MyThradProc, (PVOID)&p); if (!NT_SUCCESS(status)) {
return ;
} //
// 等待各个线程结束之后再退出
//
KeWaitForSingleObject(&event, Executive, KernelMode, , );
} //提供一个卸载函数,让程序能卸载,如果没有这个函数,驱动将不能卸载。
VOID UnDriver(PDRIVER_OBJECT driver)
{
KdPrint(("卸载驱动成功"));
}
//入口函数,相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
TestEvent();
driver->DriverUnload = UnDriver; return STATUS_SUCCESS;
}

二、实现一个线程挂起函数

/
// 线程睡眠
//
#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000);
VOID MySleep(LONG msec) {
LARGE_INTEGER my_interval;
my_interval.QuadPart = DELAY_ONE_MILLISECOND;
my_interval.QuadPart *= msec;
KeDelayExecutionThread(KernelMode, , &my_interval);
}

三、利用Event事件来实现线程同步(可以利用栈内存来作为线程参数,线程完成之后,主线程才结束释放栈内存)

#include <ntifs.h>

typedef struct {
int num;
UNICODE_STRING str;
}MyContext, * PMyContext; static KEVENT event; // 全局变量中定义一个事件 /*
函数作用:线程函数,探究Event的作用
参数1 context - 线程参数
*/
void MyThradProc(IN PVOID context) {
PMyContext p = (PMyContext)context; //
// 将内容打印到日志中
//
DbgPrint("num is %wZ", p->str);
DbgPrint("这是在次线程中");
//
// 激活该事件
//
KeSetEvent(&event, , FALSE);
PsTerminateSystemThread(STATUS_SUCCESS); } void TestEvent() {
HANDLE ThreadHandle; // 线程数组
MyContext p; // 线程参数数组
NTSTATUS status; // 状态 //
// 初始化时间,让主线程等待
//
KeInitializeEvent(&event, SynchronizationEvent, FALSE); //
// 为线程参数数组开辟内存
//
RtlInitUnicodeString(&p.str, L"hello world!"); DbgPrint("这是在主线程中··\n");
DbgPrint("字符串为 :%wZ\n", &p.str);
//
// 开辟线程
//
status = PsCreateSystemThread(&ThreadHandle, , NULL, NULL, NULL, MyThradProc, (PVOID)&p); if (!NT_SUCCESS(status)) {
return ;
} //
// 等待各个线程结束之后再退出
//
KeWaitForSingleObject(&event, Executive, KernelMode, , );
} //提供一个卸载函数,让程序能卸载,如果没有这个函数,驱动将不能卸载。
VOID UnDriver(PDRIVER_OBJECT driver)
{
KdPrint(("卸载驱动成功"));
}
//入口函数,相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
TestEvent();
driver->DriverUnload = UnDriver; return STATUS_SUCCESS;
}

《Windows内核安全与驱动开发》 4.4 线程与事件的更多相关文章

  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内核安全与驱动开发》 3.2 内存与链表

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...

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

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

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

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

随机推荐

  1. SasS 设计原则十二因素

    Heroku 是业内知名的云应用平台,从对外提供服务以来,他们已经有上百万应用的托管和运营经验.其创始人 Adam Wiggins 根据这些经验,发布了一个“十二要素应用宣言(The Twelve-F ...

  2. vue2-preview引用时报错解决办法

    1.报错信息 在完全按照官方文档安装引入vue2-preview时出现报错,报错信息如下: 从图中标记处可以知道出错是因为在\node_modules\_vue2-preview@1.0.2@vue2 ...

  3. 1114作业 html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 数据可视化:绘图库-Matplotlib

    为什么要绘图? 一个图表数据的直观分析,下面先看一组北京和上海上午十一点到十二点的气温变化数据: 数据: 这里我用一段代码生成北京和上海的一个小时内每分钟的温度如下: import random co ...

  5. css3的过渡和动画的属性介绍

    一.过渡 什么是过渡? 过渡是指:某元素的css属性值在一段时间内,平滑过渡到另外一个值,过渡主要观察的是过程和结果. 设置能够过渡的属性: 支持过渡的样式属性,颜色的属性,取值为数值,transfo ...

  6. CentOS7.6手动编译httpd-2.4.25

    手动编译httpd-2.4.25 系统:CentOS7.1810 httpd:2.4.25 编译时报错解决技巧:报什么错,就装这个错误的devel,比如报http2错误,就yum search htt ...

  7. T-SQL Part VI: Prevent error message "Saving changes is not permitted" in SSMS

    使用SSMS时,经常遇到的问题是,修改一张table时,弹出一个错误对话框:“Saving changes is not permitted”. 这个错误通常是因为以下错误(参阅MSDN的KB文档 h ...

  8. etcd-operator快速入门完全教程

    Operator是指一类基于Kubernetes自定义资源对象(CRD)和控制器(Controller)的云原生拓展服务,其中CRD定义了每个operator所创建和管理的自定义资源对象,Contro ...

  9. 基于Docker的Mysql主从复制

    基于Docker的Mysql主从复制搭建 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相 ...

  10. java property 配置文件管理工具框架,避免写入 property 乱序

    property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 prope ...