《Windows内核安全与驱动开发》 4.4 线程与事件
《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 线程与事件的更多相关文章
- Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
- 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问
国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...
- 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...
- 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...
- 《Windows内核安全与驱动开发》 2.3 重要的数据结构
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 2.3 重要的数据结构 一.驱动对象 Windows内核采用__的编程方式 ...
- 《Windows内核安全与驱动开发》 3.1 字符串操作
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.1 字符串操作 一.字符串的初始化 1. 判断下列代码为什么会蓝屏? U ...
- 《Windows内核安全与驱动开发》 3.2 内存与链表
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...
- 《Windows内核安全与驱动开发》4.1 文件操作
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...
- 《Windows内核安全与驱动开发》4.3 时间与定时器
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.3 时间与定时器 一.获取自系统启动以来的毫秒数 /* 函数作用:求自操 ...
随机推荐
- MYSQL5.7修改密码强度策略
---恢复内容开始--- 在MySQL5.6.6之后,ORACLE更新了mysql密码强度必须要使用大小写数字符号来设置密码,但是有时候这样还是很不方便的.所以记录一篇如何修改mysql密码强度的博文 ...
- CSPS模拟 42
T3数位$dp$还没改完啊 哭了 T1 对$DAG$里所有点求他能到达的点的数量 考试时算了$bitset$内存扛不住,yy了个线段树合并上去 没有A不是因为被卡了,而是数组又开小了.. 我以为不能卡 ...
- python、C++经典算法题:打印100以内的素数
题目 打印100以内的素数 思路1 素数的特点: 素数一定是奇数 一个数如果是合数,那么它一定能够被2到这个合数的开平方内的某个素数整除(这个特点是提升效率的关键) 一个数如果不能被从2到它自身开平方 ...
- 详解Kafka Producer
上一篇文章我们主要介绍了什么是 Kafka,Kafka 的基本概念是什么,Kafka 单机和集群版的搭建,以及对基本的配置文件进行了大致的介绍,还对 Kafka 的几个主要角色进行了描述,我们知道,不 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- python快速获取网页标准表格内容
from html_table_parser import HTMLTableParser def tableParse(value): p = HTMLTableParser() p.feed(va ...
- Spring Bean的定义及作用域
目录: 了解Spring的基本概念 Spring简单的示例 Bean的定义 简单地说Bean是被Spring容器管理的Java对象,Spring容器会自动完成对Bean的实例化. 那么什么是容器呢?如 ...
- 张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结
1. 抽象方法的使用 如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 publ ...
- nyoj 811-变态最大值 (max)
811-变态最大值 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:15 难度:1 题目描述: Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这 ...
- django_5:表单1——文件上传
上传文件1 class UserForm(forms.Form): name = forms.CharField() headImg = forms.FileField() def regist(re ...