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 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, ExpInitializeEventPairImplementation)
20 /* GLOBALS *******************************************************************/
22 POBJECT_TYPE ExEventPairObjectType
= NULL
;
24 GENERIC_MAPPING ExEventPairMapping
=
26 STANDARD_RIGHTS_READ
| SYNCHRONIZE
,
27 STANDARD_RIGHTS_WRITE
| SYNCHRONIZE
,
28 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
32 /* FUNCTIONS *****************************************************************/
37 ExpInitializeEventPairImplementation(VOID
)
39 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
42 DPRINT("Creating Event Pair Object Type\n");
44 /* Create the Event Pair Object Type */
45 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
46 RtlInitUnicodeString(&Name
, L
"EventPair");
47 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
48 ObjectTypeInitializer
.DefaultNonPagedPoolCharge
= sizeof(KEVENT_PAIR
);
49 ObjectTypeInitializer
.GenericMapping
= ExEventPairMapping
;
50 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
51 ObjectTypeInitializer
.ValidAccessMask
= EVENT_PAIR_ALL_ACCESS
;
52 ObjectTypeInitializer
.UseDefaultObject
= TRUE
;
53 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
;
54 Status
= ObCreateObjectType(&Name
, &ObjectTypeInitializer
, NULL
, &ExEventPairObjectType
);
55 if (!NT_SUCCESS(Status
)) return FALSE
;
61 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
62 IN ACCESS_MASK DesiredAccess
,
63 IN POBJECT_ATTRIBUTES ObjectAttributes
)
65 PKEVENT_PAIR EventPair
;
67 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
70 DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle
);
72 /* Check if we were called from user-mode */
73 if (PreviousMode
!= KernelMode
)
78 /* Check handle pointer */
79 ProbeForWriteHandle(EventPairHandle
);
81 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
83 /* Return the exception code */
84 _SEH2_YIELD(return _SEH2_GetExceptionCode());
89 /* Create the Object */
90 DPRINT("Creating EventPair\n");
91 Status
= ObCreateObject(PreviousMode
,
92 ExEventPairObjectType
,
101 /* Check for Success */
102 if (NT_SUCCESS(Status
))
104 /* Initialize the Event */
105 DPRINT("Initializing EventPair\n");
106 KeInitializeEventPair(EventPair
);
109 Status
= ObInsertObject((PVOID
)EventPair
,
116 /* Check for success */
117 if (NT_SUCCESS(Status
))
122 /* Return the handle */
123 *EventPairHandle
= hEventPair
;
125 _SEH2_EXCEPT(ExSystemExceptionFilter())
127 /* Get the exception code */
128 Status
= _SEH2_GetExceptionCode();
140 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
141 IN ACCESS_MASK DesiredAccess
,
142 IN POBJECT_ATTRIBUTES ObjectAttributes
)
145 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
149 /* Check if we were called from user-mode */
150 if (PreviousMode
!= KernelMode
)
152 /* Enter SEH Block */
155 /* Check handle pointer */
156 ProbeForWriteHandle(EventPairHandle
);
158 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
160 /* Return the exception code */
161 _SEH2_YIELD(return _SEH2_GetExceptionCode());
166 /* Open the Object */
167 Status
= ObOpenObjectByName(ObjectAttributes
,
168 ExEventPairObjectType
,
175 /* Check for success */
176 if (NT_SUCCESS(Status
))
181 /* Return the handle */
182 *EventPairHandle
= hEventPair
;
184 _SEH2_EXCEPT(ExSystemExceptionFilter())
186 /* Get the exception code */
187 Status
= _SEH2_GetExceptionCode();
198 NtSetHighEventPair(IN HANDLE EventPairHandle
)
200 PKEVENT_PAIR EventPair
;
201 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
204 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
206 /* Open the Object */
207 Status
= ObReferenceObjectByHandle(EventPairHandle
,
209 ExEventPairObjectType
,
214 /* Check for Success */
215 if(NT_SUCCESS(Status
))
218 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
220 /* Dereference Object */
221 ObDereferenceObject(EventPair
);
230 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
232 PKEVENT_PAIR EventPair
;
233 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
236 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
238 /* Open the Object */
239 Status
= ObReferenceObjectByHandle(EventPairHandle
,
241 ExEventPairObjectType
,
246 /* Check for Success */
247 if(NT_SUCCESS(Status
))
250 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
252 /* Wait for the Other one */
253 KeWaitForSingleObject(&EventPair
->LowEvent
,
259 /* Dereference Object */
260 ObDereferenceObject(EventPair
);
269 NtSetLowEventPair(IN HANDLE EventPairHandle
)
271 PKEVENT_PAIR EventPair
;
272 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
275 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
277 /* Open the Object */
278 Status
= ObReferenceObjectByHandle(EventPairHandle
,
280 ExEventPairObjectType
,
285 /* Check for Success */
286 if(NT_SUCCESS(Status
))
289 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
291 /* Dereference Object */
292 ObDereferenceObject(EventPair
);
301 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
303 PKEVENT_PAIR EventPair
;
304 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
307 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
309 /* Open the Object */
310 Status
= ObReferenceObjectByHandle(EventPairHandle
,
312 ExEventPairObjectType
,
317 /* Check for Success */
318 if(NT_SUCCESS(Status
))
321 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
323 /* Wait for the Other one */
324 KeWaitForSingleObject(&EventPair
->HighEvent
,
330 /* Dereference Object */
331 ObDereferenceObject(EventPair
);
341 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
343 PKEVENT_PAIR EventPair
;
344 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
347 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
349 /* Open the Object */
350 Status
= ObReferenceObjectByHandle(EventPairHandle
,
352 ExEventPairObjectType
,
357 /* Check for Success */
358 if(NT_SUCCESS(Status
))
360 /* Wait for the Event */
361 KeWaitForSingleObject(&EventPair
->LowEvent
,
367 /* Dereference Object */
368 ObDereferenceObject(EventPair
);
377 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
379 PKEVENT_PAIR EventPair
;
380 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
384 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
386 /* Open the Object */
387 Status
= ObReferenceObjectByHandle(EventPairHandle
,
389 ExEventPairObjectType
,
394 /* Check for Success */
395 if(NT_SUCCESS(Status
))
397 /* Wait for the Event */
398 KeWaitForSingleObject(&EventPair
->HighEvent
,
404 /* Dereference Object */
405 ObDereferenceObject(EventPair
);