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;
}