[VIDEOPRT]

Handle IOCTL_VIDEO_USE_DEVICE_IN_SESSION

svn path=/trunk/; revision=61071
This commit is contained in:
Timo Kreuzer 2013-11-22 11:36:22 +00:00
parent cc5033f674
commit b5f60c3595
4 changed files with 85 additions and 5 deletions

View 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

View file

@ -289,13 +289,75 @@ IoctlName(ULONG Ioctl)
static
NTSTATUS
VideoPortInitWin32kCallbacks(
IN PDEVICE_OBJECT DeviceObject,
PVIDEO_WIN32K_CALLBACKS Win32kCallbacks,
ULONG BufferLength)
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,
_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:

View file

@ -150,6 +150,7 @@ IntVideoPortCreateAdapterDeviceObject(
DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
DeviceExtension->FunctionalDeviceObject = *DeviceObject;
DeviceExtension->DriverExtension = DriverExtension;
DeviceExtension->SessionId = -1;
InitializeListHead(&DeviceExtension->ChildDeviceList);

View 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;