2 * PROJECT: ReactOS Video Port Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/video/videoprt/event.c
5 * PURPOSE: Event Support Routines
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
12 #include "../../gdi/eng/engevent.h"
17 /* PUBLIC FUNCTIONS ***********************************************************/
24 VideoPortCreateEvent(IN PVOID HwDeviceExtension
,
29 VP_STATUS Result
= NO_ERROR
;
30 PVIDEO_PORT_EVENT EngEvent
;
32 /* Allocate memory for the event structure */
33 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
34 sizeof(VIDEO_PORT_EVENT
) + sizeof(KEVENT
),
38 /* Set KEVENT pointer */
39 EngEvent
->pKEvent
= EngEvent
+ 1;
41 /* Initialize the kernel event */
42 KeInitializeEvent(EngEvent
->pKEvent
,
43 (EventFlag
& EVENT_TYPE_MASK
) ?
44 NotificationEvent
: SynchronizationEvent
,
45 EventFlag
& INITIAL_EVENT_STATE_MASK
);
47 /* Pass pointer to our structure to the caller */
48 *Event
= (PEVENT
)EngEvent
;
49 DPRINT("VideoPortCreateEvent() created %p\n", EngEvent
);
54 DPRINT("VideoPortCreateEvent() failed\n");
55 Result
= ERROR_NOT_ENOUGH_MEMORY
;
67 VideoPortDeleteEvent(IN PVOID HwDeviceExtension
,
70 /* Handle error cases */
71 if (!Event
) return ERROR_INVALID_PARAMETER
;
72 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
) return ERROR_INVALID_PARAMETER
;
73 if (!Event
->pKEvent
) return ERROR_INVALID_PARAMETER
;
78 /* Indicate success */
87 VideoPortSetEvent(IN PVOID HwDeviceExtension
,
90 return KeSetEvent(Event
->pKEvent
, IO_NO_INCREMENT
, FALSE
);
98 VideoPortClearEvent(IN PVOID HwDeviceExtension
,
101 KeClearEvent(Event
->pKEvent
);
109 VideoPortWaitForSingleObject(IN PVOID HwDeviceExtension
,
111 IN PLARGE_INTEGER Timeout OPTIONAL
)
113 PVIDEO_PORT_EVENT EngEvent
= Event
;
116 /* Handle error cases */
117 if (!EngEvent
) return ERROR_INVALID_PARAMETER
;
118 if (!EngEvent
->pKEvent
) return ERROR_INVALID_PARAMETER
;
119 if (EngEvent
->fFlags
& ENG_EVENT_USERMAPPED
) return ERROR_INVALID_PARAMETER
;
121 /* Do the actual wait */
122 Status
= KeWaitForSingleObject(EngEvent
->pKEvent
,
127 if (Status
== STATUS_TIMEOUT
)
129 /* Convert to wait timeout, otherwise NT_SUCCESS would return NO_ERROR */
132 else if (NT_SUCCESS(Status
))
134 /* All other success codes are Win32 success */
138 /* Otherwise, return default Win32 failure */
139 return ERROR_INVALID_PARAMETER
;