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 ObpCreateTypeObject(ExEventPairObjectType
);
60 NtCreateEventPair(OUT PHANDLE EventPairHandle
,
61 IN ACCESS_MASK DesiredAccess
,
62 IN POBJECT_ATTRIBUTES ObjectAttributes
)
64 PKEVENT_PAIR EventPair
;
66 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
67 NTSTATUS Status
= STATUS_SUCCESS
;
70 DPRINT("NtCreateEventPair: %x\n", EventPairHandle
);
72 /* Check Output Safety */
73 if(PreviousMode
== UserMode
) {
77 ProbeForWrite(EventPairHandle
,
80 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
82 Status
= _SEH_GetExceptionCode();
86 if(!NT_SUCCESS(Status
)) return Status
;
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 /* Initalize the Event */
105 DPRINT("Initializing EventPair\n");
106 KeInitializeEventPair(EventPair
);
109 Status
= ObInsertObject((PVOID
)EventPair
,
115 ObDereferenceObject(EventPair
);
117 /* Check for success and return handle */
118 if(NT_SUCCESS(Status
)) {
122 *EventPairHandle
= hEventPair
;
124 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
126 Status
= _SEH_GetExceptionCode();
138 NtOpenEventPair(OUT PHANDLE EventPairHandle
,
139 IN ACCESS_MASK DesiredAccess
,
140 IN POBJECT_ATTRIBUTES ObjectAttributes
)
143 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
144 NTSTATUS Status
= STATUS_SUCCESS
;
148 /* Check Output Safety */
149 if(PreviousMode
== UserMode
) {
153 ProbeForWrite(EventPairHandle
,
156 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
158 Status
= _SEH_GetExceptionCode();
162 if(!NT_SUCCESS(Status
)) return Status
;
165 /* Open the Object */
166 Status
= ObOpenObjectByName(ObjectAttributes
,
167 ExEventPairObjectType
,
174 /* Check for success and return handle */
175 if(NT_SUCCESS(Status
)) {
179 *EventPairHandle
= hEventPair
;
181 } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter
) {
183 Status
= _SEH_GetExceptionCode();
195 NtSetHighEventPair(IN HANDLE EventPairHandle
)
197 PKEVENT_PAIR EventPair
;
198 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
202 DPRINT("NtSetHighEventPair(EventPairHandle %x)\n", EventPairHandle
);
204 /* Open the Object */
205 Status
= ObReferenceObjectByHandle(EventPairHandle
,
207 ExEventPairObjectType
,
212 /* Check for Success */
213 if(NT_SUCCESS(Status
)) {
216 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
218 /* Dereference Object */
219 ObDereferenceObject(EventPair
);
228 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle
)
230 PKEVENT_PAIR EventPair
;
231 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
235 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
237 /* Open the Object */
238 Status
= ObReferenceObjectByHandle(EventPairHandle
,
240 ExEventPairObjectType
,
245 /* Check for Success */
246 if(NT_SUCCESS(Status
)) {
249 KeSetEvent(&EventPair
->HighEvent
, EVENT_INCREMENT
, FALSE
);
251 /* Wait for the Other one */
252 KeWaitForSingleObject(&EventPair
->LowEvent
,
258 /* Dereference Object */
259 ObDereferenceObject(EventPair
);
268 NtSetLowEventPair(IN HANDLE EventPairHandle
)
270 PKEVENT_PAIR EventPair
;
271 KPROCESSOR_MODE PreviousMode
;
276 PreviousMode
= ExGetPreviousMode();
278 DPRINT1("NtSetHighEventPair(EventPairHandle %x)\n", EventPairHandle
);
280 /* Open the Object */
281 Status
= ObReferenceObjectByHandle(EventPairHandle
,
283 ExEventPairObjectType
,
288 /* Check for Success */
289 if(NT_SUCCESS(Status
)) {
292 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
294 /* Dereference Object */
295 ObDereferenceObject(EventPair
);
304 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle
)
306 PKEVENT_PAIR EventPair
;
307 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
311 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
313 /* Open the Object */
314 Status
= ObReferenceObjectByHandle(EventPairHandle
,
316 ExEventPairObjectType
,
321 /* Check for Success */
322 if(NT_SUCCESS(Status
)) {
325 KeSetEvent(&EventPair
->LowEvent
, EVENT_INCREMENT
, FALSE
);
327 /* Wait for the Other one */
328 KeWaitForSingleObject(&EventPair
->HighEvent
,
334 /* Dereference Object */
335 ObDereferenceObject(EventPair
);
345 NtWaitLowEventPair(IN HANDLE EventPairHandle
)
347 PKEVENT_PAIR EventPair
;
348 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
352 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
354 /* Open the Object */
355 Status
= ObReferenceObjectByHandle(EventPairHandle
,
357 ExEventPairObjectType
,
362 /* Check for Success */
363 if(NT_SUCCESS(Status
)) {
365 /* Wait for the Event */
366 KeWaitForSingleObject(&EventPair
->LowEvent
,
372 /* Dereference Object */
373 ObDereferenceObject(EventPair
);
382 NtWaitHighEventPair(IN HANDLE EventPairHandle
)
384 PKEVENT_PAIR EventPair
;
385 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
389 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle
);
391 /* Open the Object */
392 Status
= ObReferenceObjectByHandle(EventPairHandle
,
394 ExEventPairObjectType
,
399 /* Check for Success */
400 if(NT_SUCCESS(Status
)) {
402 /* Wait for the Event */
403 KeWaitForSingleObject(&EventPair
->HighEvent
,
409 /* Dereference Object */
410 ObDereferenceObject(EventPair
);