From: Timo Kreuzer Date: Fri, 22 Nov 2013 11:36:22 +0000 (+0000) Subject: [VIDEOPRT] X-Git-Tag: ReactOS-0.3.16~715 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=b5f60c35954c0f2e55c6e5bc1241cd84ac6b62bc [VIDEOPRT] Handle IOCTL_VIDEO_USE_DEVICE_IN_SESSION svn path=/trunk/; revision=61071 --- diff --git a/reactos/include/psdk/ntddvdeo.h b/reactos/include/psdk/ntddvdeo.h index 728f5a61d11..8fcd361f502 100644 --- a/reactos/include/psdk/ntddvdeo.h +++ b/reactos/include/psdk/ntddvdeo.h @@ -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 diff --git a/reactos/win32ss/drivers/videoprt/dispatch.c b/reactos/win32ss/drivers/videoprt/dispatch.c index 73be3f472c4..9a4d0268812 100644 --- a/reactos/win32ss/drivers/videoprt/dispatch.c +++ b/reactos/win32ss/drivers/videoprt/dispatch.c @@ -287,15 +287,77 @@ IoctlName(ULONG Ioctl) return "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: diff --git a/reactos/win32ss/drivers/videoprt/videoprt.c b/reactos/win32ss/drivers/videoprt/videoprt.c index b4362454650..d24ed782431 100644 --- a/reactos/win32ss/drivers/videoprt/videoprt.c +++ b/reactos/win32ss/drivers/videoprt/videoprt.c @@ -150,6 +150,7 @@ IntVideoPortCreateAdapterDeviceObject( DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; DeviceExtension->FunctionalDeviceObject = *DeviceObject; DeviceExtension->DriverExtension = DriverExtension; + DeviceExtension->SessionId = -1; InitializeListHead(&DeviceExtension->ChildDeviceList); diff --git a/reactos/win32ss/drivers/videoprt/videoprt.h b/reactos/win32ss/drivers/videoprt/videoprt.h index 7ba18612ab6..2c2c13185be 100644 --- a/reactos/win32ss/drivers/videoprt/videoprt.h +++ b/reactos/win32ss/drivers/videoprt/videoprt.h @@ -31,6 +31,7 @@ #include #include #include +#include #define __BROKEN__ #include @@ -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;