- Update to r53061
[reactos.git] / drivers / video / videoprt / event.c
index 5d04a75..c435975 100644 (file)
 /*
- * 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
+NTAPI
+VideoPortCreateEvent(IN PVOID HwDeviceExtension,
+                     IN ULONG EventFlag,
+                     IN PVOID Unused,
+                     OUT PEVENT *Event)
 {
-   PVIDEO_PORT_EVENT VpEvent;
-   EVENT_TYPE Type = SynchronizationEvent;
-
-   /* Allocate storage for the event structure */
-   VpEvent = ExAllocatePoolWithTag(
-      NonPagedPool,
-      sizeof(VIDEO_PORT_EVENT),
-      TAG_VIDEO_PORT);
-
-   /* 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;
+    VP_STATUS Result = NO_ERROR;
+    PVIDEO_PORT_EVENT EngEvent;
+
+    /* 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);
+
+        /* 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;
+    }
+
+    /* Return result */
+    return Result;
 }
 
 /*
  * @implemented
  */
-
-VP_STATUS NTAPI
-VideoPortDeleteEvent(
-   IN PVOID HwDeviceExtension,
-   IN PEVENT Event)
+VP_STATUS
+NTAPI
+VideoPortDeleteEvent(IN PVOID HwDeviceExtension,
+                     IN PEVENT Event)
 {
-   /* Free storage */
-   ExFreePool(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;
+
+    /* 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 Object,
-   IN PLARGE_INTEGER Timeout OPTIONAL)
+VP_STATUS
+NTAPI
+VideoPortWaitForSingleObject(IN PVOID HwDeviceExtension,
+                             IN PVOID Event,
+                             IN PLARGE_INTEGER Timeout OPTIONAL)
 {
-   return KeWaitForSingleObject(
-      Object,
-      Executive,
-      KernelMode,
-      FALSE,
-      Timeout);
+    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;
 }
+
+/* EOF */
+