概述
0x00 函数
KeWaitForSingleObject将当前线程置于等待状态,直到给定的Dispatcher对象被设置为一个信号状态,或者(可选)直到等待超时。
PsCreateSystemThread 创建一个以内核模式执行并返回线程句柄的系统线程。
PsTerminateSystemThread 终止当前系统线程。
ZwClose关闭一个对象句柄。
KeInitializeEvent 将事件对象初始化为同步(单个侍者)或通知类型事件,并将其设置为已发出信号或未发出信号的状态。
KeSetEvent 如果事件尚未发出信号,则KeSetEvent例程将事件对象设置为已发出信号的状态,并返回事件对象的前一状态。
KeClearEvent 将事件设置为无信号状态。
KeDelayExecutionThread 在指定的时间间隔内将当前线程置于可报警或不可报警的等待状态。
0x01 代码
#include <wdm.h>
//1 创建通知事件
//2 初始化事件
//3 创建三个现成 -> 1个修改,2个等待 查看打印信息
//4 将事件更改为同步事件
//5 查看线程打印信息
KEVENT Event = { 0 };
void DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload");
}
void KstartRoutine1(PVOID StartContext)
{
LARGE_INTEGER Timeout = { 0 };
Timeout.QuadPart = -10 * 1000 * 1000 * 5; //5秒 -> 单位为100纳秒,*10 = 微秒,*10*1000 = 毫秒,*10*1000*1000 = 秒
NTSTATUS status = STATUS_SUCCESS;
status = KeWaitForSingleObject(&Event, Executive, KernelMode,FALSE, &Timeout);
if (status == STATUS_TIMEOUT)
{
DbgPrint("KstartRoutine1 -> KeWaitForSingleObject TimeOut ");
}
else
{
if (NT_SUCCESS(status))
{
DbgPrint("KstartRoutine1 -> KeWaitForSingleObject Success ");
}
else
{
DbgPrint("KstartRoutine1 -> KeWaitForSingleObject Other ");
}
}
PsTerminateSystemThread(0); //关闭线程,否则线程属于挂起状态
}
void KstartRoutine2(PVOID StartContext)
{
LARGE_INTEGER Timeout = { 0 };
Timeout.QuadPart = -10 * 1000 * 1000 * 5; //5秒 -> 单位为100纳秒,*10 = 微秒,*10*1000 = 毫秒,*10*1000*1000 = 秒
NTSTATUS status = STATUS_SUCCESS;
status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, &Timeout);
if (status == STATUS_TIMEOUT)
{
DbgPrint("KstartRoutine2 -> KeWaitForSingleObject TimeOut ");
}
else
{
if (NT_SUCCESS(status))
{
DbgPrint("KstartRoutine2 -> KeWaitForSingleObject Success ");
}
else
{
DbgPrint("KstartRoutine2 -> KeWaitForSingleObject Other ");
}
}
PsTerminateSystemThread(0);//关闭线程,否则线程属于挂起状态
}
void KstartRoutine3(PVOID StartContext)
{
NTSTATUS status = STATUS_SUCCESS;
KeSetEvent(&Event,0,TRUE);
DbgPrint("KstartRoutine3 KeSetEvent Success ");
PsTerminateSystemThread(0);//关闭线程,否则线程属于挂起状态
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
NTSTATUS status = STATUS_SUCCESS;
HANDLE thread = NULL;
DriverObject->DriverUnload = DriverUnload;
//通知事件 -> 在将事件设置为失效前都有效
KeInitializeEvent(&Event, NotificationEvent,FALSE); //创建通知事件
PsCreateSystemThread(&thread, GENERIC_ALL,NULL,NULL,NULL, KstartRoutine1,NULL);
if (thread)
ZwClose(thread);
PsCreateSystemThread(&thread, GENERIC_ALL, NULL, NULL, NULL, KstartRoutine2, NULL);
if (thread)
ZwClose(thread);
PsCreateSystemThread(&thread, GENERIC_ALL, NULL, NULL, NULL, KstartRoutine3, NULL);
if (thread)
ZwClose(thread);
LARGE_INTEGER Interval = { 0 };
Interval.QuadPart = -10 * 1000 * 1000 * 7;
KeDelayExecutionThread(KernelMode, FALSE , &Interval);
KeClearEvent(&Event);
DbgPrint("DriverEntry KeClearEvent Success ");
//同步事件 -> 接收处理一次后失效
KeInitializeEvent(&Event, SynchronizationEvent, FALSE); //创建同步事件
PsCreateSystemThread(&thread, GENERIC_ALL, NULL, NULL, NULL, KstartRoutine1, NULL);
if (thread)
ZwClose(thread);
PsCreateSystemThread(&thread, GENERIC_ALL, NULL, NULL, NULL, KstartRoutine2, NULL);
if (thread)
ZwClose(thread);
PsCreateSystemThread(&thread, GENERIC_ALL, NULL, NULL, NULL, KstartRoutine3, NULL);
if (thread)
ZwClose(thread);
return status;
}
最后
以上就是忐忑煎饼为你收集整理的Windows驱动 - 事件的全部内容,希望文章能够帮你解决Windows驱动 - 事件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复