《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. canvas与工作流的不解之缘

    html的标签 <canvas>用于图形的绘制,通过脚本 (通常是JavaScript)来完成,canvas简而言之就是个画布.上一篇文章我们提到工作流的一个重要组成部分:流程建模,也就是 ...

  2. php ffmpeg视频和序列帧转化

    php ffmpeg视频和序列帧转化 <pre>$cmd=shell_exec("ffmpeg -i ".__DIR__ . "/shipin1.mp4 -r ...

  3. ToolStrip控件左右拖拽移动效果实现

    1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位.2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1/ ...

  4. 监听器以及在监听类里面获得bean的方法

    1实现HttpSessionListener和ServletContextListener,2个接口 2然后在contextInitialized初始化方法里面: ServletContext app ...

  5. tap事件封装

    <!DOCTYPE html> <html lang="zh"> <head>     <meta charset="UTF-8 ...

  6. iOS定位--CoreLocation

    一:导入框架 #import <CoreLocation/CoreLocation.h> 二:设置代理及属性 <CLLocationManagerDelegate> @prop ...

  7. Chrome Extension 小试牛刀

    自从有了Chrome以后,就喜欢上了这个浏览器,从此IE 886了. 以前作爬虫,做登录,做数据采集,做数据处理等各种功能,后来H5出来后,出现了,除了Session/Cookie 出了Local S ...

  8. 图片转换成base64预览

    来源:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL 真心不错写得,思路比较清晰.已经测试过 注意: ...

  9. 如何在maven中下载jar包

    1.进入maven网址  https://mvnrepository.com/ 2.搜索你想要的包的名字 3.找到列表中你想要的包 4.点击一个版本 5.点击 view all 6.找到你想要的包,点 ...

  10. 线程中synchronized关键字和lock接口的异同

    一.synchronized关键字 1.可以用来修饰代码块 synchronized (this) { // 同步的关键字 this 表示当前线程对象 if (num == 0) { break; } ...