Author: sir_richard Date: Sat Jan 1 18:15:25 2011 New Revision: 50256
URL: http://svn.reactos.org/svn/reactos?rev=50256&view=rev Log: [VIDEOPRT/WIN32K]: Synchronize and share PEVENT/ENG_EVENT/VIDEO_PORT_EVENT implementation, as these objects are actually the same (and VideoPrt Event* APIs can be used on GRE Event Objects). Use ENG_EVENT structure from ntddvdeo.h instead of re-creating our own. Drivers using these interfaces will no longer explode. [VIDEOPRT]: Add parameter checks to DeleteEvent and WaitForSingleObject. [VIDEOPRT]: Fix WaitForSingleObject. It was waiting on the Object paramter itself -- which is the VideoPrt/ENG Event, not a real object, we have to wait on ->pKEvent instead. [VIDEOPRT]: Fix WaitForSingleObject round two, it was returning the NT_STATUS, while VideoPrt should return VP_STATUS/Win32 error codes. [WIN32K]: Allocate/free GRE events directly from pool, instead of using Eng APIs. Use documented tag for GRE Events (Dfsm), found in pooltag.txt [WIN32K]: Implement EngMapEvent and EngUnmapEvent.
Modified: trunk/reactos/drivers/video/videoprt/event.c trunk/reactos/drivers/video/videoprt/videoprt.h trunk/reactos/subsystems/win32/win32k/eng/engevent.c trunk/reactos/subsystems/win32/win32k/include/engevent.h
Modified: trunk/reactos/drivers/video/videoprt/event.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/even... ============================================================================== --- trunk/reactos/drivers/video/videoprt/event.c [iso-8859-1] (original) +++ trunk/reactos/drivers/video/videoprt/event.c [iso-8859-1] Sat Jan 1 18:15:25 2011 @@ -1,120 +1,140 @@ /* - * VideoPort driver - * - * Copyright (C) 2002, 2003, 2004 ReactOS Team - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * PROJECT: ReactOS Video Port Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: drivers/video/videoprt/event.c + * PURPOSE: Event Support Routines + * PROGRAMMERS: ReactOS Portable Systems Group */
+/* INCLUDES *******************************************************************/ + #include "videoprt.h" +#include "../../subsystems/win32/win32k/include/engevent.h"
/* PUBLIC FUNCTIONS ***********************************************************/
/* * @implemented */ +VP_STATUS +NTAPI +VideoPortCreateEvent(IN PVOID HwDeviceExtension, + IN ULONG EventFlag, + IN PVOID Unused, + OUT PEVENT *Event) +{ + VP_STATUS Result = NO_ERROR; + PVIDEO_PORT_EVENT EngEvent;
-VP_STATUS NTAPI -VideoPortCreateEvent( - IN PVOID HwDeviceExtension, - IN ULONG EventFlag, - IN PVOID Unused, - OUT PEVENT *Event) -{ - PVIDEO_PORT_EVENT VpEvent; - EVENT_TYPE Type = SynchronizationEvent; + /* Allocate memory for the event structure */ + EngEvent = ExAllocatePoolWithTag(NonPagedPool, + sizeof(VIDEO_PORT_EVENT) + sizeof(KEVENT), + TAG_VIDEO_PORT); + if (EngEvent) + { + /* Set KEVENT pointer */ + EngEvent->pKEvent = EngEvent + 1; + + /* Initialize the kernel event */ + KeInitializeEvent(EngEvent->pKEvent, + (EventFlag & EVENT_TYPE_MASK) ? + NotificationEvent : SynchronizationEvent, + EventFlag & INITIAL_EVENT_STATE_MASK);
- /* Allocate storage for the event structure */ - VpEvent = ExAllocatePoolWithTag( - NonPagedPool, - sizeof(VIDEO_PORT_EVENT), - TAG_VIDEO_PORT); + /* Pass pointer to our structure to the caller */ + *Event = (PEVENT)EngEvent; + DPRINT("VideoPortCreateEvent() created %p\n", EngEvent); + } + else + { + /* Out of memory */ + DPRINT("VideoPortCreateEvent() failed\n"); + Result = 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; - - /* Initialize kernel event */ - KeInitializeEvent(VpEvent->pKEvent, Type, EventFlag & INITIAL_EVENT_SIGNALED); - - /* Indicate success */ - return NO_ERROR; + /* Return result */ + return Result; }
/* * @implemented */ +VP_STATUS +NTAPI +VideoPortDeleteEvent(IN PVOID HwDeviceExtension, + IN PEVENT Event) +{ + /* Handle error cases */ + if (!Event) return ERROR_INVALID_PARAMETER; + if (Event->fFlags & ENG_EVENT_USERMAPPED) return ERROR_INVALID_PARAMETER; + if (!Event->pKEvent) return ERROR_INVALID_PARAMETER;
-VP_STATUS NTAPI -VideoPortDeleteEvent( - IN PVOID HwDeviceExtension, - IN PEVENT Event) -{ - /* Free storage */ - ExFreePool(Event); + /* Free storage */ + ExFreePool(Event);
- /* Indicate success */ - return NO_ERROR; + /* Indicate success */ + return NO_ERROR; }
/* * @implemented */ - -LONG NTAPI -VideoPortSetEvent( - IN PVOID HwDeviceExtension, - IN PEVENT Event) +LONG +NTAPI +VideoPortSetEvent(IN PVOID HwDeviceExtension, + IN PEVENT Event) { - return KeSetEvent(Event->pKEvent, IO_NO_INCREMENT, FALSE); + return KeSetEvent(Event->pKEvent, IO_NO_INCREMENT, FALSE); }
/* * @implemented */ - -VOID NTAPI -VideoPortClearEvent( - IN PVOID HwDeviceExtension, - IN PEVENT Event) +VOID +NTAPI +VideoPortClearEvent(IN PVOID HwDeviceExtension, + IN PEVENT Event) { - KeClearEvent(Event->pKEvent); + KeClearEvent(Event->pKEvent); }
/* * @implemented */ +VP_STATUS +NTAPI +VideoPortWaitForSingleObject(IN PVOID HwDeviceExtension, + IN PVOID Event, + IN PLARGE_INTEGER Timeout OPTIONAL) +{ + PVIDEO_PORT_EVENT EngEvent = Event; + NTSTATUS Status; + + /* Handle error cases */ + if (!EngEvent) return ERROR_INVALID_PARAMETER; + if (!EngEvent->pKEvent) return ERROR_INVALID_PARAMETER; + if (EngEvent->fFlags & ENG_EVENT_USERMAPPED) return ERROR_INVALID_PARAMETER; + + /* Do the actual wait */ + Status = KeWaitForSingleObject(EngEvent->pKEvent, + Executive, + KernelMode, + FALSE, + Timeout); + if (Status == STATUS_TIMEOUT) + { + /* Convert to wait timeout, otherwise NT_SUCCESS would return NO_ERROR */ + return WAIT_TIMEOUT; + } + else if (NT_SUCCESS(Status)) + { + /* All other success codes are Win32 success */ + return NO_ERROR; + } + + /* Otherwise, return default Win32 failure */ + return ERROR_INVALID_PARAMETER; +}
-VP_STATUS NTAPI -VideoPortWaitForSingleObject( - IN PVOID HwDeviceExtension, - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL) -{ - return KeWaitForSingleObject( - Object, - Executive, - KernelMode, - FALSE, - Timeout); -} +/* EOF */ +
Modified: trunk/reactos/drivers/video/videoprt/videoprt.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/vide... ============================================================================== --- trunk/reactos/drivers/video/videoprt/videoprt.h [iso-8859-1] (original) +++ trunk/reactos/drivers/video/videoprt/videoprt.h [iso-8859-1] Sat Jan 1 18:15:25 2011 @@ -107,11 +107,7 @@
typedef struct _VIDEO_PORT_EVENT { - /* Public part */ ENG_EVENT; - - /* Private part */ - KEVENT Event; } VIDEO_PORT_EVENT, *PVIDEO_PORT_EVENT;
/* agp.c */
Modified: trunk/reactos/subsystems/win32/win32k/eng/engevent.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/eng... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/eng/engevent.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/eng/engevent.c [iso-8859-1] Sat Jan 1 18:15:25 2011 @@ -1,54 +1,59 @@ /* * PROJECT: ReactOS Win32K - * LICENSE: GPL - See COPYING in the top level directory + * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: subsystems/win32/win32k/eng/engevent.c * PURPOSE: Event Support Routines * PROGRAMMERS: Aleksey Bragin aleksey@reactos.org + * ReactOS Portable Systems Group */
-/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/
#include <win32k.h> +#include <ntddvdeo.h> #define NDEBUG #include <debug.h>
-#define TAG_ENG ' gnE' +/* Dfsm - <unknown> - Eng event allocation (ENG_KEVENTALLOC,ENG_ALLOC) in ntgdi\gre */ +#define TAG_GRE_EVENT 'msfD'
-/* PUBLIC FUNCTIONS **********************************************************/ +/* PUBLIC FUNCTIONS ***********************************************************/
BOOL APIENTRY EngCreateEvent(OUT PEVENT* Event) { + BOOLEAN Result = TRUE; PENG_EVENT EngEvent;
/* Allocate memory for the event structure */ - EngEvent = EngAllocMem(FL_NONPAGED_MEMORY | FL_ZERO_MEMORY, - sizeof(ENG_EVENT), - TAG_ENG); + EngEvent = ExAllocatePoolWithTag(NonPagedPool, + sizeof(ENG_EVENT) + sizeof(KEVENT), + TAG_GRE_EVENT); + if (EngEvent) + { + /* Set KEVENT pointer */ + EngEvent->fFlags = 0; + EngEvent->pKEvent = EngEvent + 1;
- /* Check if we are out of memory */ - if (!EngEvent) + /* 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); + } + else { - /* We are, fail */ - return FALSE; + /* Out of memory */ + DPRINT("EngCreateEvent() failed\n"); + Result = 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; + /* Return result */ + return Result; }
BOOL @@ -66,7 +71,7 @@ }
/* Free the allocated memory */ - EngFreeMem(Event); + ExFreePool(Event);
/* Return success */ return TRUE; @@ -106,18 +111,57 @@ IN PVOID Reserved2, IN PVOID Reserved3) { - DPRINT("EngMapEvent(%x %x %p %p %p)\n", hDev, hUserObject, Reserved1, Reserved2, Reserved3); - UNIMPLEMENTED; - return NULL; + PENG_EVENT EngEvent; + NTSTATUS Status; + + /* Allocate memory for the event structure */ + EngEvent = ExAllocatePoolWithTag(NonPagedPool, + sizeof(ENG_EVENT), + TAG_GRE_EVENT); + if (!EngEvent) return NULL; + + /* Zero it out */ + EngEvent->fFlags = 0; + EngEvent->pKEvent = NULL; + + /* Create a handle, and have Ob fill out the pKEvent field */ + Status = ObReferenceObjectByHandle(EngEvent, + EVENT_ALL_ACCESS, + ExEventObjectType, + UserMode, + &EngEvent->pKEvent, + NULL); + if (NT_SUCCESS(Status)) + { + /* Pulse the event and set that it's mapped by user */ + KePulseEvent(EngEvent->pKEvent, EVENT_INCREMENT, FALSE); + EngEvent->fFlags |= ENG_EVENT_USERMAPPED; + } + else + { + /* Free the allocation */ + ExFreePool(EngEvent); + EngEvent = NULL; + } + + /* Support legacy interface */ + if (Reserved1) *(PVOID*)Reserved1 = EngEvent; + return EngEvent; }
BOOL APIENTRY EngUnmapEvent(IN PEVENT Event) { - DPRINT("EngUnmapEvent(%p)\n", Event); - UNIMPLEMENTED; - return FALSE; + /* Must be a usermapped event */ + if (!(Event->fFlags & ENG_EVENT_USERMAPPED)) return FALSE; + + /* Dereference the object, destroying it */ + ObDereferenceObject(Event->pKEvent); + + /* Free the Eng object */ + ExFreePool(Event); + return TRUE; }
BOOL @@ -126,7 +170,6 @@ IN PLARGE_INTEGER TimeOut) { NTSTATUS Status; - DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event, TimeOut->QuadPart);
/* Validate parameters */ @@ -148,12 +191,7 @@ TimeOut);
/* Check if there is a failure or a timeout */ - if (!NT_SUCCESS(Status)) - { - /* Return failure */ - return FALSE; - } + return NT_SUCCESS(Status); +}
- /* Return success */ - return TRUE; -} +/* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/include/engevent.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/engevent.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/engevent.h [iso-8859-1] Sat Jan 1 18:15:25 2011 @@ -1,13 +1,8 @@ #pragma once
-#define ENG_EVENT_USERMAPPED 1 +// +// Flags for the fFlags field of ENG_EVENT +// +#define ENG_EVENT_USERMAPPED 0x01
-typedef struct _ENG_EVENT -{ - /* Public part */ - PVOID pKEvent; - ULONG fFlags; - - /* Private part */ - KEVENT KEvent; -} ENG_EVENT, *PENG_EVENT; +/* EOF */