2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ex/evtpair.c
5 * PURPOSE: Support for event pairs
7 * PROGRAMMERS: Alex Ionescu (Commented, reorganized, removed Thread Pair, used
8 * KeInitializeEventPair, added SEH)
9 * David Welch (welch@mcmail.com)
10 * Skywing (skywing@valhallalegends.com)
13 /* INCLUDES *****************************************************************/
17 #include <internal/debug.h>
19 /* GLOBALS *******************************************************************/
21 POBJECT_TYPE ExEventPairObjectType
= NULL
;
23 static GENERIC_MAPPING ExEventPairMapping
= {
25 STANDARD_RIGHTS_WRITE
,
26 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
27 EVENT_PAIR_ALL_ACCESS
};
30 /* FUNCTIONS *****************************************************************/
35 ExpInitializeEventPairImplementation(VOID
)
37 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
40 DPRINT("Creating Event Pair Object Type\n");
42 /* Create the Event Pair Object Type */
43 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
44 RtlInitUnicodeString(&Name
, L
"EventPair");
45 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
46 ObjectTypeInitializer
.DefaultNonPagedPoolCharge
= sizeof(KEVENT_PAIR
);
47 ObjectTypeInitializer
.GenericMapping
= ExEventPairMapping
;
48 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
49 ObjectTypeInitializer
.ValidAccessMask
= EVENT_PAIR_ALL_ACCESS
;
50 ObjectTypeInitializer
.UseDefaultObject
= TRUE
;
51 ObpCreateTypeObject(&ObjectTypeInitializer
, &Name
, &ExEventPairObjectType
);
56 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
57 IN ACCESS_MASK DesiredAccess
,
58 IN POBJECT_ATTRIBUTES ObjectAttributes
)
60 PKEVENT_PAIR EventPair
;
62 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
63 NTSTATUS Status
= STATUS_SUCCESS
;
66 DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle
);
68 /* Check Output Safety */
69 if(PreviousMode
!= KernelMode
) {
73 ProbeForWriteHandle(EventPairHandle
);
74 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
76 Status
= _SEH_GetExceptionCode();
80 if(!NT_SUCCESS(Status
)) return Status
;
83 /* Create the Object */
84 DPRINT("Creating EventPair\n");
85 Status
= ObCreateObject(PreviousMode
,
86 ExEventPairObjectType
,
95 /* Check for Success */
96 if(NT_SUCCESS(Status
)) {
98 /* Initalize the Event */
99 DPRINT("Initializing EventPair\n");
100 KeInitializeEventPair(EventPair
);
103 Status
= ObInsertObject((PVOID
)EventPair
,
109 ObDereferenceObject(EventPair
);
111 /* Check for success and return handle */
112 if(NT_SUCCESS(Status
)) {
116 *EventPairHandle
= hEventPair
;
118 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
120 Status
= _SEH_GetExceptionCode();
132 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
133 IN ACCESS_MASK DesiredAccess
,
134 IN POBJECT_ATTRIBUTES ObjectAttributes
)
137 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
138 NTSTATUS Status
= STATUS_SUCCESS
;
142 /* Check Output Safety */
143 if(PreviousMode
!= KernelMode
) {
147 ProbeForWriteHandle(EventPairHandle
);
148 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
150 Status
= _SEH_GetExceptionCode();
154 if(!NT_SUCCESS(Status
)) return Status
;
157 /* Open the Object */
158 Status
= ObOpenObjectByName(ObjectAttributes
,
159 ExEventPairObjectType
,
166 /* Check for success and return handle */
167 if(NT_SUCCESS(Status
)) {
171 *EventPairHandle
= hEventPair
;
173 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
175 Status
= _SEH_GetExceptionCode();
187 NtSetHighEventPair(IN HANDLE EventPairHandle
)
189 PKEVENT_PAIR EventPair
;
190 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
194 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
196 /* Open the Object */
197 Status
= ObReferenceObjectByHandle(EventPairHandle
,
199 ExEventPairObjectType
,
204 /* Check for Success */
205 if(NT_SUCCESS(Status
)) {
208 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
210 /* Dereference Object */
211 ObDereferenceObject(EventPair
);
220 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
222 PKEVENT_PAIR EventPair
;
223 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
227 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
229 /* Open the Object */
230 Status
= ObReferenceObjectByHandle(EventPairHandle
,
232 ExEventPairObjectType
,
237 /* Check for Success */
238 if(NT_SUCCESS(Status
)) {
241 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
243 /* Wait for the Other one */
244 KeWaitForSingleObject(&EventPair
->LowEvent
,
250 /* Dereference Object */
251 ObDereferenceObject(EventPair
);
260 NtSetLowEventPair(IN HANDLE EventPairHandle
)
262 PKEVENT_PAIR EventPair
;
263 KPROCESSOR_MODE PreviousMode
;
268 PreviousMode
= ExGetPreviousMode();
270 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
272 /* Open the Object */
273 Status
= ObReferenceObjectByHandle(EventPairHandle
,
275 ExEventPairObjectType
,
280 /* Check for Success */
281 if(NT_SUCCESS(Status
)) {
284 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
286 /* Dereference Object */
287 ObDereferenceObject(EventPair
);
296 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
298 PKEVENT_PAIR EventPair
;
299 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
303 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
305 /* Open the Object */
306 Status
= ObReferenceObjectByHandle(EventPairHandle
,
308 ExEventPairObjectType
,
313 /* Check for Success */
314 if(NT_SUCCESS(Status
)) {
317 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
319 /* Wait for the Other one */
320 KeWaitForSingleObject(&EventPair
->HighEvent
,
326 /* Dereference Object */
327 ObDereferenceObject(EventPair
);
337 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
339 PKEVENT_PAIR EventPair
;
340 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
344 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
346 /* Open the Object */
347 Status
= ObReferenceObjectByHandle(EventPairHandle
,
349 ExEventPairObjectType
,
354 /* Check for Success */
355 if(NT_SUCCESS(Status
)) {
357 /* Wait for the Event */
358 KeWaitForSingleObject(&EventPair
->LowEvent
,
364 /* Dereference Object */
365 ObDereferenceObject(EventPair
);
374 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
376 PKEVENT_PAIR EventPair
;
377 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
381 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
383 /* Open the Object */
384 Status
= ObReferenceObjectByHandle(EventPairHandle
,
386 ExEventPairObjectType
,
391 /* Check for Success */
392 if(NT_SUCCESS(Status
)) {
394 /* Wait for the Event */
395 KeWaitForSingleObject(&EventPair
->HighEvent
,
401 /* Dereference Object */
402 ObDereferenceObject(EventPair
);