《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. mysql约束条件

    约束条件 (测试markdown 编辑器专用) null 允许为空 not null 不允许为空 key 键值类型 default 设置默认类型,缺省值为NULL extra 额外设置 CREATE ...

  2. HashMap 中的容量与扩容实现,细致入微,值的一品!

    前言 开心一刻 巴闭,你的脚怎么会有味道,我要闻闻看是不是好吃的,嗯~~爸比你的脚臭死啦!! …… 高手过招,招招致命 JDK1.8 中 HashMap 的底层实现,我相信大家都能说上来个 一二,底层 ...

  3. L1与L2正则化的对比及多角度阐述为什么正则化可以解决过拟合问题

    正则化是一种回归的形式,它将系数估计(coefficient estimate)朝零的方向进行约束.调整或缩小.也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险. 一. ...

  4. mysql并发量过大造成 update语句更新错误

    mysql并发量过大造成 update语句更新错误 在同一字段的时候更新的时候 如果并发量太大 就会更新错误 这个时候只能用 swoole 消息队列更新

  5. 关于Jvm的见解(一)

    Jvm组成结构 硬件体系(如Intel体系.spac等)——>操作系统(如Windows.Linux等)——>Java Virtual Machine  所以虚拟机与硬件系统并没有直接的交 ...

  6. nyoj 268-荷兰国旗问题 (count)

    268-荷兰国旗问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:20 难度:1 题目描述: 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干 ...

  7. MySQL 5.7 安装教程(Win 10)

    MySQL5.7 下载 官网下载(不推荐使用):https://dev.mysql.com/downloads/mysql/ 清华镜像站下载(推荐):https://mirrors.tuna.tsin ...

  8. BootStrap中的collapse插件堆叠效果

    通过网络上的一系列查找,总结出的collapse插件堆叠效果(网上没有找到,只能自己弄了,帮助那些和我遇到一样状况的同学) 首先感谢一位网友的知识总结给了我灵感,在这里先帮他推荐一波(https:// ...

  9. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  10. Springboot 系列(十六)你真的了解 Swagger 文档吗?

    前言 目前来说,在 Java 领域使用 Springboot 构建微服务是比较流行的,在构建微服务时,我们大多数会选择暴漏一个 REST API 以供调用.又或者公司采用前后端分离的开发模式,让前端和 ...