Windows驱动 - 事件

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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值