2 * PROJECT: ReactOS Win32K
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: subsystems/win32/win32k/eng/engevent.c
5 * PURPOSE: Event Support Routines
6 * PROGRAMMERS: Aleksey Bragin <aleksey@reactos.org>
7 * ReactOS Portable Systems Group
10 /* INCLUDES *******************************************************************/
16 /* PUBLIC FUNCTIONS ***********************************************************/
20 EngCreateEvent(OUT PEVENT
* Event
)
22 BOOLEAN Result
= TRUE
;
25 /* Allocate memory for the event structure */
26 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
27 sizeof(ENG_EVENT
) + sizeof(KEVENT
),
31 /* Set KEVENT pointer */
33 EngEvent
->pKEvent
= EngEvent
+ 1;
35 /* Initialize the kernel event */
36 KeInitializeEvent(EngEvent
->pKEvent
,
40 /* Pass pointer to our structure to the caller */
42 DPRINT("EngCreateEvent() created %p\n", EngEvent
);
47 DPRINT("EngCreateEvent() failed\n");
57 EngDeleteEvent(IN PEVENT Event
)
59 DPRINT("EngDeleteEvent(%p)\n", Event
);
61 /* Check if it's a usermapped event */
62 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
)
64 /* Disallow deletion of usermapped events */
65 DPRINT1("Driver attempted to delete a usermapped event!\n");
69 /* Free the allocated memory */
78 EngClearEvent(IN PEVENT Event
)
81 KeClearEvent(Event
->pKEvent
);
86 EngSetEvent(IN PEVENT Event
)
89 return KeSetEvent(Event
->pKEvent
,
96 EngReadStateEvent(IN PEVENT Event
)
98 /* Read the event state */
99 return KeReadStateEvent(Event
->pKEvent
);
104 EngMapEvent(IN HDEV hDev
,
105 IN HANDLE hUserObject
,
113 /* Allocate memory for the event structure */
114 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
117 if (!EngEvent
) return NULL
;
120 EngEvent
->fFlags
= 0;
121 EngEvent
->pKEvent
= NULL
;
123 /* Create a handle, and have Ob fill out the pKEvent field */
124 Status
= ObReferenceObjectByHandle(EngEvent
,
130 if (NT_SUCCESS(Status
))
132 /* Pulse the event and set that it's mapped by user */
133 KePulseEvent(EngEvent
->pKEvent
, EVENT_INCREMENT
, FALSE
);
134 EngEvent
->fFlags
|= ENG_EVENT_USERMAPPED
;
138 /* Free the allocation */
139 ExFreePool(EngEvent
);
143 /* Support legacy interface */
144 if (Reserved1
) *(PVOID
*)Reserved1
= EngEvent
;
150 EngUnmapEvent(IN PEVENT Event
)
152 /* Must be a usermapped event */
153 if (!(Event
->fFlags
& ENG_EVENT_USERMAPPED
)) return FALSE
;
155 /* Dereference the object, destroying it */
156 ObDereferenceObject(Event
->pKEvent
);
158 /* Free the Eng object */
165 EngWaitForSingleObject(IN PEVENT Event
,
166 IN PLARGE_INTEGER TimeOut
)
169 DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event
, TimeOut
->QuadPart
);
171 /* Validate parameters */
172 if (!Event
) return FALSE
;
174 /* Check if it's a usermapped event and fail in that case */
175 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
)
177 /* Disallow deletion of usermapped events */
178 DPRINT1("Driver attempted to wait on a usermapped event!\n");
182 /* Wait for the event */
183 Status
= KeWaitForSingleObject(Event
->pKEvent
,
189 /* Check if there is a failure or a timeout */
190 return NT_SUCCESS(Status
);