KeWaitForSingleObject()

421 阅读1分钟

KeWaitForSingleObject()****

/*

使用事件同步,等待线程中的函数DbgPrint结束之后,外面生成线程的函数再返回。

*/

#include <ntddk.h>

static KEVENT event;

VOID MyThread()//线程调用的函数

{

DbgPrint(“Create Thread”);

KeSetEvent(&event,0,TRUE);//事件能获取有信号状态

PsTerminateSystemThread(STATUS_SUCCESS);

}

void DriverUnload( PDRIVER_OBJECT DriverObject)

{

}

void fun()

{

HANDLE threadHandle=NULL;

NTSTATUS status;

//KeInitializeEvent() 事件初始化

//KeWaitForSingleObject()

//KeSetEvent()

KeInitializeEvent(

&event,

SynchronizationEvent, //SynchronizationEvent为同步事件

FALSE // 当是TRUE 时初始化事件是有信号状态.,当是FALSE时初始化事件是没信号状态,如果此处为TRUE,则为有信号状态,KeWaitForSingleObject会直接通过,此时需要调用KeResetEvent来设置为无信号

);

//KeResetEvent(&event);//指定的事件对象设置为无信号状态。

status=PsCreateSystemThread( //创建线程

&threadHandle,

THREAD_ALL_ACCESS,

NULL,

NULL,

NULL,

MyThread,//调用的函数

NULL //PVOID StartContext 传递给函数的参数

);

if(!NT_SUCCESS(status))

return STATUS_UNSUCCESSFUL;

//等待信号

KeWaitForSingleObject (

&event,//可以为 时间 信号,线程,时钟,互斥对象

Executive,//等待

KernelMode ,

FALSE,

0

);

DbgPrint(“Create Thread has return”);

ZwClose(threadHandle);

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)

{

DriverObject->DriverUnload = DriverUnload;

fun();

return STATUS_SUCCESS;

}