mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 02:02:01 +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;
|
OUT ULONG DualviewFlags;
|
||||||
} VIDEO_WIN32K_CALLBACKS, *PVIDEO_WIN32K_CALLBACKS;
|
} 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 {
|
typedef struct _VIDEO_MEMORY {
|
||||||
PVOID RequestedVirtualAddress;
|
PVOID RequestedVirtualAddress;
|
||||||
} VIDEO_MEMORY, *PVIDEO_MEMORY;
|
} VIDEO_MEMORY, *PVIDEO_MEMORY;
|
||||||
|
@ -559,6 +564,7 @@ typedef struct _DISPLAY_BRIGHTNESS {
|
||||||
#define DISPLAYPOLICY_DC 0x00000002
|
#define DISPLAYPOLICY_DC 0x00000002
|
||||||
#define DISPLAYPOLICY_BOTH 0x00000003
|
#define DISPLAYPOLICY_BOTH 0x00000003
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -289,13 +289,75 @@ IoctlName(ULONG Ioctl)
|
||||||
|
|
||||||
static
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
VideoPortInitWin32kCallbacks(
|
VideoPortUseDeviceInSesion(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||||
PVIDEO_WIN32K_CALLBACKS Win32kCallbacks,
|
_Inout_ PVIDEO_DEVICE_SESSION_STATUS SessionState,
|
||||||
ULONG BufferLength)
|
_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))
|
if (BufferLength < sizeof(VIDEO_WIN32K_CALLBACKS))
|
||||||
{
|
{
|
||||||
|
ERR_(VIDEOPRT, "Buffer too small for VIDEO_WIN32K_CALLBACKS: %lx\n",
|
||||||
|
BufferLength);
|
||||||
return STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +463,16 @@ IntVideoPortDispatchDeviceControl(
|
||||||
INFO_(VIDEOPRT, "- IOCTL_VIDEO_INIT_WIN32K_CALLBACKS\n");
|
INFO_(VIDEOPRT, "- IOCTL_VIDEO_INIT_WIN32K_CALLBACKS\n");
|
||||||
Status = VideoPortInitWin32kCallbacks(DeviceObject,
|
Status = VideoPortInitWin32kCallbacks(DeviceObject,
|
||||||
Irp->AssociatedIrp.SystemBuffer,
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -150,6 +150,7 @@ IntVideoPortCreateAdapterDeviceObject(
|
||||||
DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
|
DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
|
||||||
DeviceExtension->FunctionalDeviceObject = *DeviceObject;
|
DeviceExtension->FunctionalDeviceObject = *DeviceObject;
|
||||||
DeviceExtension->DriverExtension = DriverExtension;
|
DeviceExtension->DriverExtension = DriverExtension;
|
||||||
|
DeviceExtension->SessionId = -1;
|
||||||
|
|
||||||
InitializeListHead(&DeviceExtension->ChildDeviceList);
|
InitializeListHead(&DeviceExtension->ChildDeviceList);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <ndk/kefuncs.h>
|
#include <ndk/kefuncs.h>
|
||||||
#include <ndk/rtlfuncs.h>
|
#include <ndk/rtlfuncs.h>
|
||||||
#include <ndk/obfuncs.h>
|
#include <ndk/obfuncs.h>
|
||||||
|
#include <ndk/psfuncs.h>
|
||||||
|
|
||||||
#define __BROKEN__
|
#define __BROKEN__
|
||||||
#include <miniport.h>
|
#include <miniport.h>
|
||||||
|
@ -113,6 +114,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION
|
||||||
AGP_BUS_INTERFACE_STANDARD AgpInterface;
|
AGP_BUS_INTERFACE_STANDARD AgpInterface;
|
||||||
KMUTEX DeviceLock;
|
KMUTEX DeviceLock;
|
||||||
LIST_ENTRY DmaAdapterList, ChildDeviceList;
|
LIST_ENTRY DmaAdapterList, ChildDeviceList;
|
||||||
|
ULONG SessionId;
|
||||||
CHAR MiniPortDeviceExtension[1];
|
CHAR MiniPortDeviceExtension[1];
|
||||||
} VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION;
|
} VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue