- 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
This commit is contained in:
Aleksey Bragin 2009-06-30 13:42:42 +00:00
parent 615a35bf83
commit e468760dd8
9 changed files with 208 additions and 139 deletions

View file

@ -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);
}
/*

View file

@ -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

View file

@ -5,6 +5,7 @@
<include base="videoprt">.</include>
<include base="ntoskrnl">include</include>
<define name="_VIDEOPORT_" />
<compilerflag compilerset="gcc">-fms-extensions</compilerflag>
<library>ntoskrnl</library>
<library>hal</library>
<pch>videoprt.h</pch>

View file

@ -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 <aleksey@reactos.org>
*/
/* INCLUDES ******************************************************************/
#include <w32k.h>
#define NDEBUG
#include <debug.h>
#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;
}

View file

@ -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 <w32k.h>
#define NDEBUG
#include <debug.h>
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;
}

View file

@ -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

View file

@ -76,6 +76,7 @@
#include <include/misc.h>
#include <include/gdifloat.h>
#include <include/engobjects.h>
#include <include/engevent.h>
#include <dib/dib.h>
#endif /* __WIN32K_H */

View file

@ -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
*/

View file

@ -48,13 +48,13 @@
<file>alphablend.c</file>
<file>bitblt.c</file>
<file>engbrush.c</file>
<file>engevent.c</file>
<file>clip.c</file>
<file>copybits.c</file>
<file>debug.c</file>
<file>device.c</file>
<file>driverobj.c</file>
<file>error.c</file>
<file>event.c</file>
<file>float.c</file>
<if property="ARCH" value="i386">
<directory name="i386">