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
=
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 ObCreateObjectType(&Name
, &ObjectTypeInitializer
, NULL
, &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 _SEH2_EXCEPT(ExSystemExceptionFilter())
79 Status
= _SEH2_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
,
114 /* Check for success and return handle */
115 if(NT_SUCCESS(Status
))
119 *EventPairHandle
= hEventPair
;
121 _SEH2_EXCEPT(ExSystemExceptionFilter())
123 Status
= _SEH2_GetExceptionCode();
135 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
136 IN ACCESS_MASK DesiredAccess
,
137 IN POBJECT_ATTRIBUTES ObjectAttributes
)
140 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
141 NTSTATUS Status
= STATUS_SUCCESS
;
144 /* Check if we were called from user-mode */
145 if(PreviousMode
!= KernelMode
)
147 /* Enter SEH Block */
150 /* Check handle pointer */
151 ProbeForWriteHandle(EventPairHandle
);
153 _SEH2_EXCEPT(ExSystemExceptionFilter())
155 Status
= _SEH2_GetExceptionCode();
159 /* Bail out if pointer was invalid */
160 if(!NT_SUCCESS(Status
)) return Status
;
163 /* Open the Object */
164 Status
= ObOpenObjectByName(ObjectAttributes
,
165 ExEventPairObjectType
,
172 /* Check for success and return handle */
173 if(NT_SUCCESS(Status
))
177 *EventPairHandle
= hEventPair
;
179 _SEH2_EXCEPT(ExSystemExceptionFilter())
181 Status
= _SEH2_GetExceptionCode();
192 NtSetHighEventPair(IN HANDLE EventPairHandle
)
194 PKEVENT_PAIR EventPair
;
195 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
198 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
200 /* Open the Object */
201 Status
= ObReferenceObjectByHandle(EventPairHandle
,
203 ExEventPairObjectType
,
208 /* Check for Success */
209 if(NT_SUCCESS(Status
))
212 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
214 /* Dereference Object */
215 ObDereferenceObject(EventPair
);
224 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
226 PKEVENT_PAIR EventPair
;
227 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
230 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
232 /* Open the Object */
233 Status
= ObReferenceObjectByHandle(EventPairHandle
,
235 ExEventPairObjectType
,
240 /* Check for Success */
241 if(NT_SUCCESS(Status
))
244 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
246 /* Wait for the Other one */
247 KeWaitForSingleObject(&EventPair
->LowEvent
,
253 /* Dereference Object */
254 ObDereferenceObject(EventPair
);
263 NtSetLowEventPair(IN HANDLE EventPairHandle
)
265 PKEVENT_PAIR EventPair
;
266 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
269 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
271 /* Open the Object */
272 Status
= ObReferenceObjectByHandle(EventPairHandle
,
274 ExEventPairObjectType
,
279 /* Check for Success */
280 if(NT_SUCCESS(Status
))
283 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
285 /* Dereference Object */
286 ObDereferenceObject(EventPair
);
295 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
297 PKEVENT_PAIR EventPair
;
298 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
301 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
303 /* Open the Object */
304 Status
= ObReferenceObjectByHandle(EventPairHandle
,
306 ExEventPairObjectType
,
311 /* Check for Success */
312 if(NT_SUCCESS(Status
))
315 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
317 /* Wait for the Other one */
318 KeWaitForSingleObject(&EventPair
->HighEvent
,
324 /* Dereference Object */
325 ObDereferenceObject(EventPair
);
335 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
337 PKEVENT_PAIR EventPair
;
338 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
341 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
343 /* Open the Object */
344 Status
= ObReferenceObjectByHandle(EventPairHandle
,
346 ExEventPairObjectType
,
351 /* Check for Success */
352 if(NT_SUCCESS(Status
))
354 /* Wait for the Event */
355 KeWaitForSingleObject(&EventPair
->LowEvent
,
361 /* Dereference Object */
362 ObDereferenceObject(EventPair
);
371 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
373 PKEVENT_PAIR EventPair
;
374 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
378 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle
);
380 /* Open the Object */
381 Status
= ObReferenceObjectByHandle(EventPairHandle
,
383 ExEventPairObjectType
,
388 /* Check for Success */
389 if(NT_SUCCESS(Status
))
391 /* Wait for the Event */
392 KeWaitForSingleObject(&EventPair
->HighEvent
,
398 /* Dereference Object */
399 ObDereferenceObject(EventPair
);