我是靠谱客的博主 忐忑煎饼,最近开发中收集的这篇文章主要介绍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;

}

 

最后

以上就是忐忑煎饼为你收集整理的Windows驱动 - 事件的全部内容,希望文章能够帮你解决Windows驱动 - 事件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部