同步 线程 事件

来源:互联网 发布:搜狗浏览器 mac 编辑:程序博客网 时间:2024/06/05 23:45
1. VOID KeInitializeEvent(IN PRKEVENT Event, IN EVENT_TYPE Type, IN BOOLEAN State);
Type : 事件类型,可以是 NotificationEvent 和 而SynchronizationEvent.
  NotificationEvent
    等待一个IO操作完成.当一个NotificationEvent事件用KeSetEvent设置成信号状态时,
    所有等待在该事件上的线程都会开始执行,这是因为此类型事件不会自动清除信号,它
    保留信号状态直到你手工用KeResetEvent 或 KeClearEvent 清除这个事件的信号状态.
  SynchronizationEvent
    等待一个IO操作完成.当一个NotificationEvent事件用KeSetEvent设置成信号状态时,
    则只能让等待在该事件上的单个线程开始执行,其它会继续等待,这是因为此类型在执
    行 KeWaitForMultipleObjects 或 KeWaitForSingleObject 之后会自动清除这个事件
    的信号状态, 而不必手工用 KeResetEvent 或 KeClearEvent 清除这个事件的信号状
    态.

State : 指明事件的信号初始化状态.
  当是TRUE 时初始化事件是有信号状态.
  当是FALSE时初始化事件是没信号状态.

2.
LONG KeSetEvent
(
  IN PRKEVENT Event,
  IN KPRIORITY Increment,
  IN BOOLEAN Wait
  );

  设置事件为有信号状态.
 
3.
NTSTATUS KeWaitForMultipleObjects
(
  IN ULONG         Count,
  IN PVOID         Object[],
  IN WAIT_TYPE     WaitType,
  IN KWAIT_REASON   WaitReason,
  IN KPROCESSOR_MODE WaitMode,
  IN BOOLEAN       Alertable,
  IN PLARGE_INTEGER   Timeout OPTIONAL,
  IN PKWAIT_BLOCK   WaitBlockArray OPTIONAL
  );
 


NTSTATUS KeWaitForSingleObject
(
  IN PVOID         Object,
  IN KWAIT_REASON   WaitReason,
  IN KPROCESSOR_MODE WaitMode,
  IN BOOLEAN       Alertable,
  IN PLARGE_INTEGER   Timeout OPTIONAL
  );

  等待事件信号状态的发生.
 
4.
LONG KeResetEvent
(
  IN PRKEVENT Event
  );
复位一个指定事件到没有信号状态并返回以前这个事件的信号状态.
  返回非零说明以前是有信号状态;
  返回 零说明以前是无信号状态;
5.
VOID KeClearEvent
(
  IN PRKEVENT Event
  );
设置一个指定事件到没有信号状态.
说明:
  KeResetEvent 和 KeClearEvent 都是设置一个指定事件到没有信号状态,
  如果不想得到以前这个事件的信号状态的话用 KeClearEvent 更好.
 
6.
LONG KeReadStateEvent(
  IN PRKEVENT Event
  );
得到一个给定事件当前的信号状态.
返回非零说明是有信号状态;
返回 零说明是无信号状态; 
原创粉丝点击