windows内核编程基础篇之使用同步事件

Bertha 。 2022-08-05 08:51 330阅读 0赞

内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。若这个事件不被“设置”,则这个等待函数不会返回。这个线程被阻塞,若这个事件被“设置”,则等待结束,可以继续下去。

这个常常用于多线程之间的同步,若一个线程需要等待另外一个线程完成某事后才能做某事,则可以使用事件等待,另一个线程完成后设置事件即可。

该数据结构是KEVENT, 器被 KeInitializeEvent函数初始化,KeInitializeEvent原型如下:

  1. VOID KeInitializeEvent(
  2. _Out_ PRKEVENT Event,
  3. _In_ EVENT_TYPE Type,
  4. _In_ BOOLEAN State
  5. );

第一个参数是要初始化的事件,第二个参数是事件类型,第三个参数是初始化状态,一般地设置为FALSE,也就是未设状态,这样等待者需要等待设置之后才能通过。
事件不需要销毁。

设置事件使用函数KeSetEvent :

  1. LONG KeSetEvent(
  2. _Inout_ PRKEVENT Event,
  3. _In_ KPRIORITY Increment,
  4. _In_ BOOLEAN Wait
  5. );

参数解释:

Event:是要设置的事件

Increment: 用于提升优先权,当前,我们可设置为 0

Wait :表示 后面 马上紧接着一个KeWaitSingleObject 来等待这个事件,一般设置为TRUE(事件初始化之后,一般就要开始等待了)

使用事件的建安代码如下:

  1. //--定义一个事件
  2. KEVENT event;
  3. KeInitializeEvent(&event, SynchronizationEvent, TRUE);
  4. /*
  5. .........
  6. */
  7. //---事件初始化之后就可以用了,在一个函数中,你可以等待某个事件若这个事件没有被人设置,那么就会阻塞在这里继续等待。
  8. KeWaitForSingleObject(&event, Executive, KernelMode, 0, 0);
  9. /*
  10. .................
  11. */
  12. //---这个是另一个地方,有人设置这个事件,只需要设置这个事件前面等待的地方。将继续执行
  13. KeSetEvent(&event);

KeInitlizeEvent中使用了参数 SynchronizationEvent, 导致这个事件称为所谓的“自动重设”事件,一个如果被设置,那么所欲的 KeWaitSingleObject等爱这价格事件的地方都会通过,如果要能继续重复使用这个事件,必须重设这个事件,当 KeInitlizeEvent 中的第二个参数被设置为 NotifycationEvent的时候,这个事件必须要手动重设才能使用。

手动设置使用函数:KeResetEvent:

  1. LONG KeResetEvent(
  2. _Inout_ PRKEVENT Event
  3. );

若这个事件初始化的时候是 SynchronizationEvent 事件,那么只有一个线程的 KeWaitSingleObject 可以通过,通过之后被自动重设,其他的线程就只能继续等待了,则可以祈祷一个同步作用,所以叫做同步事件不能祈祷同步作用的是通知事件。注意不能用手工设置通知事件的方法来取代同步事件。

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读