ReactOS  0.4.15-dev-3717-g292e6a4
dispatch.c File Reference
#include "videoprt.h"
#include <ndk/inbvfuncs.h>
#include <ndk/obfuncs.h>
#include <ndk/psfuncs.h>
#include <debug.h>
Include dependency graph for dispatch.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

static VOID VideoPortWin32kCallout (_In_ PVIDEO_WIN32K_CALLBACKS_PARAMS CallbackParams)
 
static BOOLEAN NTAPI IntVideoPortResetDisplayParametersEx (_In_ ULONG Columns, _In_ ULONG Rows, _In_ BOOLEAN CalledByInbv)
 
static BOOLEAN NTAPI IntVideoPortResetDisplayParameters (ULONG Columns, ULONG Rows)
 
static VOID NTAPI InbvMonitorThread (_In_ PVOID Context)
 
static NTSTATUS IntVideoPortInbvInitialize (VOID)
 
static NTSTATUS IntVideoPortInbvCleanup (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI IntVideoPortAddDevice (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
 
NTSTATUS NTAPI IntVideoPortDispatchOpen (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
PSTR IoctlName (ULONG Ioctl)
 
static NTSTATUS VideoPortUseDeviceInSession (_Inout_ PDEVICE_OBJECT DeviceObject, _Inout_ PVIDEO_DEVICE_SESSION_STATUS SessionState, _In_ ULONG BufferLength, _Out_ PULONG_PTR Information)
 
static NTSTATUS VideoPortInitWin32kCallbacks (_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PVIDEO_WIN32K_CALLBACKS Win32kCallbacks, _In_ ULONG BufferLength, _Out_ PULONG_PTR Information)
 
static NTSTATUS VideoPortForwardDeviceControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchDeviceControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortPnPStartDevice (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortForwardIrpAndWaitCompletionRoutine (PDEVICE_OBJECT Fdo, PIRP Irp, PVOID Context)
 
NTSTATUS NTAPI IntVideoPortQueryBusRelations (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortForwardIrpAndWait (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchFdoPnp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchPnp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchCleanup (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchPower (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI IntVideoPortDispatchSystemControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
VOID NTAPI IntVideoPortUnload (PDRIVER_OBJECT DriverObject)
 

Variables

static PVIDEO_WIN32K_CALLOUT Win32kCallout = NULL
 
static HANDLE InbvThreadHandle = NULL
 
static BOOLEAN InbvMonitoring = FALSE
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 28 of file dispatch.c.

Function Documentation

◆ InbvMonitorThread()

static VOID NTAPI InbvMonitorThread ( _In_ PVOID  Context)
static

Definition at line 208 of file dispatch.c.

210 {
211  VIDEO_WIN32K_CALLBACKS_PARAMS CallbackParams;
212  LARGE_INTEGER Delay;
213  USHORT i;
214 
216 
217  while (TRUE)
218  {
219  /*
220  * During one second, check the INBV status each 100 milliseconds,
221  * then revert to 1 second delay.
222  */
223  i = 10;
224  Delay.QuadPart = (LONGLONG)-100*1000*10; // 100 millisecond delay
225  while (!InbvMonitoring)
226  {
228 
229  if ((i > 0) && (--i == 0))
230  Delay.QuadPart = (LONGLONG)-1*1000*1000*10; // 1 second delay
231  }
232 
233  /*
234  * Loop while the display is owned by INBV. We cannot do anything else
235  * than polling since INBV does not offer a proper notification system.
236  *
237  * During one second, check the INBV status each 100 milliseconds,
238  * then revert to 1 second delay.
239  */
240  i = 10;
241  Delay.QuadPart = (LONGLONG)-100*1000*10; // 100 millisecond delay
242  while (InbvCheckDisplayOwnership())
243  {
245 
246  if ((i > 0) && (--i == 0))
247  Delay.QuadPart = (LONGLONG)-1*1000*1000*10; // 1 second delay
248  }
249 
250  /* Reset the monitoring */
252 
253  /*
254  * Somebody released INBV display ownership, usually by invoking
255  * InbvNotifyDisplayOwnershipLost(). However the caller of this
256  * function certainly specified a different callback than ours.
257  * As we are going to be the only owner of the active display,
258  * we need to re-register our own display reset callback.
259  */
261 
262  /* Tell Win32k to reset the display */
263  CallbackParams.CalloutType = VideoFindAdapterCallout;
264  // CallbackParams.PhysDisp = NULL;
265  CallbackParams.Param = (ULONG_PTR)TRUE; // TRUE: Re-enable display; FALSE: Disable display.
266  VideoPortWin32kCallout(&CallbackParams);
267  }
268 
269  // FIXME: See IntVideoPortInbvCleanup().
270  // PsTerminateSystemThread(STATUS_SUCCESS);
271 }
VOID NTAPI InbvNotifyDisplayOwnershipLost(IN INBV_RESET_DISPLAY_PARAMETERS Callback)
Definition: inbv.c:634
static BOOLEAN InbvMonitoring
Definition: dispatch.c:35
VIDEO_WIN32K_CALLBACKS_PARAMS_TYPE CalloutType
Definition: ntddvdeo.h:250
#define TRUE
Definition: types.h:120
#define LOW_REALTIME_PRIORITY
static BOOLEAN NTAPI IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows)
Definition: dispatch.c:168
#define FALSE
Definition: types.h:117
NTSTATUS NTAPI KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval OPTIONAL)
Definition: wait.c:283
int64_t LONGLONG
Definition: typedefs.h:68
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
KPRIORITY NTAPI KeSetPriorityThread(IN PKTHREAD Thread, IN KPRIORITY Priority)
Definition: thrdobj.c:1327
unsigned short USHORT
Definition: pedump.c:61
static VOID VideoPortWin32kCallout(_In_ PVIDEO_WIN32K_CALLBACKS_PARAMS CallbackParams)
Definition: dispatch.c:40
#define ULONG_PTR
Definition: config.h:101
BOOLEAN NTAPI InbvCheckDisplayOwnership(VOID)
Definition: inbv.c:549
#define KeGetCurrentThread
Definition: hal.h:55
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by IntVideoPortInbvInitialize().

◆ IntVideoPortAddDevice()

NTSTATUS NTAPI IntVideoPortAddDevice ( IN PDRIVER_OBJECT  DriverObject,
IN PDEVICE_OBJECT  PhysicalDeviceObject 
)

Definition at line 334 of file dispatch.c.

337 {
341 
342  /* Get the initialization data we saved in VideoPortInitialize. */
344 
345  /* Create adapter device object. */
349  DriverExtension->InitializationData.StartingDeviceNumber,
350  0,
351  &DeviceObject);
352  if (!NT_SUCCESS(Status))
353  {
354  ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject() failed with status 0x%lx\n", Status);
355  }
356  return Status;
357 }
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1155
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
NTSTATUS NTAPI IntVideoPortCreateAdapterDeviceObject(_In_ PDRIVER_OBJECT DriverObject, _In_ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, _In_ USHORT AdapterNumber, _In_ USHORT DisplayNumber, _Out_opt_ PDEVICE_OBJECT *DeviceObject)
Definition: videoprt.c:152
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1875
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchCleanup()

NTSTATUS NTAPI IntVideoPortDispatchCleanup ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1116 of file dispatch.c.

1119 {
1120  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
1121 
1122  DeviceExtension = DeviceObject->DeviceExtension;
1123  RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
1124 
1125  Irp->IoStatus.Status = STATUS_SUCCESS;
1126  Irp->IoStatus.Information = 0;
1128 
1129  return STATUS_SUCCESS;
1130 }
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define IO_NO_INCREMENT
Definition: iotypes.h:598
UNICODE_STRING RegistryPath
Definition: videoprt.h:90
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ IntVideoPortDispatchClose()

NTSTATUS NTAPI IntVideoPortDispatchClose ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 436 of file dispatch.c.

439 {
440  TRACE_(VIDEOPRT, "IntVideoPortDispatchClose\n");
441 
443 
444  Irp->IoStatus.Status = STATUS_SUCCESS;
446  return STATUS_SUCCESS;
447 }
static NTSTATUS IntVideoPortInbvCleanup(IN PDEVICE_OBJECT DeviceObject)
Definition: dispatch.c:300
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
#define TRACE_(x)
Definition: compat.h:76
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchDeviceControl()

NTSTATUS NTAPI IntVideoPortDispatchDeviceControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 721 of file dispatch.c.

724 {
725  PIO_STACK_LOCATION IrpStack;
728 
729  TRACE_(VIDEOPRT, "IntVideoPortDispatchDeviceControl\n");
730 
731  IrpStack = IoGetCurrentIrpStackLocation(Irp);
732 
733  switch (IrpStack->MajorFunction)
734  {
736  /* This is the main part of this function and is handled below */
737  break;
738 
739  case IRP_MJ_SHUTDOWN:
740  {
741  /* Dereference CSRSS */
742  PKPROCESS OldCsrProcess;
743  OldCsrProcess = InterlockedExchangePointer((PVOID*)&CsrProcess, NULL);
744  if (OldCsrProcess)
745  ObDereferenceObject(OldCsrProcess);
746 
747  Irp->IoStatus.Status = STATUS_SUCCESS;
749  return STATUS_SUCCESS;
750  }
751 
752  default:
753  ERR_(VIDEOPRT, "- Unknown MajorFunction 0x%x\n", IrpStack->MajorFunction);
754  Irp->IoStatus.Status = STATUS_SUCCESS;
756  return STATUS_SUCCESS;
757  }
758 
759  IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
760 
761  INFO_(VIDEOPRT, "- IoControlCode: 0x%x: %s\n", IoControlCode, IoctlName(IoControlCode));
762 
763  switch (IoControlCode)
764  {
768  WARN_(VIDEOPRT, "- IOCTL_VIDEO_*_VDM are UNIMPLEMENTED!\n");
770  break;
771 
774  WARN_(VIDEOPRT, "- IOCTL_VIDEO_GET/SET_OUTPUT_DEVICE_POWER_STATE are UNIMPLEMENTED!\n");
776  break;
777 
780  WARN_(VIDEOPRT, "- IOCTL_VIDEO_GET/SET_POWER_MANAGEMENT are UNIMPLEMENTED!\n");
782  break;
783 
787  WARN_(VIDEOPRT, "- IOCTL_VIDEO_*_BRIGHTNESS are UNIMPLEMENTED!\n");
789  break;
790 
792  INFO_(VIDEOPRT, "- IOCTL_VIDEO_INIT_WIN32K_CALLBACKS\n");
794  Irp->AssociatedIrp.SystemBuffer,
795  IrpStack->Parameters.DeviceIoControl.InputBufferLength,
796  &Irp->IoStatus.Information);
797  break;
798 
800  WARN_(VIDEOPRT, "- IOCTL_VIDEO_IS_VGA_DEVICE is UNIMPLEMENTED!\n");
802  break;
803 
805  INFO_(VIDEOPRT, "- IOCTL_VIDEO_USE_DEVICE_IN_SESSION\n");
807  Irp->AssociatedIrp.SystemBuffer,
808  IrpStack->Parameters.DeviceIoControl.InputBufferLength,
809  &Irp->IoStatus.Information);
810  break;
811 
813  INFO_(VIDEOPRT, "- IOCTL_VIDEO_PREPARE_FOR_EARECOVERY\n");
814  /*
815  * The Win32k Watchdog Timer detected that a thread spent more time
816  * in a display driver than the allotted time its threshold specified,
817  * and thus is going to attempt to recover by switching to VGA mode.
818  * If this attempt fails, the watchdog generates bugcheck 0xEA
819  * "THREAD_STUCK_IN_DEVICE_DRIVER".
820  *
821  * Prepare the recovery by resetting the display adapters to
822  * standard VGA 80x25 text mode.
823  */
826  break;
827 
828  default:
829  /* Forward to the Miniport Driver */
831  break;
832  }
833 
834  INFO_(VIDEOPRT, "- Returned status: 0x%x\n", Status);
835 
836  Irp->IoStatus.Status = Status;
838  return Status;
839 }
#define IOCTL_VIDEO_IS_VGA_DEVICE
Definition: ntddvdeo.h:68
static NTSTATUS VideoPortUseDeviceInSession(_Inout_ PDEVICE_OBJECT DeviceObject, _Inout_ PVIDEO_DEVICE_SESSION_STATUS SessionState, _In_ ULONG BufferLength, _Out_ PULONG_PTR Information)
Definition: dispatch.c:569
#define INFO_(ch,...)
Definition: debug.h:159
#define IOCTL_VIDEO_REGISTER_VDM
Definition: ntddvdeo.h:47
#define IRP_MJ_SHUTDOWN
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
#define IOCTL_VIDEO_ENABLE_VDM
Definition: ntddvdeo.h:41
#define IOCTL_VIDEO_GET_POWER_MANAGEMENT
Definition: ntddvdeo.h:98
#define IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE
Definition: ntddvdeo.h:53
PKPROCESS CsrProcess
Definition: videoprt.c:39
PSTR IoctlName(ULONG Ioctl)
Definition: dispatch.c:450
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
return STATUS_NOT_IMPLEMENTED
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS
Definition: ntddvdeo.h:62
static BOOLEAN NTAPI IntVideoPortResetDisplayParametersEx(_In_ ULONG Columns, _In_ ULONG Rows, _In_ BOOLEAN CalledByInbv)
Definition: dispatch.c:72
#define IoCompleteRequest
Definition: irp.c:1240
static NTSTATUS VideoPortInitWin32kCallbacks(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PVIDEO_WIN32K_CALLBACKS Win32kCallbacks, _In_ ULONG BufferLength, _Out_ PULONG_PTR Information)
Definition: dispatch.c:627
#define IOCTL_VIDEO_SET_POWER_MANAGEMENT
Definition: ntddvdeo.h:170
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
#define ObDereferenceObject
Definition: obfuncs.h:203
#define IOCTL_VIDEO_PREPARE_FOR_EARECOVERY
Definition: ntddvdeo.h:74
#define IO_VIDEO_INCREMENT
Definition: iotypes.h:609
#define IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
Definition: ntddvdeo.h:200
#define IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS
Definition: ntddvdeo.h:194
#define IOCTL_VIDEO_DISABLE_VDM
Definition: ntddvdeo.h:44
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
Definition: wdfio.h:318
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
#define NULL
Definition: types.h:112
#define IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS
Definition: ntddvdeo.h:197
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:598
static NTSTATUS VideoPortForwardDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:654
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
#define IOCTL_VIDEO_USE_DEVICE_IN_SESSION
Definition: ntddvdeo.h:71
#define WARN_(ch,...)
Definition: debug.h:157
#define IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE
Definition: ntddvdeo.h:50
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchFdoPnp()

NTSTATUS NTAPI IntVideoPortDispatchFdoPnp ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1025 of file dispatch.c.

1028 {
1030  NTSTATUS Status;
1031  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
1032 
1034 
1035  switch (IrpSp->MinorFunction)
1036  {
1037  case IRP_MN_START_DEVICE:
1039  if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
1041  Irp->IoStatus.Status = Status;
1042  Irp->IoStatus.Information = 0;
1044  break;
1045 
1047  /* Call lower drivers, and ignore result (that's probably STATUS_NOT_SUPPORTED) */
1049  /* Now, fill resource requirements list */
1051  Irp->IoStatus.Status = Status;
1053  break;
1054 
1056  if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations)
1057  {
1059  Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1060  }
1061  else
1062  {
1064  Irp->IoStatus.Status = Status;
1066  }
1067  break;
1068 
1069  case IRP_MN_REMOVE_DEVICE:
1073 
1074  case IRP_MN_STOP_DEVICE:
1076  if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
1078  Irp->IoStatus.Status = Status;
1079  Irp->IoStatus.Information = 0;
1081  break;
1082 
1086  Irp->IoStatus.Status = STATUS_SUCCESS;
1087  Irp->IoStatus.Information = 0;
1089  break;
1090 
1091  default:
1092  Status = Irp->IoStatus.Status;
1094  break;
1095  }
1096 
1097  return Status;
1098 }
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
LONG NTSTATUS
Definition: precomp.h:26
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IRP_MN_QUERY_REMOVE_DEVICE
#define IoCompleteRequest
Definition: irp.c:1240
#define IRP_MN_QUERY_STOP_DEVICE
Status
Definition: gdiplustypes.h:24
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IRP_MN_STOP_DEVICE
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define IRP_MN_START_DEVICE
#define VOID
Definition: acefi.h:82
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
NTSTATUS NTAPI IntVideoPortForwardIrpAndWait(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: dispatch.c:997
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
NTSTATUS NTAPI IntVideoPortPnPStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:843
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
NTSTATUS NTAPI IntVideoPortQueryBusRelations(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: dispatch.c:937
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_CANCEL_STOP_DEVICE
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
NTSTATUS NTAPI IntVideoPortFilterResourceRequirements(IN PDEVICE_OBJECT DeviceObject, IN PIO_STACK_LOCATION IrpStack, IN PIRP Irp)
Definition: resource.c:77

Referenced by IntVideoPortDispatchPnp().

◆ IntVideoPortDispatchOpen()

NTSTATUS NTAPI IntVideoPortDispatchOpen ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 369 of file dispatch.c.

372 {
374  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
376 
377  TRACE_(VIDEOPRT, "IntVideoPortDispatchOpen\n");
378 
379  if (!CsrProcess)
380  {
381  /*
382  * We know the first open call will be from the CSRSS process
383  * to let us know its handle.
384  */
385  INFO_(VIDEOPRT, "Referencing CSRSS\n");
388  INFO_(VIDEOPRT, "CsrProcess 0x%p\n", CsrProcess);
389 
391  if (!NT_SUCCESS(Status))
392  {
393  ERR_(VIDEOPRT, "IntInitializeVideoAddressSpace() failed: 0x%lx\n", Status);
395  CsrProcess = NULL;
396  return Status;
397  }
398  }
399 
400  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
401  DriverExtension = DeviceExtension->DriverExtension;
402 
403  // FIXME: (Re-)initialize INBV only if DeviceObject doesn't belong to a mirror driver.
405 
406  if (DriverExtension->InitializationData.HwInitialize(&DeviceExtension->MiniPortDeviceExtension))
407  {
409  InterlockedIncrement((PLONG)&DeviceExtension->DeviceOpened);
410 
411  /* Query children, now that device is opened */
413  }
414  else
415  {
417  }
418 
419  Irp->IoStatus.Status = Status;
420  Irp->IoStatus.Information = FILE_OPENED;
422 
423  return Status;
424 }
#define INFO_(ch,...)
Definition: debug.h:159
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
#define ERR_(ch,...)
Definition: debug.h:156
LONG NTSTATUS
Definition: precomp.h:26
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
#define FILE_OPENED
Definition: nt_native.h:769
PKPROCESS CsrProcess
Definition: videoprt.c:39
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#define IoCompleteRequest
Definition: irp.c:1240
NTSTATUS NTAPI IntInitializeVideoAddressSpace(VOID)
Definition: int10.c:200
static NTSTATUS IntVideoPortInbvInitialize(VOID)
Definition: dispatch.c:274
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ObDereferenceObject
Definition: obfuncs.h:203
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define InterlockedIncrement
Definition: armddk.h:53
struct _KPROCESS * PKPROCESS
Definition: wdm.template.h:206
#define NULL
Definition: types.h:112
#define ObReferenceObject
Definition: obfuncs.h:204
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define STATUS_SUCCESS
Definition: shellext.h:65
signed int * PLONG
Definition: retypes.h:5
VPAPI VP_STATUS NTAPI VideoPortEnumerateChildren(IN PVOID HwDeviceExtension, IN PVOID Reserved)
Definition: videoprt.c:1335

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchPnp()

NTSTATUS NTAPI IntVideoPortDispatchPnp ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1102 of file dispatch.c.

1105 {
1106  PVIDEO_PORT_COMMON_EXTENSION CommonExtension = DeviceObject->DeviceExtension;
1107 
1108  if (CommonExtension->Fdo)
1110  else
1112 }
NTSTATUS NTAPI IntVideoPortDispatchPdoPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: child.c:386
NTSTATUS NTAPI IntVideoPortDispatchFdoPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: dispatch.c:1025
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchPower()

NTSTATUS NTAPI IntVideoPortDispatchPower ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1134 of file dispatch.c.

1137 {
1139  NTSTATUS Status = Irp->IoStatus.Status;
1140  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
1141 
1143 
1144  if (DeviceExtension->Common.Fdo)
1145  {
1148  return PoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1149  }
1150  else
1151  {
1152  switch (IrpSp->MinorFunction)
1153  {
1154  case IRP_MN_QUERY_POWER:
1155  case IRP_MN_SET_POWER:
1157  break;
1158  }
1160  Irp->IoStatus.Status = Status;
1162  return Status;
1163  }
1164 }
#define IRP_MN_QUERY_POWER
LONG NTSTATUS
Definition: precomp.h:26
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
Status
Definition: gdiplustypes.h:24
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
#define IRP_MN_SET_POWER
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:746
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:84
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by VideoPortInitialize().

◆ IntVideoPortDispatchSystemControl()

NTSTATUS NTAPI IntVideoPortDispatchSystemControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1168 of file dispatch.c.

1171 {
1172  NTSTATUS Status;
1173  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
1174 
1175  if (DeviceExtension->Common.Fdo)
1176  {
1178  return IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1179  }
1180  else
1181  {
1182  Status = Irp->IoStatus.Status;
1184  return Status;
1185  }
1186 }
LONG NTSTATUS
Definition: precomp.h:26
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
Status
Definition: gdiplustypes.h:24
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
VIDEO_PORT_COMMON_EXTENSION Common
Definition: videoprt.h:84
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by VideoPortInitialize().

◆ IntVideoPortForwardIrpAndWait()

NTSTATUS NTAPI IntVideoPortForwardIrpAndWait ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 997 of file dispatch.c.

998 {
999  KEVENT Event;
1000  NTSTATUS Status;
1001  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension =
1002  (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
1003 
1008  &Event,
1009  TRUE,
1010  TRUE,
1011  TRUE);
1012 
1013  Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1014  if (Status == STATUS_PENDING)
1015  {
1017  Status = Irp->IoStatus.Status;
1018  }
1019 
1020  return Status;
1021 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
NTSTATUS NTAPI IntVideoPortForwardIrpAndWaitCompletionRoutine(PDEVICE_OBJECT Fdo, PIRP Irp, PVOID Context)
Definition: dispatch.c:922
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:498
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
Definition: iofuncs.h:2868
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:467
Status
Definition: gdiplustypes.h:24
#define STATUS_PENDING
Definition: ntstatus.h:82
PDEVICE_OBJECT NextDeviceObject
Definition: videoprt.h:89
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NULL
Definition: types.h:112
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218

Referenced by IntVideoPortDispatchFdoPnp().

◆ IntVideoPortForwardIrpAndWaitCompletionRoutine()

NTSTATUS NTAPI IntVideoPortForwardIrpAndWaitCompletionRoutine ( PDEVICE_OBJECT  Fdo,
PIRP  Irp,
PVOID  Context 
)

Definition at line 922 of file dispatch.c.

926 {
928 
929  if (Irp->PendingReturned)
931 
933 }
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
struct tagContext Context
Definition: acpixf.h:1034
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by IntVideoPortForwardIrpAndWait().

◆ IntVideoPortInbvCleanup()

static NTSTATUS IntVideoPortInbvCleanup ( IN PDEVICE_OBJECT  DeviceObject)
static

Definition at line 300 of file dispatch.c.

302 {
303  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
304  // HANDLE ThreadHandle;
305 
306  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
307  if ((DeviceExtension->DeviceOpened >= 1) &&
308  (InterlockedDecrement((PLONG)&DeviceExtension->DeviceOpened) == 0))
309  {
310  // RemoveEntryList(&DeviceExtension->HwResetListEntry);
313  // or InbvAcquireDisplayOwnership(); ?
314  }
315 
316 #if 0
317  // TODO: Find the best way to communicate the request.
318  /* Signal the INBV monitoring thread and wait for it to terminate */
320  if (ThreadHandle)
321  {
323  /* Close its handle */
324  ObCloseHandle(ThreadHandle, KernelMode);
325  }
326 #endif
327 
328  return STATUS_SUCCESS;
329 }
VOID NTAPI InbvNotifyDisplayOwnershipLost(IN INBV_RESET_DISPLAY_PARAMETERS Callback)
Definition: inbv.c:634
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
if(dx==0 &&dy==0)
Definition: linetemp.h:174
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FALSE
Definition: types.h:117
static BOOLEAN NTAPI IntVideoPortResetDisplayParametersEx(_In_ ULONG Columns, _In_ ULONG Rows, _In_ BOOLEAN CalledByInbv)
Definition: dispatch.c:72
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
static HANDLE InbvThreadHandle
Definition: dispatch.c:34
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3378
#define InterlockedDecrement
Definition: armddk.h:52
#define NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65
signed int * PLONG
Definition: retypes.h:5

Referenced by IntVideoPortDispatchClose().

◆ IntVideoPortInbvInitialize()

static NTSTATUS IntVideoPortInbvInitialize ( VOID  )
static

Definition at line 274 of file dispatch.c.

275 {
276  /* Create the INBV monitoring thread if needed */
277  if (!InbvThreadHandle)
278  {
281 
283  0,
285  NULL,
286  NULL,
288  NULL);
289  if (!NT_SUCCESS(Status))
291  }
292 
293  /* Re-register the display reset callback with INBV */
295 
296  return STATUS_SUCCESS;
297 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
VOID NTAPI InbvNotifyDisplayOwnershipLost(IN INBV_RESET_DISPLAY_PARAMETERS Callback)
Definition: inbv.c:634
static VOID NTAPI InbvMonitorThread(_In_ PVOID Context)
Definition: dispatch.c:208
LONG NTSTATUS
Definition: precomp.h:26
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
static BOOLEAN NTAPI IntVideoPortResetDisplayParameters(ULONG Columns, ULONG Rows)
Definition: dispatch.c:168
Status
Definition: gdiplustypes.h:24
static HANDLE InbvThreadHandle
Definition: dispatch.c:34
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
Definition: thread.c:602
#define NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by IntVideoPortDispatchOpen().

◆ IntVideoPortPnPStartDevice()

NTSTATUS NTAPI IntVideoPortPnPStartDevice ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 843 of file dispatch.c.

846 {
850  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
852 
853  /* Get the initialization data we saved in VideoPortInitialize.*/
854  DriverObject = DeviceObject->DriverObject;
856  DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
857 
858  /* Store some resources in the DeviceExtension. */
859  AllocatedResources = Stack->Parameters.StartDevice.AllocatedResources;
861  {
862  CM_FULL_RESOURCE_DESCRIPTOR *FullList;
865  ULONG ResourceListSize;
866 
867  /* Save the resource list */
868  ResourceCount = AllocatedResources->List[0].PartialResourceList.Count;
869  ResourceListSize =
870  FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
871  PartialDescriptors[ResourceCount]);
872  DeviceExtension->AllocatedResources = ExAllocatePool(PagedPool, ResourceListSize);
873  if (DeviceExtension->AllocatedResources == NULL)
874  {
876  }
877 
878  RtlCopyMemory(DeviceExtension->AllocatedResources,
880  ResourceListSize);
881 
882  /* Get the interrupt level/vector - needed by HwFindAdapter sometimes */
883  FullList = AllocatedResources->List;
884  ASSERT(AllocatedResources->Count == 1);
885  INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u Version %u Revision %u\n",
886  FullList->InterfaceType, FullList->BusNumber, DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version, FullList->PartialResourceList.Revision);
887 
888  /* FIXME: Is this ASSERT ok for resources from the PNP manager? */
889  ASSERT(FullList->InterfaceType == PCIBus);
890  ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
891  ASSERT(1 == FullList->PartialResourceList.Version);
892  ASSERT(1 == FullList->PartialResourceList.Revision);
894  Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count;
895  Descriptor++)
896  {
897  if (Descriptor->Type == CmResourceTypeInterrupt)
898  {
899  DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
900  DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
901  if (Descriptor->ShareDisposition == CmResourceShareShared)
902  DeviceExtension->InterruptShared = TRUE;
903  else
904  DeviceExtension->InterruptShared = FALSE;
905  }
906  }
907  }
908 
909  INFO_(VIDEOPRT, "Interrupt level: 0x%x Interrupt Vector: 0x%x\n",
910  DeviceExtension->InterruptLevel,
911  DeviceExtension->InterruptVector);
912 
913  /* Create adapter device object. */
916  DeviceObject);
917 }
NTSTATUS NTAPI IntVideoPortFindAdapter(IN PDRIVER_OBJECT DriverObject, IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject)
Definition: videoprt.c:341
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:339
#define INFO_(ch,...)
Definition: debug.h:159
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResources
Definition: ndis.h:4640
#define TRUE
Definition: types.h:120
struct _VIDEO_PORT_DEVICE_EXTENSTION * PVIDEO_PORT_DEVICE_EXTENSION
PCM_RESOURCE_LIST AllocatedResources
Definition: videoprt.h:94
if(dx==0 &&dy==0)
Definition: linetemp.h:174
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:636
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: hwresource.cpp:160
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define ASSERT(a)
Definition: mode.c:44
static ULONG ResourceCount
Definition: inbv.c:88
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
Definition: hwresource.cpp:119
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1875
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
unsigned int ULONG
Definition: retypes.h:1
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by IntVideoPortDispatchFdoPnp().

◆ IntVideoPortQueryBusRelations()

NTSTATUS NTAPI IntVideoPortQueryBusRelations ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 937 of file dispatch.c.

938 {
939  PDEVICE_RELATIONS DeviceRelations;
940  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
941  PVIDEO_PORT_CHILD_EXTENSION ChildExtension;
942  ULONG i;
943  PLIST_ENTRY CurrentEntry;
945 
946  if (InterlockedCompareExchange((PLONG)&DeviceExtension->DeviceOpened, 0, 0) == 0)
947  {
948  /* Device not opened. Don't enumerate children yet */
949  WARN_(VIDEOPRT, "Skipping child enumeration because device is not opened");
951  }
952  /* Query children of the device. */
954  if (!NT_SUCCESS(Status))
955  return Status;
956 
957  /* Count the children */
958  i = 0;
959  CurrentEntry = DeviceExtension->ChildDeviceList.Flink;
960  while (CurrentEntry != &DeviceExtension->ChildDeviceList)
961  {
962  i++;
963  CurrentEntry = CurrentEntry->Flink;
964  }
965 
966  if (i == 0)
967  return Irp->IoStatus.Status;
968 
969  DeviceRelations = ExAllocatePool(PagedPool,
970  sizeof(DEVICE_RELATIONS) + ((i - 1) * sizeof(PVOID)));
971  if (!DeviceRelations) return STATUS_NO_MEMORY;
972 
973  DeviceRelations->Count = i;
974 
975  /* Add the children */
976  i = 0;
977  CurrentEntry = DeviceExtension->ChildDeviceList.Flink;
978  while (CurrentEntry != &DeviceExtension->ChildDeviceList)
979  {
980  ChildExtension = CONTAINING_RECORD(CurrentEntry, VIDEO_PORT_CHILD_EXTENSION, ListEntry);
981 
982  ObReferenceObject(ChildExtension->PhysicalDeviceObject);
983  DeviceRelations->Objects[i] = ChildExtension->PhysicalDeviceObject;
984 
985  i++;
986  CurrentEntry = CurrentEntry->Flink;
987  }
988 
989  INFO_(VIDEOPRT, "Reported %d PDOs\n", i);
990  Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
991 
992  return STATUS_SUCCESS;
993 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define INFO_(ch,...)
Definition: debug.h:159
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
LONG NTSTATUS
Definition: precomp.h:26
#define InterlockedCompareExchange
Definition: interlocked.h:104
NTSTATUS NTAPI IntVideoPortEnumerateChildren(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: videoprt.c:1171
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
Status
Definition: gdiplustypes.h:24
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
Definition: typedefs.h:119
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define ObReferenceObject
Definition: obfuncs.h:204
PDEVICE_OBJECT PhysicalDeviceObject
Definition: videoprt.h:127
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
#define STATUS_SUCCESS
Definition: shellext.h:65
signed int * PLONG
Definition: retypes.h:5
#define WARN_(ch,...)
Definition: debug.h:157

Referenced by IntVideoPortDispatchFdoPnp().

◆ IntVideoPortResetDisplayParameters()

static BOOLEAN NTAPI IntVideoPortResetDisplayParameters ( ULONG  Columns,
ULONG  Rows 
)
static

Definition at line 168 of file dispatch.c.

169 {
170  /* Call the extended function, specifying we were called by INBV */
172 }
#define TRUE
Definition: types.h:120
static BOOLEAN NTAPI IntVideoPortResetDisplayParametersEx(_In_ ULONG Columns, _In_ ULONG Rows, _In_ BOOLEAN CalledByInbv)
Definition: dispatch.c:72
_In_ ULONG Rows
Definition: haltypes.h:7
static const COLUMN_LIST Columns[]
Definition: listview.c:19

Referenced by InbvMonitorThread(), and IntVideoPortInbvInitialize().

◆ IntVideoPortResetDisplayParametersEx()

static BOOLEAN NTAPI IntVideoPortResetDisplayParametersEx ( _In_ ULONG  Columns,
_In_ ULONG  Rows,
_In_ BOOLEAN  CalledByInbv 
)
static

Definition at line 72 of file dispatch.c.

76 {
77  BOOLEAN Success = TRUE; // Suppose we don't need to perform a full reset.
78  KIRQL OldIrql;
79  PLIST_ENTRY PrevEntry, Entry;
80  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
82 
83  /* Check if we are at dispatch level or lower, and acquire the lock */
85  if (OldIrql <= DISPATCH_LEVEL)
86  {
87  /* Loop until the lock is free, then raise IRQL to dispatch level */
90  }
92 
93  /* Bail out early if we don't have any resettable adapter */
95  {
96  Success = FALSE; // No adapter found: request HAL to perform a full reset.
97  goto Quit;
98  }
99 
100  /*
101  * If we have been unexpectedly called via a callback from
102  * InbvAcquireDisplayOwnership(), start monitoring INBV.
103  */
104  if (CalledByInbv)
106 
107  for (PrevEntry = &HwResetAdaptersList, Entry = PrevEntry->Flink;
109  PrevEntry = Entry, Entry = Entry->Flink)
110  {
111  /*
112  * Check whether the entry address is properly aligned,
113  * the device and driver extensions must be readable and
114  * the device extension properly back-linked to the last entry.
115  */
116 // #define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0)
117  if (((ULONG_PTR)Entry & (sizeof(ULONG_PTR) - 1)) != 0)
118  {
119  Success = FALSE; // We failed: request HAL to perform a full reset.
120  goto Quit;
121  }
122 
123  DeviceExtension = CONTAINING_RECORD(Entry,
125  HwResetListEntry);
126  /*
127  * As this function can be called as part of the INBV initialization
128  * by the bugcheck code, avoid any problems and protect all accesses
129  * within SEH.
130  */
131  _SEH2_TRY
132  {
133  DriverExtension = DeviceExtension->DriverExtension;
135 
136  if (DeviceExtension->HwResetListEntry.Blink != PrevEntry)
137  {
138  Success = FALSE; // We failed: request HAL to perform a full reset.
139  _SEH2_YIELD(goto Quit);
140  }
141 
142  if ((DeviceExtension->DeviceOpened >= 1) &&
143  (DriverExtension->InitializationData.HwResetHw != NULL))
144  {
145  Success &= DriverExtension->InitializationData.HwResetHw(
146  &DeviceExtension->MiniPortDeviceExtension,
147  Columns, Rows);
148  }
149  }
151  {
152  }
153  _SEH2_END;
154  }
155 
156 Quit:
157  /* Release the lock and restore the old IRQL if we were at dispatch level or lower */
159  if (OldIrql <= DISPATCH_LEVEL)
161 
162  return Success;
163 }
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
static BOOLEAN InbvMonitoring
Definition: dispatch.c:35
struct _Entry Entry
Definition: kefuncs.h:627
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
#define TRUE
Definition: types.h:120
struct _LIST_ENTRY * Blink
Definition: typedefs.h:122
VOID NTAPI KeAcquireSpinLockAtDpcLevel(IN PKSPIN_LOCK SpinLock)
Definition: spinlock.c:198
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
_SEH2_TRY
Definition: create.c:4226
uint32_t ULONG_PTR
Definition: typedefs.h:65
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
_In_ ULONG Rows
Definition: haltypes.h:7
KSPIN_LOCK HwResetAdaptersLock
Definition: videoprt.c:42
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
BOOLEAN FASTCALL KeTestSpinLock(IN PKSPIN_LOCK SpinLock)
Definition: spinlock.c:475
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define ASSERT(a)
Definition: mode.c:44
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
VOID NTAPI KeReleaseSpinLockFromDpcLevel(IN PKSPIN_LOCK SpinLock)
Definition: spinlock.c:221
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
Definition: typedefs.h:119
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
static const COLUMN_LIST Columns[]
Definition: listview.c:19
_SEH2_END
Definition: create.c:4400
#define NULL
Definition: types.h:112
VOID NTAPI KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql)
Definition: spinlock.c:27
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
LIST_ENTRY HwResetAdaptersList
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
VOID NTAPI KeLowerIrql(KIRQL NewIrql)
Definition: spinlock.c:39
base of all file and directory entries
Definition: entries.h:82

Referenced by IntVideoPortDispatchDeviceControl(), IntVideoPortInbvCleanup(), and IntVideoPortResetDisplayParameters().

◆ IntVideoPortUnload()

VOID NTAPI IntVideoPortUnload ( PDRIVER_OBJECT  DriverObject)

Definition at line 1190 of file dispatch.c.

1191 {
1192 }

Referenced by VideoPortInitialize().

◆ IoctlName()

PSTR IoctlName ( ULONG  Ioctl)

Definition at line 450 of file dispatch.c.

451 {
452  switch (Ioctl)
453  {
455  return "IOCTL_VIDEO_ENABLE_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS)
457  return "IOCTL_VIDEO_DISABLE_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS)
459  return "IOCTL_VIDEO_REGISTER_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS)
461  return "IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS)
463  return "IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS)
465  return "IOCTL_VIDEO_MONITOR_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x05, METHOD_BUFFERED, FILE_ANY_ACCESS)
467  return "IOCTL_VIDEO_ENUM_MONITOR_PDO"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x06, METHOD_BUFFERED, FILE_ANY_ACCESS)
469  return "IOCTL_VIDEO_INIT_WIN32K_CALLBACKS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x07, METHOD_BUFFERED, FILE_ANY_ACCESS)
471  return "IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS)
473  return "IOCTL_VIDEO_IS_VGA_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x09, METHOD_BUFFERED, FILE_ANY_ACCESS)
475  return "IOCTL_VIDEO_USE_DEVICE_IN_SESSION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x0a, METHOD_BUFFERED, FILE_ANY_ACCESS)
477  return "IOCTL_VIDEO_PREPARE_FOR_EARECOVERY"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x0b, METHOD_BUFFERED, FILE_ANY_ACCESS)
479  return "IOCTL_VIDEO_SAVE_HARDWARE_STATE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x80, METHOD_BUFFERED, FILE_ANY_ACCESS)
481  return "IOCTL_VIDEO_RESTORE_HARDWARE_STATE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x81, METHOD_BUFFERED, FILE_ANY_ACCESS)
483  return "IOCTL_VIDEO_QUERY_AVAIL_MODES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x100, METHOD_BUFFERED, FILE_ANY_ACCESS)
485  return "IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x101, METHOD_BUFFERED, FILE_ANY_ACCESS)
487  return "IOCTL_VIDEO_QUERY_CURRENT_MODE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x102, METHOD_BUFFERED, FILE_ANY_ACCESS)
489  return "IOCTL_VIDEO_SET_CURRENT_MODE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x103, METHOD_BUFFERED, FILE_ANY_ACCESS)
491  return "IOCTL_VIDEO_RESET_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x104, METHOD_BUFFERED, FILE_ANY_ACCESS)
493  return "IOCTL_VIDEO_LOAD_AND_SET_FONT"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS)
495  return "IOCTL_VIDEO_SET_PALETTE_REGISTERS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x106, METHOD_BUFFERED, FILE_ANY_ACCESS)
497  return "IOCTL_VIDEO_SET_COLOR_REGISTERS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x107, METHOD_BUFFERED, FILE_ANY_ACCESS)
499  return "IOCTL_VIDEO_ENABLE_CURSOR"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x108, METHOD_BUFFERED, FILE_ANY_ACCESS)
501  return "IOCTL_VIDEO_DISABLE_CURSOR"; // CTL_CODE (FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS)
503  return "IOCTL_VIDEO_SET_CURSOR_ATTR"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10a, METHOD_BUFFERED, FILE_ANY_ACCESS)
505  return "IOCTL_VIDEO_QUERY_CURSOR_ATTR"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10b, METHOD_BUFFERED, FILE_ANY_ACCESS)
507  return "IOCTL_VIDEO_SET_CURSOR_POSITION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10c, METHOD_BUFFERED, FILE_ANY_ACCESS)
509  return "IOCTL_VIDEO_QUERY_CURSOR_POSITION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10d, METHOD_BUFFERED, FILE_ANY_ACCESS)
511  return "IOCTL_VIDEO_ENABLE_POINTER"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10e, METHOD_BUFFERED, FILE_ANY_ACCESS)
513  return "IOCTL_VIDEO_DISABLE_POINTER"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x10f, METHOD_BUFFERED, FILE_ANY_ACCESS)
515  return "IOCTL_VIDEO_SET_POINTER_ATTR"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x110, METHOD_BUFFERED, FILE_ANY_ACCESS)
517  return "IOCTL_VIDEO_QUERY_POINTER_ATTR"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x111, METHOD_BUFFERED, FILE_ANY_ACCESS)
519  return "IOCTL_VIDEO_SET_POINTER_POSITION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x112, METHOD_BUFFERED, FILE_ANY_ACCESS)
521  return "IOCTL_VIDEO_QUERY_POINTER_POSITION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x113, METHOD_BUFFERED, FILE_ANY_ACCESS)
523  return "IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x114, METHOD_BUFFERED, FILE_ANY_ACCESS)
525  return "IOCTL_VIDEO_GET_BANK_SELECT_CODE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x115, METHOD_BUFFERED, FILE_ANY_ACCESS)
527  return "IOCTL_VIDEO_MAP_VIDEO_MEMORY"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x116, METHOD_BUFFERED, FILE_ANY_ACCESS)
529  return "IOCTL_VIDEO_UNMAP_VIDEO_MEMORY"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x117, METHOD_BUFFERED, FILE_ANY_ACCESS)
531  return "IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x118, METHOD_BUFFERED, FILE_ANY_ACCESS)
533  return "IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x119, METHOD_BUFFERED, FILE_ANY_ACCESS)
535  return "IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11a, METHOD_BUFFERED, FILE_ANY_ACCESS)
537  return "IOCTL_VIDEO_SET_POWER_MANAGEMENT"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11b, METHOD_BUFFERED, FILE_ANY_ACCESS)
539  return "IOCTL_VIDEO_GET_POWER_MANAGEMENT"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS)
541  return "IOCTL_VIDEO_SHARE_VIDEO_MEMORY"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11d, METHOD_BUFFERED, FILE_ANY_ACCESS)
543  return "IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11e, METHOD_BUFFERED, FILE_ANY_ACCESS)
545  return "IOCTL_VIDEO_SET_COLOR_LUT_DATA"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x11f, METHOD_BUFFERED, FILE_ANY_ACCESS)
547  return "IOCTL_VIDEO_GET_CHILD_STATE"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x120, METHOD_BUFFERED, FILE_ANY_ACCESS)
549  return "IOCTL_VIDEO_VALIDATE_CHILD_STATE_CONFIGURATION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x121, METHOD_BUFFERED, FILE_ANY_ACCESS)
551  return "IOCTL_VIDEO_SET_CHILD_STATE_CONFIGURATION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x122, METHOD_BUFFERED, FILE_ANY_ACCESS)
553  return "IOCTL_VIDEO_SWITCH_DUALVIEW"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x123, METHOD_BUFFERED, FILE_ANY_ACCESS)
555  return "IOCTL_VIDEO_SET_BANK_POSITION"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x124, METHOD_BUFFERED, FILE_ANY_ACCESS)
557  return "IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x125, METHOD_BUFFERED, FILE_ANY_ACCESS)
559  return "IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x126, METHOD_BUFFERED, FILE_ANY_ACCESS)
561  return "IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS"; // CTL_CODE(FILE_DEVICE_VIDEO, 0x127, METHOD_BUFFERED, FILE_ANY_ACCESS)
562  }
563 
564  return "<unknown ioctl code>";
565 }
#define IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES
Definition: ntddvdeo.h:110
#define IOCTL_VIDEO_IS_VGA_DEVICE
Definition: ntddvdeo.h:68
#define IOCTL_VIDEO_QUERY_POINTER_POSITION
Definition: ntddvdeo.h:131
#define IOCTL_VIDEO_QUERY_POINTER_ATTR
Definition: ntddvdeo.h:125
#define IOCTL_VIDEO_SET_POINTER_ATTR
Definition: ntddvdeo.h:164
#define IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
Definition: ntddvdeo.h:182
#define IOCTL_VIDEO_REGISTER_VDM
Definition: ntddvdeo.h:47
#define IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
Definition: ntddvdeo.h:128
#define IOCTL_VIDEO_DISABLE_CURSOR
Definition: ntddvdeo.h:77
#define IOCTL_VIDEO_SET_COLOR_LUT_DATA
Definition: ntddvdeo.h:185
#define IOCTL_VIDEO_ENABLE_VDM
Definition: ntddvdeo.h:41
#define IOCTL_VIDEO_SET_CHILD_STATE_CONFIGURATION
Definition: ntddvdeo.h:146
#define IOCTL_VIDEO_GET_POWER_MANAGEMENT
Definition: ntddvdeo.h:98
#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS
Definition: ntddvdeo.h:65
#define IOCTL_VIDEO_RESET_DEVICE
Definition: ntddvdeo.h:137
#define IOCTL_VIDEO_MAP_VIDEO_MEMORY
Definition: ntddvdeo.h:104
#define IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE
Definition: ntddvdeo.h:53
#define IOCTL_VIDEO_GET_BANK_SELECT_CODE
Definition: ntddvdeo.h:92
#define IOCTL_VIDEO_DISABLE_POINTER
Definition: ntddvdeo.h:80
#define IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
Definition: ntddvdeo.h:89
#define IOCTL_VIDEO_ENUM_MONITOR_PDO
Definition: ntddvdeo.h:59
#define IOCTL_VIDEO_QUERY_CURRENT_MODE
Definition: ntddvdeo.h:113
#define IOCTL_VIDEO_SET_CURRENT_MODE
Definition: ntddvdeo.h:152
_Must_inspect_result_ __in WDFIOTARGET __in_opt WDFREQUEST __in ULONG Ioctl
#define IOCTL_VIDEO_MONITOR_DEVICE
Definition: ntddvdeo.h:56
#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS
Definition: ntddvdeo.h:62
#define IOCTL_VIDEO_SET_PALETTE_REGISTERS
Definition: ntddvdeo.h:161
#define IOCTL_VIDEO_SET_CURSOR_POSITION
Definition: ntddvdeo.h:158
#define IOCTL_VIDEO_QUERY_CURSOR_ATTR
Definition: ntddvdeo.h:116
#define IOCTL_VIDEO_SET_POWER_MANAGEMENT
Definition: ntddvdeo.h:170
#define IOCTL_VIDEO_SET_CURSOR_ATTR
Definition: ntddvdeo.h:155
#define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
Definition: ntddvdeo.h:179
#define IOCTL_VIDEO_ENABLE_CURSOR
Definition: ntddvdeo.h:83
#define IOCTL_VIDEO_QUERY_CURSOR_POSITION
Definition: ntddvdeo.h:119
#define IOCTL_VIDEO_SWITCH_DUALVIEW
Definition: ntddvdeo.h:176
#define IOCTL_VIDEO_PREPARE_FOR_EARECOVERY
Definition: ntddvdeo.h:74
#define IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
Definition: ntddvdeo.h:200
#define IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS
Definition: ntddvdeo.h:194
#define IOCTL_VIDEO_LOAD_AND_SET_FONT
Definition: ntddvdeo.h:101
#define IOCTL_VIDEO_DISABLE_VDM
Definition: ntddvdeo.h:44
#define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
Definition: ntddvdeo.h:122
#define IOCTL_VIDEO_QUERY_AVAIL_MODES
Definition: ntddvdeo.h:107
#define IOCTL_VIDEO_SHARE_VIDEO_MEMORY
Definition: ntddvdeo.h:173
#define IOCTL_VIDEO_VALIDATE_CHILD_STATE_CONFIGURATION
Definition: ntddvdeo.h:188
#define IOCTL_VIDEO_GET_CHILD_STATE
Definition: ntddvdeo.h:95
#define IOCTL_VIDEO_ENABLE_POINTER
Definition: ntddvdeo.h:86
#define IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES
Definition: ntddvdeo.h:134
#define IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS
Definition: ntddvdeo.h:197
#define IOCTL_VIDEO_RESTORE_HARDWARE_STATE
Definition: ntddvdeo.h:140
#define IOCTL_VIDEO_USE_DEVICE_IN_SESSION
Definition: ntddvdeo.h:71
#define IOCTL_VIDEO_SAVE_HARDWARE_STATE
Definition: ntddvdeo.h:143
#define IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE
Definition: ntddvdeo.h:50
#define IOCTL_VIDEO_SET_POINTER_POSITION
Definition: ntddvdeo.h:167
#define IOCTL_VIDEO_SET_COLOR_REGISTERS
Definition: ntddvdeo.h:149
#define IOCTL_VIDEO_SET_BANK_POSITION
Definition: ntddvdeo.h:191

Referenced by IntVideoPortDispatchDeviceControl().

◆ VideoPortForwardDeviceControl()

static NTSTATUS VideoPortForwardDeviceControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 654 of file dispatch.c.

657 {
658  PIO_STACK_LOCATION IrpStack;
660  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
662 
663  TRACE_(VIDEOPRT, "VideoPortForwardDeviceControl\n");
664 
665  IrpStack = IoGetCurrentIrpStackLocation(Irp);
666  DeviceExtension = DeviceObject->DeviceExtension;
667  DriverExtension = DeviceExtension->DriverExtension;
668 
669  /* Translate the IRP to a VRP */
670  vrp.StatusBlock = (PSTATUS_BLOCK)&Irp->IoStatus;
671  vrp.IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
672 
673  INFO_(VIDEOPRT, "- IoControlCode: %x\n", vrp.IoControlCode);
674 
675  /* We're assuming METHOD_BUFFERED */
676  vrp.InputBuffer = Irp->AssociatedIrp.SystemBuffer;
677  vrp.InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
678  vrp.OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
679  vrp.OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
680 
681  /* Call the Miniport Driver with the VRP */
682  DriverExtension->InitializationData.HwStartIO(&DeviceExtension->MiniPortDeviceExtension,
683  &vrp);
684 
685  INFO_(VIDEOPRT, "- Returned status: %x\n", Irp->IoStatus.Status);
686 
687  /* Map from win32 error codes to NT status values. */
688  switch (Irp->IoStatus.Status)
689  {
690  case NO_ERROR:
691  return STATUS_SUCCESS;
694  case ERROR_MORE_DATA:
695  return STATUS_BUFFER_OVERFLOW;
697  return STATUS_NOT_IMPLEMENTED;
702  case ERROR_DEV_NOT_EXIST:
704  case ERROR_IO_PENDING:
705  return STATUS_PENDING;
706  default:
707  return STATUS_UNSUCCESSFUL;
708  }
709 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define STATUS_DEVICE_DOES_NOT_EXIST
Definition: ntstatus.h:428
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define INFO_(ch,...)
Definition: debug.h:159
VIDEO_PORT_DRIVER_EXTENSION * DriverExtension
Definition: videoprt.h:103
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
struct _STATUS_BLOCK * PSTATUS_BLOCK
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
ULONG InputBufferLength
Definition: video.h:333
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define NO_ERROR
Definition: dderror.h:5
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
return STATUS_NOT_IMPLEMENTED
_In_ PIRP Irp
Definition: csq.h:116
ULONG OutputBufferLength
Definition: video.h:335
#define TRACE_(x)
Definition: compat.h:76
#define STATUS_PENDING
Definition: ntstatus.h:82
CHAR POINTER_ALIGNMENT MiniPortDeviceExtension[1]
Definition: videoprt.h:113
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ERROR_MORE_DATA
Definition: dderror.h:13
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
PSTATUS_BLOCK StatusBlock
Definition: video.h:331
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10

Referenced by IntVideoPortDispatchDeviceControl().

◆ VideoPortInitWin32kCallbacks()

static NTSTATUS VideoPortInitWin32kCallbacks ( _In_ PDEVICE_OBJECT  DeviceObject,
_Inout_ PVIDEO_WIN32K_CALLBACKS  Win32kCallbacks,
_In_ ULONG  BufferLength,
_Out_ PULONG_PTR  Information 
)
static

Definition at line 627 of file dispatch.c.

632 {
634  if (BufferLength < sizeof(VIDEO_WIN32K_CALLBACKS))
635  {
636  ERR_(VIDEOPRT, "Buffer too small for VIDEO_WIN32K_CALLBACKS: %lx\n",
637  BufferLength);
639  }
640 
641  /* Save the callout function globally */
642  Win32kCallout = Win32kCallbacks->Callout;
643 
644  /* Return reasonable values to Win32k */
645  Win32kCallbacks->bACPI = FALSE;
646  Win32kCallbacks->pPhysDeviceObject = DeviceObject;
647  Win32kCallbacks->DualviewFlags = 0;
648 
649  return STATUS_SUCCESS;
650 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
#define ERR_(ch,...)
Definition: debug.h:156
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1044
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FALSE
Definition: types.h:117
struct _VIDEO_WIN32K_CALLBACKS VIDEO_WIN32K_CALLBACKS
#define STATUS_SUCCESS
Definition: shellext.h:65
static PVIDEO_WIN32K_CALLOUT Win32kCallout
Definition: dispatch.c:33

Referenced by IntVideoPortDispatchDeviceControl().

◆ VideoPortUseDeviceInSession()

static NTSTATUS VideoPortUseDeviceInSession ( _Inout_ PDEVICE_OBJECT  DeviceObject,
_Inout_ PVIDEO_DEVICE_SESSION_STATUS  SessionState,
_In_ ULONG  BufferLength,
_Out_ PULONG_PTR  Information 
)
static

Definition at line 569 of file dispatch.c.

574 {
575  PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
576 
577  /* Check buffer size */
580  {
581  ERR_(VIDEOPRT, "Buffer too small for VIDEO_DEVICE_SESSION_STATUS: %lx\n",
582  BufferLength);
584  }
585 
586  /* Get the device extension */
587  DeviceExtension = DeviceObject->DeviceExtension;
588 
589  /* Shall we enable the session? */
590  if (SessionState->bEnable)
591  {
592  /* Check if we have no session yet */
593  if (DeviceExtension->SessionId == -1)
594  {
595  /* Use this session and return success */
596  DeviceExtension->SessionId = PsGetCurrentProcessSessionId();
597  SessionState->bSuccess = TRUE;
598  }
599  else
600  {
601  ERR_(VIDEOPRT, "Requested to set session, but session is already set to: 0x%lx\n",
602  DeviceExtension->SessionId);
603  SessionState->bSuccess = FALSE;
604  }
605  }
606  else
607  {
608  /* Check if we belong to the current session */
609  if (DeviceExtension->SessionId == PsGetCurrentProcessSessionId())
610  {
611  /* Reset the session and return success */
612  DeviceExtension->SessionId = -1;
613  SessionState->bSuccess = TRUE;
614  }
615  else
616  {
617  ERR_(VIDEOPRT, "Requested to reset session, but session is not set\n");
618  SessionState->bSuccess = FALSE;
619  }
620  }
621 
622  return STATUS_SUCCESS;
623 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
#define TRUE
Definition: types.h:120
struct _VIDEO_DEVICE_SESSION_STATUS VIDEO_DEVICE_SESSION_STATUS
#define ERR_(ch,...)
Definition: debug.h:156
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1044
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define FALSE
Definition: types.h:117
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by IntVideoPortDispatchDeviceControl().

◆ VideoPortWin32kCallout()

static VOID VideoPortWin32kCallout ( _In_ PVIDEO_WIN32K_CALLBACKS_PARAMS  CallbackParams)
static

Definition at line 40 of file dispatch.c.

42 {
43  if (!Win32kCallout)
44  return;
45 
46  /* Perform the call in the context of CSRSS */
47  if (!CsrProcess)
48  return;
49 
51  Win32kCallout(CallbackParams);
53 }
PKPROCESS CsrProcess
Definition: videoprt.c:39
VOID NTAPI KeDetachProcess(VOID)
Definition: procobj.c:621
VOID NTAPI KeAttachProcess(IN PKPROCESS Process)
Definition: procobj.c:582
static PVIDEO_WIN32K_CALLOUT Win32kCallout
Definition: dispatch.c:33

Referenced by InbvMonitorThread().

Variable Documentation

◆ InbvMonitoring

BOOLEAN InbvMonitoring = FALSE
static

Definition at line 35 of file dispatch.c.

Referenced by InbvMonitorThread(), and IntVideoPortResetDisplayParametersEx().

◆ InbvThreadHandle

HANDLE InbvThreadHandle = NULL
static

Definition at line 34 of file dispatch.c.

Referenced by IntVideoPortInbvCleanup(), and IntVideoPortInbvInitialize().

◆ Win32kCallout

PVIDEO_WIN32K_CALLOUT Win32kCallout = NULL
static

Definition at line 33 of file dispatch.c.

Referenced by VideoPortInitWin32kCallbacks(), and VideoPortWin32kCallout().