(转) 内核线程同步方法之一
http://blog.csdn.net/wuna66320/article/details/1926336
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时初始化事件是没信号状态.
LONG KeSetEvent( IN PRKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait);
设置事件为有信号状态.
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);
等待事件信号状态的发生.
LONG KeResetEvent(IN PRKEVENT Event);
复位一个指定事件到没有信号状态并返回以前这个事件的信号状态.
返回非零说明以前是有信号状态;
返回 零说明以前是无信号状态;
VOID KeClearEvent(IN PRKEVENT Event);
设置一个指定事件到没有信号状态.
说明:
KeResetEvent 和 KeClearEvent 都是设置一个指定事件到没有信号状态,
如果不想得到以前这个事件的信号状态的话用 KeClearEvent 更好.
LONG KeReadStateEvent(IN PRKEVENT Event);
得到一个给定事件当前的信号状态.
返回非零说明是有信号状态;
返回 零说明是无信号状态;