From e468760dd83aa91553fc9a7b0404dfe8167bddd4 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 30 Jun 2009 13:42:42 +0000 Subject: [PATCH] - Rewrite VideoPort and Win32k (Eng) event functions to: * Use a documented ENG_EVENT structure (thus be compatible with Windows videoprt/win32k) instead of a stupid (PKEVENT) casting everywhere through EngEvent or VideoPort event functions; * Implement additional checks for user mapped events in EngDeleteEvent and EngWaitForSingleObject; * Implement EngReadStateEvent and EngClearEvent. * Provide a better, readable code which matches kernelstyle coding guidelines; * Remove (stub out) totally incorrect and buggy map user events support; - Compile videoprt with ms-extensions flag enabled. svn path=/trunk/; revision=41713 --- reactos/drivers/video/videoprt/event.c | 31 ++-- reactos/drivers/video/videoprt/videoprt.h | 9 + .../drivers/video/videoprt/videoprt.rbuild | 1 + .../subsystems/win32/win32k/eng/engevent.c | 159 ++++++++++++++++++ reactos/subsystems/win32/win32k/eng/event.c | 105 ------------ .../win32/win32k/include/engevent.h | 16 ++ .../subsystems/win32/win32k/include/win32k.h | 1 + reactos/subsystems/win32/win32k/stubs/stubs.c | 23 --- reactos/subsystems/win32/win32k/win32k.rbuild | 2 +- 9 files changed, 208 insertions(+), 139 deletions(-) create mode 100644 reactos/subsystems/win32/win32k/eng/engevent.c delete mode 100644 reactos/subsystems/win32/win32k/eng/event.c create mode 100644 reactos/subsystems/win32/win32k/include/engevent.h 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