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
== UserMode
) {
73 ProbeForWrite(EventPairHandle
,
76 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
78 Status
= _SEH_GetExceptionCode();
82 if(!NT_SUCCESS(Status
)) return Status
;
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 /* Initalize the Event */
101 DPRINT("Initializing EventPair\n");
102 KeInitializeEventPair(EventPair
);
105 Status
= ObInsertObject((PVOID
)EventPair
,
111 ObDereferenceObject(EventPair
);
113 /* Check for success and return handle */
114 if(NT_SUCCESS(Status
)) {
118 *EventPairHandle
= hEventPair
;
120 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
122 Status
= _SEH_GetExceptionCode();
134 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
135 IN ACCESS_MASK DesiredAccess
,
136 IN POBJECT_ATTRIBUTES ObjectAttributes
)
139 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
140 NTSTATUS Status
= STATUS_SUCCESS
;
144 /* Check Output Safety */
145 if(PreviousMode
== UserMode
) {
149 ProbeForWrite(EventPairHandle
,
152 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
154 Status
= _SEH_GetExceptionCode();
158 if(!NT_SUCCESS(Status
)) return Status
;
161 /* Open the Object */
162 Status
= ObOpenObjectByName(ObjectAttributes
,
163 ExEventPairObjectType
,
170 /* Check for success and return handle */
171 if(NT_SUCCESS(Status
)) {
175 *EventPairHandle
= hEventPair
;
177 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
179 Status
= _SEH_GetExceptionCode();
191 NtSetHighEventPair(IN HANDLE EventPairHandle
)
193 PKEVENT_PAIR EventPair
;
194 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();
231 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 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
;
272 PreviousMode
= ExGetPreviousMode();
274 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
276 /* Open the Object */
277 Status
= ObReferenceObjectByHandle(EventPairHandle
,
279 ExEventPairObjectType
,
284 /* Check for Success */
285 if(NT_SUCCESS(Status
)) {
288 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
290 /* Dereference Object */
291 ObDereferenceObject(EventPair
);
300 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
302 PKEVENT_PAIR EventPair
;
303 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
307 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 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();
348 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
350 /* Open the Object */
351 Status
= ObReferenceObjectByHandle(EventPairHandle
,
353 ExEventPairObjectType
,
358 /* Check for Success */
359 if(NT_SUCCESS(Status
)) {
361 /* Wait for the Event */
362 KeWaitForSingleObject(&EventPair
->LowEvent
,
368 /* Dereference Object */
369 ObDereferenceObject(EventPair
);
378 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
380 PKEVENT_PAIR EventPair
;
381 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
385 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle
);
387 /* Open the Object */
388 Status
= ObReferenceObjectByHandle(EventPairHandle
,
390 ExEventPairObjectType
,
395 /* Check for Success */
396 if(NT_SUCCESS(Status
)) {
398 /* Wait for the Event */
399 KeWaitForSingleObject(&EventPair
->HighEvent
,
405 /* Dereference Object */
406 ObDereferenceObject(EventPair
);