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
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
10 /* INCLUDES *****************************************************************/
16 /* GLOBALS *******************************************************************/
18 POBJECT_TYPE ExEventPairObjectType
= NULL
;
20 GENERIC_MAPPING ExEventPairMapping
=
22 STANDARD_RIGHTS_READ
| SYNCHRONIZE
,
23 STANDARD_RIGHTS_WRITE
| SYNCHRONIZE
,
24 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
28 /* FUNCTIONS *****************************************************************/
33 ExpInitializeEventPairImplementation(VOID
)
35 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
38 DPRINT("Creating Event Pair Object Type\n");
40 /* Create the Event Pair Object Type */
41 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
42 RtlInitUnicodeString(&Name
, L
"EventPair");
43 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
44 ObjectTypeInitializer
.DefaultNonPagedPoolCharge
= sizeof(KEVENT_PAIR
);
45 ObjectTypeInitializer
.GenericMapping
= ExEventPairMapping
;
46 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
47 ObjectTypeInitializer
.ValidAccessMask
= EVENT_PAIR_ALL_ACCESS
;
48 ObjectTypeInitializer
.UseDefaultObject
= TRUE
;
49 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
;
50 Status
= ObCreateObjectType(&Name
, &ObjectTypeInitializer
, NULL
, &ExEventPairObjectType
);
51 if (!NT_SUCCESS(Status
)) return FALSE
;
57 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
58 IN ACCESS_MASK DesiredAccess
,
59 IN POBJECT_ATTRIBUTES ObjectAttributes
)
61 PKEVENT_PAIR EventPair
;
63 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
66 DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle
);
68 /* Check if we were called from user-mode */
69 if (PreviousMode
!= KernelMode
)
74 /* Check handle pointer */
75 ProbeForWriteHandle(EventPairHandle
);
77 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
79 /* Return the exception code */
80 _SEH2_YIELD(return _SEH2_GetExceptionCode());
85 /* Create the Object */
86 DPRINT("Creating EventPair\n");
87 Status
= ObCreateObject(PreviousMode
,
88 ExEventPairObjectType
,
97 /* Check for Success */
98 if (NT_SUCCESS(Status
))
100 /* Initialize the Event */
101 DPRINT("Initializing EventPair\n");
102 KeInitializeEventPair(EventPair
);
105 Status
= ObInsertObject((PVOID
)EventPair
,
112 /* Check for success */
113 if (NT_SUCCESS(Status
))
118 /* Return the handle */
119 *EventPairHandle
= hEventPair
;
121 _SEH2_EXCEPT(ExSystemExceptionFilter())
123 /* Get the exception code */
124 Status
= _SEH2_GetExceptionCode();
136 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
137 IN ACCESS_MASK DesiredAccess
,
138 IN POBJECT_ATTRIBUTES ObjectAttributes
)
141 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
145 /* Check if we were called from user-mode */
146 if (PreviousMode
!= KernelMode
)
148 /* Enter SEH Block */
151 /* Check handle pointer */
152 ProbeForWriteHandle(EventPairHandle
);
154 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
156 /* Return the exception code */
157 _SEH2_YIELD(return _SEH2_GetExceptionCode());
162 /* Open the Object */
163 Status
= ObOpenObjectByName(ObjectAttributes
,
164 ExEventPairObjectType
,
171 /* Check for success */
172 if (NT_SUCCESS(Status
))
177 /* Return the handle */
178 *EventPairHandle
= hEventPair
;
180 _SEH2_EXCEPT(ExSystemExceptionFilter())
182 /* Get the exception code */
183 Status
= _SEH2_GetExceptionCode();
194 NtSetHighEventPair(IN HANDLE EventPairHandle
)
196 PKEVENT_PAIR EventPair
;
197 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
200 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
202 /* Open the Object */
203 Status
= ObReferenceObjectByHandle(EventPairHandle
,
205 ExEventPairObjectType
,
210 /* Check for Success */
211 if(NT_SUCCESS(Status
))
214 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
216 /* Dereference Object */
217 ObDereferenceObject(EventPair
);
226 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
228 PKEVENT_PAIR EventPair
;
229 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
232 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
234 /* Open the Object */
235 Status
= ObReferenceObjectByHandle(EventPairHandle
,
237 ExEventPairObjectType
,
242 /* Check for Success */
243 if(NT_SUCCESS(Status
))
246 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
248 /* Wait for the Other one */
249 KeWaitForSingleObject(&EventPair
->LowEvent
,
255 /* Dereference Object */
256 ObDereferenceObject(EventPair
);
265 NtSetLowEventPair(IN HANDLE EventPairHandle
)
267 PKEVENT_PAIR EventPair
;
268 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
271 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
273 /* Open the Object */
274 Status
= ObReferenceObjectByHandle(EventPairHandle
,
276 ExEventPairObjectType
,
281 /* Check for Success */
282 if(NT_SUCCESS(Status
))
285 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
287 /* Dereference Object */
288 ObDereferenceObject(EventPair
);
297 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
299 PKEVENT_PAIR EventPair
;
300 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
303 DPRINT("NtSetHighWaitLowEventPair(Handle 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();
343 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
345 /* Open the Object */
346 Status
= ObReferenceObjectByHandle(EventPairHandle
,
348 ExEventPairObjectType
,
353 /* Check for Success */
354 if(NT_SUCCESS(Status
))
356 /* Wait for the Event */
357 KeWaitForSingleObject(&EventPair
->LowEvent
,
363 /* Dereference Object */
364 ObDereferenceObject(EventPair
);
373 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
375 PKEVENT_PAIR EventPair
;
376 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
380 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
382 /* Open the Object */
383 Status
= ObReferenceObjectByHandle(EventPairHandle
,
385 ExEventPairObjectType
,
390 /* Check for Success */
391 if(NT_SUCCESS(Status
))
393 /* Wait for the Event */
394 KeWaitForSingleObject(&EventPair
->HighEvent
,
400 /* Dereference Object */
401 ObDereferenceObject(EventPair
);