windows内核编程基础篇之使用同步事件
内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。若这个事件不被“设置”,则这个等待函数不会返回。这个线程被阻塞,若这个事件被“设置”,则等待结束,可以继续下去。
这个常常用于多线程之间的同步,若一个线程需要等待另外一个线程完成某事后才能做某事,则可以使用事件等待,另一个线程完成后设置事件即可。
该数据结构是KEVENT, 器被 KeInitializeEvent函数初始化,KeInitializeEvent原型如下:
VOID KeInitializeEvent(
_Out_ PRKEVENT Event,
_In_ EVENT_TYPE Type,
_In_ BOOLEAN State
);
第一个参数是要初始化的事件,第二个参数是事件类型,第三个参数是初始化状态,一般地设置为FALSE,也就是未设状态,这样等待者需要等待设置之后才能通过。
事件不需要销毁。
设置事件使用函数KeSetEvent :
LONG KeSetEvent(
_Inout_ PRKEVENT Event,
_In_ KPRIORITY Increment,
_In_ BOOLEAN Wait
);
参数解释:
Event:是要设置的事件
Increment: 用于提升优先权,当前,我们可设置为 0
Wait :表示 后面 马上紧接着一个KeWaitSingleObject 来等待这个事件,一般设置为TRUE(事件初始化之后,一般就要开始等待了)
使用事件的建安代码如下:
//--定义一个事件
KEVENT event;
KeInitializeEvent(&event, SynchronizationEvent, TRUE);
/*
.........
*/
//---事件初始化之后就可以用了,在一个函数中,你可以等待某个事件若这个事件没有被人设置,那么就会阻塞在这里继续等待。
KeWaitForSingleObject(&event, Executive, KernelMode, 0, 0);
/*
.................
*/
//---这个是另一个地方,有人设置这个事件,只需要设置这个事件前面等待的地方。将继续执行
KeSetEvent(&event);
KeInitlizeEvent中使用了参数 SynchronizationEvent, 导致这个事件称为所谓的“自动重设”事件,一个如果被设置,那么所欲的 KeWaitSingleObject等爱这价格事件的地方都会通过,如果要能继续重复使用这个事件,必须重设这个事件,当 KeInitlizeEvent 中的第二个参数被设置为 NotifycationEvent的时候,这个事件必须要手动重设才能使用。
手动设置使用函数:KeResetEvent:
LONG KeResetEvent(
_Inout_ PRKEVENT Event
);
若这个事件初始化的时候是 SynchronizationEvent 事件,那么只有一个线程的 KeWaitSingleObject 可以通过,通过之后被自动重设,其他的线程就只能继续等待了,则可以祈祷一个同步作用,所以叫做同步事件不能祈祷同步作用的是通知事件。注意不能用手工设置通知事件的方法来取代同步事件。
还没有评论,来说两句吧...