《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. [考试反思]1105csp-s模拟测试101: 临别

    先不改题,这次主要不在T3上. 这次有必要粘文件得分了. 临考前总解锁新锅我也不知道这是什么个事啊... T1宏定义写挂.因为原来在OJ上没事所以一直没注意.在Lemon评测下直接全部RE. GG在主 ...

  2. 轰炸行动(bomb):tarjan,拓扑排序

    考场上看错题,没什么好说的. 然而它就是一个大板子. 发的题解勉强还能看.但是我还想再讲讲. 题目的表述是,如果从A能直接或间接到B,那么就不能同时轰炸A和B. 那么我们从图里随便拽出一条有向路径,从 ...

  3. Windows Server 搭建企业无线认证(Radius认证方案)

    认证协议介绍: 扩展认证协议EAP(Extensible Authentication Protocol) 是一个在无线网络或点对点连线中普遍使用的认证框架.它被定义在RFC 3748中,并且使RFC ...

  4. 记录一些html5和css3的一部分属性

    html5 标签1 video:视频 属性: src:视频的url autoplay:视频在就绪后马上播放 controls:向用户显示控件2 audio:音频 属性类似于video3 属性:drag ...

  5. 2-了解DBMS

    1.DB,DBS,DBMS的区别是什么?     1.1 DB 就是数据库,数据库是存储数据的集合,可理解为多个数据表     1.2 DBS 数据库系统,包括数据库,数据库管理系统和数据库管理人员D ...

  6. .NET进阶篇06-async异步、thread多线程2

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.线程Thread1.生命周期2.后台线程3.静态方法1.线程本地存储2.内存栅栏4.返回值二.线程池ThreadPool1.工作队 ...

  7. sql性能分析(explain关键字)

    explain关键字结果 列名所代表的的含义: Id:MySQL QueryOptimizer 选定的执行计划中查询的序列号.表示查询中执行 select 子句或操作表的顺序,id 值越大优先级越高, ...

  8. C# III: 数据库基本操作

    用C#操作数据库——数据库使用SQL Server为例,对应的namespace是System.Data.SqlClient. 读取数据 从数据库中读取数据是最基本的操作了. 示例代码如下: Stri ...

  9. java面试题-Java集合相关

    1. ArrayList 和 Vector 的区别 ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据 Vector是线程安全的,但是性能比ArrayList要低. Ar ...

  10. WordPress 添加title中的logo

    WordPress 添加title中的logo <!--网页标题左侧显示--> <link rel="icon" href="/favicon.png& ...