2 * PROJECT: ReactOS Video Port Driver
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: win32ss/drivers/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 ***********************************************************/
25 _In_ PVOID HwDeviceExtension
,
30 VP_STATUS Result
= NO_ERROR
;
31 PVIDEO_PORT_EVENT EngEvent
;
33 /* Allocate memory for the event structure */
34 EngEvent
= ExAllocatePoolWithTag(NonPagedPool
,
35 sizeof(VIDEO_PORT_EVENT
) + sizeof(KEVENT
),
42 /* Set KEVENT pointer */
43 EngEvent
->pKEvent
= EngEvent
+ 1;
45 /* Initialize the kernel event */
46 KeInitializeEvent(EngEvent
->pKEvent
,
47 (EventFlag
& EVENT_TYPE_MASK
) ?
48 NotificationEvent
: SynchronizationEvent
,
49 EventFlag
& INITIAL_EVENT_STATE_MASK
);
51 /* Pass pointer to our structure to the caller */
52 *pEvent
= (PEVENT
)EngEvent
;
53 DPRINT("VideoPortCreateEvent() created %p\n", EngEvent
);
58 DPRINT("VideoPortCreateEvent() failed\n");
59 Result
= ERROR_NOT_ENOUGH_MEMORY
;
72 _In_ PVOID HwDeviceExtension
,
75 /* Handle error cases */
76 if (!Event
) return ERROR_INVALID_PARAMETER
;
77 if (Event
->fFlags
& ENG_EVENT_USERMAPPED
) return ERROR_INVALID_PARAMETER
;
78 if (!Event
->pKEvent
) return ERROR_INVALID_PARAMETER
;
81 ExFreePoolWithTag(Event
, TAG_VIDEO_PORT
);
83 /* Indicate success */
93 _In_ PVOID HwDeviceExtension
,
97 return KeSetEvent(Event
->pKEvent
, IO_NO_INCREMENT
, FALSE
);
106 _In_ PVOID HwDeviceExtension
,
110 KeClearEvent(Event
->pKEvent
);
118 VideoPortReadStateEvent(
119 _In_ PVOID HwDeviceExtension
,
123 return KeReadStateEvent(Event
->pKEvent
);
131 VideoPortWaitForSingleObject(
132 _In_ PVOID HwDeviceExtension
,
134 _In_opt_ PLARGE_INTEGER Timeout
)
136 PVIDEO_PORT_EVENT EngEvent
= Event
;
139 /* Handle error cases */
140 if (!EngEvent
) return ERROR_INVALID_PARAMETER
;
141 if (!EngEvent
->pKEvent
) return ERROR_INVALID_PARAMETER
;
142 if (EngEvent
->fFlags
& ENG_EVENT_USERMAPPED
) return ERROR_INVALID_PARAMETER
;
144 /* Do the actual wait */
145 Status
= KeWaitForSingleObject(EngEvent
->pKEvent
,
150 if (Status
== STATUS_TIMEOUT
)
152 /* Convert to wait timeout, otherwise NT_SUCCESS would return NO_ERROR */
155 else if (NT_SUCCESS(Status
))
157 /* All other success codes are Win32 success */
161 /* Otherwise, return default Win32 failure */
162 return ERROR_INVALID_PARAMETER
;