mirror of
https://github.com/reactos/reactos.git
synced 2025-05-17 16:27:00 +00:00
[VIDEOPRT]
Handle IOCTL_VIDEO_USE_DEVICE_IN_SESSION svn path=/trunk/; revision=61071
This commit is contained in:
parent
cc5033f674
commit
b5f60c3595
4 changed files with 85 additions and 5 deletions
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -150,6 +150,7 @@ IntVideoPortCreateAdapterDeviceObject(
|
|||
DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
|
||||
DeviceExtension->FunctionalDeviceObject = *DeviceObject;
|
||||
DeviceExtension->DriverExtension = DriverExtension;
|
||||
DeviceExtension->SessionId = -1;
|
||||
|
||||
InitializeListHead(&DeviceExtension->ChildDeviceList);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue