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 *******************************************************************/
17 /* PUBLIC FUNCTIONS ***********************************************************/
21 EngCreateEvent(OUT PEVENT
* Event
)
23 BOOLEAN Result
= TRUE
;
26 /* Allocate memory for the event structure */
27 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
28 sizeof(ENG_EVENT
) + sizeof(KEVENT
),
32 /* Set KEVENT pointer */
34 EngEvent
->pKEvent
= EngEvent
+ 1;
36 /* Initialize the kernel event */
37 KeInitializeEvent(EngEvent
->pKEvent
,
41 /* Pass pointer to our structure to the caller */
43 DPRINT("EngCreateEvent() created %p\n", EngEvent
);
48 DPRINT("EngCreateEvent() failed\n");
58 EngDeleteEvent(IN PEVENT Event
)
60 DPRINT("EngDeleteEvent(%p)\n", Event
);
62 /* Check if it's a usermapped event */
63 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
)
65 /* Disallow deletion of usermapped events */
66 DPRINT1("Driver attempted to delete a usermapped event!\n");
70 /* Free the allocated memory */
79 EngClearEvent(IN PEVENT Event
)
82 KeClearEvent(Event
->pKEvent
);
87 EngSetEvent(IN PEVENT Event
)
90 return KeSetEvent(Event
->pKEvent
,
97 EngReadStateEvent(IN PEVENT Event
)
99 /* Read the event state */
100 return KeReadStateEvent(Event
->pKEvent
);
105 EngMapEvent(IN HDEV hDev
,
106 IN HANDLE hUserObject
,
114 /* Allocate memory for the event structure */
115 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
118 if (!EngEvent
) return NULL
;
121 EngEvent
->fFlags
= 0;
122 EngEvent
->pKEvent
= NULL
;
124 /* Create a handle, and have Ob fill out the pKEvent field */
125 Status
= ObReferenceObjectByHandle(EngEvent
,
131 if (NT_SUCCESS(Status
))
133 /* Pulse the event and set that it's mapped by user */
134 KePulseEvent(EngEvent
->pKEvent
, EVENT_INCREMENT
, FALSE
);
135 EngEvent
->fFlags
|= ENG_EVENT_USERMAPPED
;
139 /* Free the allocation */
140 ExFreePool(EngEvent
);
144 /* Support legacy interface */
145 if (Reserved1
) *(PVOID
*)Reserved1
= EngEvent
;
151 EngUnmapEvent(IN PEVENT Event
)
153 /* Must be a usermapped event */
154 if (!(Event
->fFlags
& ENG_EVENT_USERMAPPED
)) return FALSE
;
156 /* Dereference the object, destroying it */
157 ObDereferenceObject(Event
->pKEvent
);
159 /* Free the Eng object */
166 EngWaitForSingleObject(IN PEVENT Event
,
167 IN PLARGE_INTEGER TimeOut
)
170 DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event
, TimeOut
->QuadPart
);
172 /* Validate parameters */
173 if (!Event
) return FALSE
;
175 /* Check if it's a usermapped event and fail in that case */
176 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
)
178 /* Disallow deletion of usermapped events */
179 DPRINT1("Driver attempted to wait on a usermapped event!\n");
183 /* Wait for the event */
184 Status
= KeWaitForSingleObject(Event
->pKEvent
,
190 /* Check if there is a failure or a timeout */
191 return NT_SUCCESS(Status
);