diff --git a/reactos/drivers/video/videoprt/event.c b/reactos/drivers/video/videoprt/event.c
index 06ea92248ea..4cc1e82ea8b 100644
--- a/reactos/drivers/video/videoprt/event.c
+++ b/reactos/drivers/video/videoprt/event.c
@@ -35,22 +35,30 @@ VideoPortCreateEvent(
IN PVOID Unused,
OUT PEVENT *Event)
{
- EVENT_TYPE Type;
+ PVIDEO_PORT_EVENT VpEvent;
+ EVENT_TYPE Type = SynchronizationEvent;
- (*Event) = ExAllocatePoolWithTag(
+ /* Allocate storage for the event structure */
+ VpEvent = ExAllocatePoolWithTag(
NonPagedPool,
- sizeof(KEVENT),
+ sizeof(VIDEO_PORT_EVENT),
TAG_VIDEO_PORT);
- if ((*Event) == NULL)
- return ERROR_NOT_ENOUGH_MEMORY;
+ /* Fail if not enough memory */
+ if (!VpEvent) return ERROR_NOT_ENOUGH_MEMORY;
+ /* Initialize the event structure */
+ RtlZeroMemory(VpEvent, sizeof(VIDEO_PORT_EVENT));
+ VpEvent->pKEvent = &VpEvent->Event;
+
+ /* Determine the event type */
if (EventFlag & NOTIFICATION_EVENT)
Type = NotificationEvent;
- else
- Type = SynchronizationEvent;
- KeInitializeEvent((PKEVENT)*Event, Type, EventFlag & INITIAL_EVENT_SIGNALED);
+ /* Initialize kernel event */
+ KeInitializeEvent(VpEvent->pKEvent, Type, EventFlag & INITIAL_EVENT_SIGNALED);
+
+ /* Indicate success */
return NO_ERROR;
}
@@ -63,7 +71,10 @@ VideoPortDeleteEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
+ /* Free storage */
ExFreePool(Event);
+
+ /* Indicate success */
return NO_ERROR;
}
@@ -76,7 +87,7 @@ VideoPortSetEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
- return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE);
+ return KeSetEvent(Event->pKEvent, IO_NO_INCREMENT, FALSE);
}
/*
@@ -88,7 +99,7 @@ VideoPortClearEvent(
IN PVOID HwDeviceExtension,
IN PEVENT Event)
{
- KeClearEvent((PKEVENT)Event);
+ KeClearEvent(Event->pKEvent);
}
/*
diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h
index 9e66cd4f3a7..ca4854d642b 100644
--- a/reactos/drivers/video/videoprt/videoprt.h
+++ b/reactos/drivers/video/videoprt/videoprt.h
@@ -104,6 +104,15 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION
VIDEO_PORT_DEVICE_EXTENSION, \
MiniPortDeviceExtension)
+typedef struct _VIDEO_PORT_EVENT
+{
+ /* Public part */
+ ENG_EVENT;
+
+ /* Private part */
+ KEVENT Event;
+} VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT;
+
/* agp.c */
NTSTATUS
diff --git a/reactos/drivers/video/videoprt/videoprt.rbuild b/reactos/drivers/video/videoprt/videoprt.rbuild
index 33e85561e6e..992c20f3473 100644
--- a/reactos/drivers/video/videoprt/videoprt.rbuild
+++ b/reactos/drivers/video/videoprt/videoprt.rbuild
@@ -5,6 +5,7 @@
.
include
+ -fms-extensions
ntoskrnl
hal
videoprt.h
diff --git a/reactos/subsystems/win32/win32k/eng/engevent.c b/reactos/subsystems/win32/win32k/eng/engevent.c
new file mode 100644
index 00000000000..890000e88b6
--- /dev/null
+++ b/reactos/subsystems/win32/win32k/eng/engevent.c
@@ -0,0 +1,159 @@
+/*
+ * PROJECT: ReactOS Win32K
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: subsystems/win32/win32k/eng/engevent.c
+ * PURPOSE: Event Support Routines
+ * PROGRAMMERS: Aleksey Bragin
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+#define TAG_ENG TAG('E', 'n', 'g', ' ')
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+BOOL
+APIENTRY
+EngCreateEvent(OUT PEVENT* Event)
+{
+ PENG_EVENT EngEvent;
+
+ /* Allocate memory for the event structure */
+ EngEvent = EngAllocMem(FL_NONPAGED_MEMORY | FL_ZERO_MEMORY,
+ sizeof(ENG_EVENT),
+ TAG_ENG);
+
+ /* Check if we are out of memory */
+ if (!EngEvent)
+ {
+ /* We are, fail */
+ return FALSE;
+ }
+
+ /* Set KEVENT pointer */
+ EngEvent->pKEvent = &EngEvent->KEvent;
+
+ /* Initialize the kernel event */
+ KeInitializeEvent(EngEvent->pKEvent,
+ SynchronizationEvent,
+ FALSE);
+
+ /* Pass pointer to our structure to the caller */
+ *Event = EngEvent;
+
+ DPRINT("EngCreateEvent() created %p\n", EngEvent);
+
+ /* Return success */
+ return TRUE;
+}
+
+BOOL
+APIENTRY
+EngDeleteEvent(IN PEVENT Event)
+{
+ DPRINT("EngDeleteEvent(%p)\n", Event);
+
+ /* Check if it's a usermapped event */
+ if (Event->fFlags & ENG_EVENT_USERMAPPED)
+ {
+ /* Disallow deletion of usermapped events */
+ DPRINT1("Driver attempted to delete a usermapped event!\n");
+ return FALSE;
+ }
+
+ /* Free the allocated memory */
+ EngFreeMem(Event);
+
+ /* Return success */
+ return TRUE;
+}
+
+VOID
+APIENTRY
+EngClearEvent(IN PEVENT Event)
+{
+ /* Clear the event */
+ KeClearEvent(Event->pKEvent);
+}
+
+LONG
+APIENTRY
+EngSetEvent(IN PEVENT Event)
+{
+ /* Set the event */
+ return KeSetEvent(Event->pKEvent,
+ IO_NO_INCREMENT,
+ FALSE);
+}
+
+LONG
+APIENTRY
+EngReadStateEvent(IN PEVENT Event)
+{
+ /* Read the event state */
+ return KeReadStateEvent(Event->pKEvent);
+}
+
+PEVENT
+APIENTRY
+EngMapEvent(IN HDEV hDev,
+ IN HANDLE hUserObject,
+ IN PVOID Reserved1,
+ IN PVOID Reserved2,
+ IN PVOID Reserved3)
+{
+ DPRINT("EngMapEvent(%x %x %p %p %p)\n", hDev, hUserObject, Reserved1, Reserved2, Reserved3);
+ UNIMPLEMENTED;
+ return NULL;
+}
+
+BOOL
+APIENTRY
+EngUnmapEvent(IN PEVENT Event)
+{
+ DPRINT("EngUnmapEvent(%p)\n", Event);
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+BOOL
+APIENTRY
+EngWaitForSingleObject(IN PEVENT Event,
+ IN PLARGE_INTEGER TimeOut)
+{
+ NTSTATUS Status;
+
+ DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event, TimeOut->QuadPart);
+
+ /* Validate parameters */
+ if (!Event) return FALSE;
+
+ /* Check if it's a usermapped event and fail in that case */
+ if (Event->fFlags & ENG_EVENT_USERMAPPED)
+ {
+ /* Disallow deletion of usermapped events */
+ DPRINT1("Driver attempted to wait on a usermapped event!\n");
+ return FALSE;
+ }
+
+ /* Wait for the event */
+ Status = KeWaitForSingleObject(Event->pKEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ TimeOut);
+
+ /* Check if there is a failure or a timeout */
+ if (!NT_SUCCESS(Status))
+ {
+ /* Return failure */
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
+}
diff --git a/reactos/subsystems/win32/win32k/eng/event.c b/reactos/subsystems/win32/win32k/eng/event.c
deleted file mode 100644
index 879887c3951..00000000000
--- a/reactos/subsystems/win32/win32k/eng/event.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * PURPOSE: Win32k event functions
- * FILE: subsys/win32k/eng/event.c
- * PROGRAMER: Jason Filby
- * REVISION HISTORY:
- * 2/10/1999: Created
- */
-
-#include
-
-#define NDEBUG
-#include
-
-BOOL
-APIENTRY
-EngCreateEvent ( OUT PEVENT *Event )
-{
- (*Event) = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_DFSM);
- if ((*Event) == NULL)
- {
- return FALSE;
- }
- KeInitializeEvent((PKEVENT)(*Event), SynchronizationEvent, FALSE);
- return TRUE;
-}
-
-BOOL
-APIENTRY
-EngDeleteEvent ( IN PEVENT Event)
-{
- ExFreePoolWithTag(Event, TAG_DFSM);
- return TRUE;
-}
-
-PEVENT
-APIENTRY
-EngMapEvent(IN HDEV Dev,
- IN HANDLE UserObject,
- IN PVOID Reserved1,
- IN PVOID Reserved2,
- IN PVOID Reserved3)
-{
- NTSTATUS Status;
- PKEVENT Event;
-
- Event = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_DFSM);
- if (!Event) return NULL;
-
- Status = ObReferenceObjectByHandle(UserObject,
- EVENT_MODIFY_STATE,
- ExEventObjectType,
- KernelMode,
- (PVOID*)&Event,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- ExFreePoolWithTag(Event, TAG_DFSM);
- return NULL;
- }
- else
- KePulseEvent(Event, EVENT_INCREMENT, FALSE);
-
- if (Reserved1) Reserved1 = Event;
-
- return (PEVENT)Event;
-}
-
-LONG
-APIENTRY
-EngSetEvent ( IN PEVENT Event )
-{
- return KeSetEvent((PKEVENT)Event, IO_NO_INCREMENT, FALSE);
-}
-
-BOOL
-APIENTRY
-EngUnmapEvent ( IN PEVENT Event )
-{
- ObDereferenceObject((PVOID)Event);
- ExFreePoolWithTag(Event, TAG_DFSM);
- return TRUE;
-}
-
-BOOL
-APIENTRY
-EngWaitForSingleObject (IN PEVENT Event,
- IN PLARGE_INTEGER TimeOut)
-{
- NTSTATUS Status;
-
- if (!Event) return FALSE;
-
- Status = KeWaitForSingleObject(Event,
- Executive,
- KernelMode,
- FALSE,
- TimeOut);
- if (!NT_SUCCESS(Status))
- {
- return FALSE;
- }
- return TRUE;
-}
diff --git a/reactos/subsystems/win32/win32k/include/engevent.h b/reactos/subsystems/win32/win32k/include/engevent.h
new file mode 100644
index 00000000000..98ffb54c302
--- /dev/null
+++ b/reactos/subsystems/win32/win32k/include/engevent.h
@@ -0,0 +1,16 @@
+#ifndef __WIN32K_ENGEVENT_H
+#define __WIN32K_ENGEVENT_H
+
+#define ENG_EVENT_USERMAPPED 1
+
+typedef struct _ENG_EVENT
+{
+ /* Public part */
+ PVOID pKEvent;
+ ULONG fFlags;
+
+ /* Private part */
+ KEVENT KEvent;
+} ENG_EVENT, *PENG_EVENT;
+
+#endif
diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32k.h
index 75c1b305948..d924ba2abf2 100644
--- a/reactos/subsystems/win32/win32k/include/win32k.h
+++ b/reactos/subsystems/win32/win32k/include/win32k.h
@@ -76,6 +76,7 @@
#include
#include
#include
+#include
#include
#endif /* __WIN32K_H */
diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c
index fbd47ae681b..367b6310a23 100644
--- a/reactos/subsystems/win32/win32k/stubs/stubs.c
+++ b/reactos/subsystems/win32/win32k/stubs/stubs.c
@@ -796,18 +796,6 @@ BRUSHOBJ_hGetColorTransform(
return NULL;
}
-/*
- * @unimplemented
- */
-VOID
-APIENTRY
-EngClearEvent(
- IN PEVENT Event)
-{
- /* Forward to the kernel */
- KeClearEvent((PKEVENT)Event);
-}
-
/*
* @unimplemented
*/
@@ -925,17 +913,6 @@ EngQueryFileTimeStamp(IN LPWSTR FileName)
return FileTime;
}
-/*
- * @unimplemented
- */
-LONG APIENTRY
-EngReadStateEvent(
- IN PEVENT Event)
-{
- UNIMPLEMENTED;
- return 0;
-}
-
/*
* @unimplemented
*/
diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild
index 55fef3fd803..2f0c78ad875 100644
--- a/reactos/subsystems/win32/win32k/win32k.rbuild
+++ b/reactos/subsystems/win32/win32k/win32k.rbuild
@@ -48,13 +48,13 @@
alphablend.c
bitblt.c
engbrush.c
+ engevent.c
clip.c
copybits.c
debug.c
device.c
driverobj.c
error.c
- event.c
float.c