[VIDEOPRT]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Fri, 22 Nov 2013 11:36:22 +0000 (11:36 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Fri, 22 Nov 2013 11:36:22 +0000 (11:36 +0000)
Handle IOCTL_VIDEO_USE_DEVICE_IN_SESSION

svn path=/trunk/; revision=61071

reactos/include/psdk/ntddvdeo.h
reactos/win32ss/drivers/videoprt/dispatch.c
reactos/win32ss/drivers/videoprt/videoprt.c
reactos/win32ss/drivers/videoprt/videoprt.h

index 728f5a6..8fcd361 100644 (file)
@@ -265,6 +265,11 @@ typedef struct _VIDEO_WIN32K_CALLBACKS {
   OUT ULONG DualviewFlags;
 } VIDEO_WIN32K_CALLBACKS, *PVIDEO_WIN32K_CALLBACKS;
 
+typedef struct _VIDEO_DEVICE_SESSION_STATUS {
+  ULONG bEnable;
+  ULONG bSuccess;
+} VIDEO_DEVICE_SESSION_STATUS, *PVIDEO_DEVICE_SESSION_STATUS;
+
 typedef struct _VIDEO_MEMORY {
   PVOID RequestedVirtualAddress;
 } VIDEO_MEMORY, *PVIDEO_MEMORY;
@@ -559,6 +564,7 @@ typedef struct _DISPLAY_BRIGHTNESS {
 #define DISPLAYPOLICY_DC                0x00000002
 #define DISPLAYPOLICY_BOTH              0x00000003
 
+
 #ifdef __cplusplus
 }
 #endif
index 73be3f4..9a4d026 100644 (file)
@@ -287,15 +287,77 @@ IoctlName(ULONG Ioctl)
     return "<unknown ioctl code";
 }
 
+static
+NTSTATUS
+VideoPortUseDeviceInSesion(
+    _Inout_ PDEVICE_OBJECT DeviceObject,
+    _Inout_ PVIDEO_DEVICE_SESSION_STATUS SessionState,
+    _In_ ULONG BufferLength,
+    _Out_ PULONG_PTR Information)
+{
+    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
+
+    /* Check buffer size */
+    *Information = sizeof(VIDEO_DEVICE_SESSION_STATUS);
+    if (BufferLength < sizeof(VIDEO_DEVICE_SESSION_STATUS))
+    {
+        ERR_(VIDEOPRT, "Buffer too small for VIDEO_DEVICE_SESSION_STATUS: %lx\n",
+             BufferLength);
+        return STATUS_BUFFER_TOO_SMALL;
+    }
+
+    /* Get the device extension */
+    DeviceExtension = DeviceObject->DeviceExtension;
+
+    /* Shall we enable the session? */
+    if (SessionState->bEnable)
+    {
+        /* Check if we have no session yet */
+        if (DeviceExtension->SessionId == -1)
+        {
+            /* Use this session and return success */
+            DeviceExtension->SessionId = PsGetCurrentProcessSessionId();
+            SessionState->bSuccess = TRUE;
+        }
+        else
+        {
+            ERR_(VIDEOPRT, "Requested to set session, but session is already set to: 0x%lx",
+                 DeviceExtension->SessionId);
+            SessionState->bSuccess = FALSE;
+        }
+    }
+    else
+    {
+        /* Check if we belong to the current session */
+        if (DeviceExtension->SessionId == PsGetCurrentProcessSessionId())
+        {
+            /* Reset the session and return success */
+            DeviceExtension->SessionId = -1;
+            SessionState->bSuccess = TRUE;
+        }
+        else
+        {
+            ERR_(VIDEOPRT, "Requested to reset session, but session is not set\n");
+            SessionState->bSuccess = FALSE;
+        }
+    }
+
+    return STATUS_SUCCESS;
+}
+
 static
 NTSTATUS
 VideoPortInitWin32kCallbacks(
-    IN PDEVICE_OBJECT DeviceObject,
-    PVIDEO_WIN32K_CALLBACKS Win32kCallbacks,
-    ULONG BufferLength)
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _Inout_ PVIDEO_WIN32K_CALLBACKS Win32kCallbacks,
+    _In_ ULONG BufferLength,
+    _Out_ PULONG_PTR Information)
 {
+    *Information = sizeof(VIDEO_WIN32K_CALLBACKS);
     if (BufferLength < sizeof(VIDEO_WIN32K_CALLBACKS))
     {
+        ERR_(VIDEOPRT, "Buffer too small for VIDEO_WIN32K_CALLBACKS: %lx\n",
+             BufferLength);
         return STATUS_BUFFER_TOO_SMALL;
     }
 
@@ -401,7 +463,16 @@ IntVideoPortDispatchDeviceControl(
             INFO_(VIDEOPRT, "- IOCTL_VIDEO_INIT_WIN32K_CALLBACKS\n");
             Status = VideoPortInitWin32kCallbacks(DeviceObject,
                                                   Irp->AssociatedIrp.SystemBuffer,
-                                                  IrpStack->Parameters.DeviceIoControl.InputBufferLength);
+                                                  IrpStack->Parameters.DeviceIoControl.InputBufferLength,
+                                                  &Irp->IoStatus.Information);
+            break;
+
+        case IOCTL_VIDEO_USE_DEVICE_IN_SESSION:
+            INFO_(VIDEOPRT, "- IOCTL_VIDEO_USE_DEVICE_IN_SESSION\n");
+            Status = VideoPortUseDeviceInSesion(DeviceObject,
+                                                Irp->AssociatedIrp.SystemBuffer,
+                                                IrpStack->Parameters.DeviceIoControl.InputBufferLength,
+                                                &Irp->IoStatus.Information);
             break;
 
         default:
index b436245..d24ed78 100644 (file)
@@ -150,6 +150,7 @@ IntVideoPortCreateAdapterDeviceObject(
     DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
     DeviceExtension->FunctionalDeviceObject = *DeviceObject;
     DeviceExtension->DriverExtension = DriverExtension;
+    DeviceExtension->SessionId = -1;
 
     InitializeListHead(&DeviceExtension->ChildDeviceList);
 
index 7ba1861..2c2c131 100644 (file)
@@ -31,6 +31,7 @@
 #include <ndk/kefuncs.h>
 #include <ndk/rtlfuncs.h>
 #include <ndk/obfuncs.h>
+#include <ndk/psfuncs.h>
 
 #define __BROKEN__
 #include <miniport.h>
@@ -113,6 +114,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION
    AGP_BUS_INTERFACE_STANDARD AgpInterface;
    KMUTEX DeviceLock;
    LIST_ENTRY DmaAdapterList, ChildDeviceList;
+   ULONG SessionId;
    CHAR MiniPortDeviceExtension[1];
 } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION;