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 EXPORTED ExEventPairObjectType
= NULL
;
23 static GENERIC_MAPPING ExEventPairMapping
= {
25 STANDARD_RIGHTS_WRITE
,
26 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
27 EVENT_PAIR_ALL_ACCESS
};
30 /* FUNCTIONS *****************************************************************/
34 ExpInitializeEventPairImplementation(VOID
)
36 /* Create the Event Pair Object Type */
37 ExEventPairObjectType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
38 RtlInitUnicodeString(&ExEventPairObjectType
->TypeName
, L
"EventPair");
39 ExEventPairObjectType
->Tag
= TAG('E', 'v', 'P', 'a');
40 ExEventPairObjectType
->PeakObjects
= 0;
41 ExEventPairObjectType
->PeakHandles
= 0;
42 ExEventPairObjectType
->TotalObjects
= 0;
43 ExEventPairObjectType
->TotalHandles
= 0;
44 ExEventPairObjectType
->PagedPoolCharge
= 0;
45 ExEventPairObjectType
->NonpagedPoolCharge
= sizeof(KEVENT_PAIR
);
46 ExEventPairObjectType
->Mapping
= &ExEventPairMapping
;
47 ExEventPairObjectType
->Dump
= NULL
;
48 ExEventPairObjectType
->Open
= NULL
;
49 ExEventPairObjectType
->Close
= NULL
;
50 ExEventPairObjectType
->Delete
= NULL
;
51 ExEventPairObjectType
->Parse
= NULL
;
52 ExEventPairObjectType
->Security
= NULL
;
53 ExEventPairObjectType
->QueryName
= NULL
;
54 ExEventPairObjectType
->OkayToClose
= NULL
;
55 ExEventPairObjectType
->Create
= NULL
;
56 ExEventPairObjectType
->DuplicationNotify
= NULL
;
57 ObpCreateTypeObject(ExEventPairObjectType
);
62 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
63 IN ACCESS_MASK DesiredAccess
,
64 IN POBJECT_ATTRIBUTES ObjectAttributes
)
66 PKEVENT_PAIR EventPair
;
68 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
69 NTSTATUS Status
= STATUS_SUCCESS
;
72 DPRINT("NtCreateEventPair: %x\n", EventPairHandle
);
74 /* Check Output Safety */
75 if(PreviousMode
== UserMode
) {
79 ProbeForWrite(EventPairHandle
,
82 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
84 Status
= _SEH_GetExceptionCode();
88 if(!NT_SUCCESS(Status
)) return Status
;
91 /* Create the Object */
92 DPRINT("Creating EventPair\n");
93 Status
= ObCreateObject(PreviousMode
,
94 ExEventPairObjectType
,
103 /* Check for Success */
104 if(NT_SUCCESS(Status
)) {
106 /* Initalize the Event */
107 DPRINT("Initializing EventPair\n");
108 KeInitializeEventPair(EventPair
);
111 Status
= ObInsertObject((PVOID
)EventPair
,
117 ObDereferenceObject(EventPair
);
119 /* Check for success and return handle */
120 if(NT_SUCCESS(Status
)) {
124 *EventPairHandle
= hEventPair
;
126 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
128 Status
= _SEH_GetExceptionCode();
140 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
141 IN ACCESS_MASK DesiredAccess
,
142 IN POBJECT_ATTRIBUTES ObjectAttributes
)
145 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
146 NTSTATUS Status
= STATUS_SUCCESS
;
150 /* Check Output Safety */
151 if(PreviousMode
== UserMode
) {
155 ProbeForWrite(EventPairHandle
,
158 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
160 Status
= _SEH_GetExceptionCode();
164 if(!NT_SUCCESS(Status
)) return Status
;
167 /* Open the Object */
168 Status
= ObOpenObjectByName(ObjectAttributes
,
169 ExEventPairObjectType
,
176 /* Check for success and return handle */
177 if(NT_SUCCESS(Status
)) {
181 *EventPairHandle
= hEventPair
;
183 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
185 Status
= _SEH_GetExceptionCode();
197 NtSetHighEventPair(IN HANDLE EventPairHandle
)
199 PKEVENT_PAIR EventPair
;
200 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
204 DPRINT("NtSetHighEventPair(EventPairHandle %x)\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();
237 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
239 /* Open the Object */
240 Status
= ObReferenceObjectByHandle(EventPairHandle
,
242 ExEventPairObjectType
,
247 /* Check for Success */
248 if(NT_SUCCESS(Status
)) {
251 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
253 /* Wait for the Other one */
254 KeWaitForSingleObject(&EventPair
->LowEvent
,
260 /* Dereference Object */
261 ObDereferenceObject(EventPair
);
270 NtSetLowEventPair(IN HANDLE EventPairHandle
)
272 PKEVENT_PAIR EventPair
;
273 KPROCESSOR_MODE PreviousMode
;
278 PreviousMode
= ExGetPreviousMode();
280 DPRINT1("NtSetHighEventPair(EventPairHandle %x)\n", EventPairHandle
);
282 /* Open the Object */
283 Status
= ObReferenceObjectByHandle(EventPairHandle
,
285 ExEventPairObjectType
,
290 /* Check for Success */
291 if(NT_SUCCESS(Status
)) {
294 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
296 /* Dereference Object */
297 ObDereferenceObject(EventPair
);
306 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
308 PKEVENT_PAIR EventPair
;
309 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
313 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
315 /* Open the Object */
316 Status
= ObReferenceObjectByHandle(EventPairHandle
,
318 ExEventPairObjectType
,
323 /* Check for Success */
324 if(NT_SUCCESS(Status
)) {
327 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
329 /* Wait for the Other one */
330 KeWaitForSingleObject(&EventPair
->HighEvent
,
336 /* Dereference Object */
337 ObDereferenceObject(EventPair
);
347 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
349 PKEVENT_PAIR EventPair
;
350 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
354 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
356 /* Open the Object */
357 Status
= ObReferenceObjectByHandle(EventPairHandle
,
359 ExEventPairObjectType
,
364 /* Check for Success */
365 if(NT_SUCCESS(Status
)) {
367 /* Wait for the Event */
368 KeWaitForSingleObject(&EventPair
->LowEvent
,
374 /* Dereference Object */
375 ObDereferenceObject(EventPair
);
384 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
386 PKEVENT_PAIR EventPair
;
387 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
391 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
393 /* Open the Object */
394 Status
= ObReferenceObjectByHandle(EventPairHandle
,
396 ExEventPairObjectType
,
401 /* Check for Success */
402 if(NT_SUCCESS(Status
)) {
404 /* Wait for the Event */
405 KeWaitForSingleObject(&EventPair
->HighEvent
,
411 /* Dereference Object */
412 ObDereferenceObject(EventPair
);