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 *****************************************************************/
14 #include <internal/debug.h>
16 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, ExpInitializeEventPairImplementation)
20 /* GLOBALS *******************************************************************/
22 POBJECT_TYPE ExEventPairObjectType
= NULL
;
24 GENERIC_MAPPING ExEventPairMapping
=
27 STANDARD_RIGHTS_WRITE
,
28 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
32 /* FUNCTIONS *****************************************************************/
37 ExpInitializeEventPairImplementation(VOID
)
39 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
41 DPRINT("Creating Event Pair Object Type\n");
43 /* Create the Event Pair Object Type */
44 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
45 RtlInitUnicodeString(&Name
, L
"EventPair");
46 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
47 ObjectTypeInitializer
.DefaultNonPagedPoolCharge
= sizeof(KEVENT_PAIR
);
48 ObjectTypeInitializer
.GenericMapping
= ExEventPairMapping
;
49 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
50 ObjectTypeInitializer
.ValidAccessMask
= EVENT_PAIR_ALL_ACCESS
;
51 ObjectTypeInitializer
.UseDefaultObject
= TRUE
;
52 ObpCreateTypeObject(&ObjectTypeInitializer
, &Name
, &ExEventPairObjectType
);
57 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
58 IN ACCESS_MASK DesiredAccess
,
59 IN POBJECT_ATTRIBUTES ObjectAttributes
)
61 PKEVENT_PAIR EventPair
;
63 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
64 NTSTATUS Status
= STATUS_SUCCESS
;
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 _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
)
79 Status
= _SEH_GetExceptionCode();
83 /* Bail out if pointer was invalid */
84 if(!NT_SUCCESS(Status
)) return Status
;
87 /* Create the Object */
88 DPRINT("Creating EventPair\n");
89 Status
= ObCreateObject(PreviousMode
,
90 ExEventPairObjectType
,
99 /* Check for Success */
100 if(NT_SUCCESS(Status
))
102 /* Initalize the Event */
103 DPRINT("Initializing EventPair\n");
104 KeInitializeEventPair(EventPair
);
107 Status
= ObInsertObject((PVOID
)EventPair
,
113 ObDereferenceObject(EventPair
);
115 /* Check for success and return handle */
116 if(NT_SUCCESS(Status
))
120 *EventPairHandle
= hEventPair
;
122 _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
)
124 Status
= _SEH_GetExceptionCode();
136 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
137 IN ACCESS_MASK DesiredAccess
,
138 IN POBJECT_ATTRIBUTES ObjectAttributes
)
141 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
142 NTSTATUS Status
= STATUS_SUCCESS
;
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 _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
)
156 Status
= _SEH_GetExceptionCode();
160 /* Bail out if pointer was invalid */
161 if(!NT_SUCCESS(Status
)) return Status
;
164 /* Open the Object */
165 Status
= ObOpenObjectByName(ObjectAttributes
,
166 ExEventPairObjectType
,
173 /* Check for success and return handle */
174 if(NT_SUCCESS(Status
))
178 *EventPairHandle
= hEventPair
;
180 _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
)
182 Status
= _SEH_GetExceptionCode();
193 NtSetHighEventPair(IN HANDLE EventPairHandle
)
195 PKEVENT_PAIR EventPair
;
196 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
199 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
201 /* Open the Object */
202 Status
= ObReferenceObjectByHandle(EventPairHandle
,
204 ExEventPairObjectType
,
209 /* Check for Success */
210 if(NT_SUCCESS(Status
))
213 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
215 /* Dereference Object */
216 ObDereferenceObject(EventPair
);
225 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
227 PKEVENT_PAIR EventPair
;
228 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
231 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
233 /* Open the Object */
234 Status
= ObReferenceObjectByHandle(EventPairHandle
,
236 ExEventPairObjectType
,
241 /* Check for Success */
242 if(NT_SUCCESS(Status
))
245 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
247 /* Wait for the Other one */
248 KeWaitForSingleObject(&EventPair
->LowEvent
,
254 /* Dereference Object */
255 ObDereferenceObject(EventPair
);
264 NtSetLowEventPair(IN HANDLE EventPairHandle
)
266 PKEVENT_PAIR EventPair
;
267 KPROCESSOR_MODE 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();
302 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
304 /* Open the Object */
305 Status
= ObReferenceObjectByHandle(EventPairHandle
,
307 ExEventPairObjectType
,
312 /* Check for Success */
313 if(NT_SUCCESS(Status
))
316 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
318 /* Wait for the Other one */
319 KeWaitForSingleObject(&EventPair
->HighEvent
,
325 /* Dereference Object */
326 ObDereferenceObject(EventPair
);
336 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
338 PKEVENT_PAIR EventPair
;
339 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
342 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
344 /* Open the Object */
345 Status
= ObReferenceObjectByHandle(EventPairHandle
,
347 ExEventPairObjectType
,
352 /* Check for Success */
353 if(NT_SUCCESS(Status
))
355 /* Wait for the Event */
356 KeWaitForSingleObject(&EventPair
->LowEvent
,
362 /* Dereference Object */
363 ObDereferenceObject(EventPair
);
372 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
374 PKEVENT_PAIR EventPair
;
375 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
379 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
381 /* Open the Object */
382 Status
= ObReferenceObjectByHandle(EventPairHandle
,
384 ExEventPairObjectType
,
389 /* Check for Success */
390 if(NT_SUCCESS(Status
))
392 /* Wait for the Event */
393 KeWaitForSingleObject(&EventPair
->HighEvent
,
399 /* Dereference Object */
400 ObDereferenceObject(EventPair
);