您的位置:首页 > 其它

在内核下使用事件对象KeInitializeEvent

2015-08-02 14:24 1336 查看
VOID MyProcessThread( IN PVOID  StartContext)
{
#if DBG
	_asm int 3
#endif

	PKEVENT pEvent=(PKEVENT)StartContext;

	DbgPrint("11111111111111!\n");
	//设置事件
	KeSetEvent(pEvent,IO_NO_INCREMENT,FALSE);
	DbgPrint("33333333!\n");
	//结束线程
	PsTerminateSystemThread(STATUS_SUCCESS);
	return;
}
VOID Test(void)
{
#if DBG
	_asm int 3
#endif

	HANDLE hMyThread=NULL;
	KEVENT kEvent={0};

	//初始化内核事件
	KeInitializeEvent(&kEvent,NotificationEvent,FALSE);
	//第二个参数是事件的类型,一类是“通知事件”,对应参数是NotificationEvent。另一类是“同步事件”,对应是SynchronizationEvent
	//第三个参数如果为真,事件对象的初始化状态为激发状态。如果为假,则事件对象的初始化状态为未激发状态
	//如果创建的事件对象是“通知事件”,当事件对象变为激发状态时,程序员需要手动将其改回未激发
	//如果创建的事件对象是“同步事件”,当事件对象为激发状态时,如果遇到KeWaitForXXX等内核函数,事件对象则自动变回未激发状态
	PsCreateSystemThread(&hMyThread,NULL,NULL,NtCurrentProcess(),NULL,MyProcessThread,&kEvent);

	//很重要,如果不等待,则systemThread引用了本函数的栈上的变量,函数退出变量回收引发错误
	KeWaitForSingleObject(&kEvent,Executive,KernelMode,FALSE,NULL);

	DbgPrint("22222222222222222\n");
	return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: