Author: tkreuzer
Date: Sat Nov 16 18:40:24 2013
New Revision: 61013
URL:
http://svn.reactos.org/svn/reactos?rev=61013&view=rev
Log:
[VIDEOPRT/WINSERV] Move mapping the BIOS memory from winsrv to videoprt, where it
belongs.
[VIDEOPRT] Implement some registry support routines to create new style (XP+) registry
keys. Handle IOCTL_VIDEO_INIT_WIN32K_CALLBACKS in videoprt, reorganize the code to
dispatch ioctls. Simplify failure path in IntVideoPortFindAdapter
Added:
trunk/reactos/win32ss/drivers/videoprt/registry.c (with props)
Modified:
trunk/reactos/win32ss/drivers/videoprt/CMakeLists.txt
trunk/reactos/win32ss/drivers/videoprt/dispatch.c
trunk/reactos/win32ss/drivers/videoprt/int10.c
trunk/reactos/win32ss/drivers/videoprt/videoprt.c
trunk/reactos/win32ss/drivers/videoprt/videoprt.h
trunk/reactos/win32ss/user/winsrv/usersrv/init.c
Modified: trunk/reactos/win32ss/drivers/videoprt/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/C…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/videoprt/CMakeLists.txt [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -15,6 +15,7 @@
funclist.c
int10.c
interrupt.c
+ registry.c
resource.c
services.c
spinlock.c
Modified: trunk/reactos/win32ss/drivers/videoprt/dispatch.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/d…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/dispatch.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/videoprt/dispatch.c [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -24,6 +24,7 @@
/* GLOBAL VARIABLES ***********************************************************/
PVIDEO_PORT_DEVICE_EXTENSION ResetDisplayParametersDeviceExtension = NULL;
+PVIDEO_WIN32K_CALLOUT Win32kCallout;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -110,12 +111,9 @@
Csrss = (PKPROCESS)PsGetCurrentProcess();
INFO_(VIDEOPRT, "Csrss %p\n", Csrss);
+ IntInitializeVideoAddressSpace();
+
CsrssInitialized = TRUE;
-
- Irp->IoStatus.Information = FILE_OPENED;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return STATUS_SUCCESS;
}
DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
@@ -171,6 +169,206 @@
return STATUS_SUCCESS;
}
+PSTR
+IoctlName(ULONG Ioctl)
+{
+ switch(Ioctl)
+ {
+ case IOCTL_VIDEO_ENABLE_VDM:
+ return "IOCTL_VIDEO_ENABLE_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x00, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_DISABLE_VDM:
+ return "IOCTL_VIDEO_DISABLE_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x01, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_REGISTER_VDM:
+ return "IOCTL_VIDEO_REGISTER_VDM"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x02, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE:
+ return "IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE:
+ return "IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_MONITOR_DEVICE:
+ return "IOCTL_VIDEO_MONITOR_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x05, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_ENUM_MONITOR_PDO:
+ return "IOCTL_VIDEO_ENUM_MONITOR_PDO"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x06, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_INIT_WIN32K_CALLBACKS:
+ return "IOCTL_VIDEO_INIT_WIN32K_CALLBACKS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x07, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS:
+ return "IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_IS_VGA_DEVICE:
+ return "IOCTL_VIDEO_IS_VGA_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x09, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_USE_DEVICE_IN_SESSION:
+ return "IOCTL_VIDEO_USE_DEVICE_IN_SESSION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x0a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_PREPARE_FOR_EARECOVERY:
+ return "IOCTL_VIDEO_PREPARE_FOR_EARECOVERY"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x0b, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SAVE_HARDWARE_STATE:
+ return "IOCTL_VIDEO_SAVE_HARDWARE_STATE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x80, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_RESTORE_HARDWARE_STATE:
+ return "IOCTL_VIDEO_RESTORE_HARDWARE_STATE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x81, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_AVAIL_MODES:
+ return "IOCTL_VIDEO_QUERY_AVAIL_MODES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x100, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES:
+ return "IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x101, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_CURRENT_MODE:
+ return "IOCTL_VIDEO_QUERY_CURRENT_MODE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x102, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_CURRENT_MODE:
+ return "IOCTL_VIDEO_SET_CURRENT_MODE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x103, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_RESET_DEVICE:
+ return "IOCTL_VIDEO_RESET_DEVICE"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x104, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_LOAD_AND_SET_FONT:
+ return "IOCTL_VIDEO_LOAD_AND_SET_FONT"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_PALETTE_REGISTERS:
+ return "IOCTL_VIDEO_SET_PALETTE_REGISTERS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x106, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_COLOR_REGISTERS:
+ return "IOCTL_VIDEO_SET_COLOR_REGISTERS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x107, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_ENABLE_CURSOR:
+ return "IOCTL_VIDEO_ENABLE_CURSOR"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x108, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_DISABLE_CURSOR:
+ return "IOCTL_VIDEO_DISABLE_CURSOR"; // CTL_CODE
(FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_CURSOR_ATTR:
+ return "IOCTL_VIDEO_SET_CURSOR_ATTR"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x10a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_CURSOR_ATTR:
+ return "IOCTL_VIDEO_QUERY_CURSOR_ATTR"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x10b, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_CURSOR_POSITION:
+ return "IOCTL_VIDEO_SET_CURSOR_POSITION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x10c, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_CURSOR_POSITION:
+ return "IOCTL_VIDEO_QUERY_CURSOR_POSITION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x10d, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_ENABLE_POINTER:
+ return "IOCTL_VIDEO_ENABLE_POINTER"; // CTL_CODE(FILE_DEVICE_VIDEO,
0x10e, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_DISABLE_POINTER:
+ return "IOCTL_VIDEO_DISABLE_POINTER"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x10f, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_POINTER_ATTR:
+ return "IOCTL_VIDEO_SET_POINTER_ATTR"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x110, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_POINTER_ATTR:
+ return "IOCTL_VIDEO_QUERY_POINTER_ATTR"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x111, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_POINTER_POSITION:
+ return "IOCTL_VIDEO_SET_POINTER_POSITION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x112, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_POINTER_POSITION:
+ return "IOCTL_VIDEO_QUERY_POINTER_POSITION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x113, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES:
+ return "IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x114, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_GET_BANK_SELECT_CODE:
+ return "IOCTL_VIDEO_GET_BANK_SELECT_CODE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x115, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
+ return "IOCTL_VIDEO_MAP_VIDEO_MEMORY"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x116, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY:
+ return "IOCTL_VIDEO_UNMAP_VIDEO_MEMORY"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x117, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES:
+ return "IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x118, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES:
+ return "IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x119, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES:
+ return "IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_POWER_MANAGEMENT:
+ return "IOCTL_VIDEO_SET_POWER_MANAGEMENT"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11b, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_GET_POWER_MANAGEMENT:
+ return "IOCTL_VIDEO_GET_POWER_MANAGEMENT"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SHARE_VIDEO_MEMORY:
+ return "IOCTL_VIDEO_SHARE_VIDEO_MEMORY"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11d, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY:
+ return "IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11e, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_COLOR_LUT_DATA:
+ return "IOCTL_VIDEO_SET_COLOR_LUT_DATA"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x11f, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_GET_CHILD_STATE:
+ return "IOCTL_VIDEO_GET_CHILD_STATE"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x120, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_VALIDATE_CHILD_STATE_CONFIGURATION:
+ return "IOCTL_VIDEO_VALIDATE_CHILD_STATE_CONFIGURATION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x121, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_CHILD_STATE_CONFIGURATION:
+ return "IOCTL_VIDEO_SET_CHILD_STATE_CONFIGURATION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x122, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SWITCH_DUALVIEW:
+ return "IOCTL_VIDEO_SWITCH_DUALVIEW"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x123, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_BANK_POSITION:
+ return "IOCTL_VIDEO_SET_BANK_POSITION"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x124, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS:
+ return "IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x125, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS:
+ return "IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x126, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ case IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS:
+ return "IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS"; //
CTL_CODE(FILE_DEVICE_VIDEO, 0x127, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ }
+
+ return "<unknown ioctl code";
+}
+
+static
+NTSTATUS
+VideoPortInitWin32kCallbacks(
+ IN PDEVICE_OBJECT DeviceObject,
+ PVIDEO_WIN32K_CALLBACKS Win32kCallbacks,
+ ULONG BufferLength)
+{
+ if (BufferLength < sizeof(VIDEO_WIN32K_CALLBACKS))
+ {
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ /* Save the callout function globally */
+ Win32kCallout = Win32kCallbacks->Callout;
+
+ /* Return reasonable values to win32k */
+ Win32kCallbacks->bACPI = FALSE;
+ Win32kCallbacks->pPhysDeviceObject = DeviceObject;
+ Win32kCallbacks->DualviewFlags = 0;
+
+ return STATUS_SUCCESS;
+}
+
+static
+NTSTATUS
+VideoPortForwardDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IrpStack;
+ PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
+ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
+ VIDEO_REQUEST_PACKET vrp;
+
+ TRACE_(VIDEOPRT, "VideoPortForwardDeviceControl\n");
+
+ IrpStack = IoGetCurrentIrpStackLocation(Irp);
+ DeviceExtension = DeviceObject->DeviceExtension;
+ DriverExtension = DeviceExtension->DriverExtension;
+
+ /* Translate the IRP to a VRP */
+ vrp.StatusBlock = (PSTATUS_BLOCK)&Irp->IoStatus;
+ vrp.IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
+
+ INFO_(VIDEOPRT, "- IoControlCode: %x\n", vrp.IoControlCode);
+
+ /* We're assuming METHOD_BUFFERED */
+ vrp.InputBuffer = Irp->AssociatedIrp.SystemBuffer;
+ vrp.InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
+ vrp.OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
+ vrp.OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
+
+ /* Call the Miniport Driver with the VRP */
+
DriverExtension->InitializationData.HwStartIO(&DeviceExtension->MiniPortDeviceExtension,
+ &vrp);
+
+ INFO_(VIDEOPRT, "- Returned status: %x\n", Irp->IoStatus.Status);
+
+ /* Map from win32 error codes to NT status values. */
+ switch (Irp->IoStatus.Status)
+ {
+ case NO_ERROR:
+ return STATUS_SUCCESS;
+ case ERROR_NOT_ENOUGH_MEMORY:
+ return STATUS_INSUFFICIENT_RESOURCES;
+ case ERROR_MORE_DATA:
+ return STATUS_BUFFER_OVERFLOW;
+ case ERROR_INVALID_FUNCTION:
+ return STATUS_NOT_IMPLEMENTED;
+ case ERROR_INVALID_PARAMETER:
+ return STATUS_INVALID_PARAMETER;
+ case ERROR_INSUFFICIENT_BUFFER:
+ return STATUS_BUFFER_TOO_SMALL;
+ case ERROR_DEV_NOT_EXIST:
+ return STATUS_DEVICE_DOES_NOT_EXIST;
+ case ERROR_IO_PENDING:
+ return STATUS_PENDING;
+ default:
+ return STATUS_UNSUCCESSFUL;
+ }
+}
+
/*
* IntVideoPortDispatchDeviceControl
*
@@ -186,76 +384,35 @@
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack;
- PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
- PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
- PVIDEO_REQUEST_PACKET vrp;
NTSTATUS Status;
+ ULONG IoControlCode;
TRACE_(VIDEOPRT, "IntVideoPortDispatchDeviceControl\n");
IrpStack = IoGetCurrentIrpStackLocation(Irp);
- DeviceExtension = DeviceObject->DeviceExtension;
- DriverExtension = DeviceExtension->DriverExtension;
-
- /* Translate the IRP to a VRP */
- vrp = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(VIDEO_REQUEST_PACKET),
- TAG_REQUEST_PACKET);
- if (vrp == NULL)
- {
- return STATUS_NO_MEMORY;
- }
-
- vrp->StatusBlock = (PSTATUS_BLOCK) & (Irp->IoStatus);
- vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
-
- INFO_(VIDEOPRT, "- IoControlCode: %x\n", vrp->IoControlCode);
-
- /* We're assuming METHOD_BUFFERED */
- vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer;
- vrp->InputBufferLength =
IrpStack->Parameters.DeviceIoControl.InputBufferLength;
- vrp->OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
- vrp->OutputBufferLength =
IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
-
- /* Call the Miniport Driver with the VRP */
- DriverExtension->InitializationData.HwStartIO(
- &DeviceExtension->MiniPortDeviceExtension,
- vrp);
-
- /* Free the VRP */
- ExFreePoolWithTag(vrp, TAG_REQUEST_PACKET);
+
+ IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
+
+ INFO_(VIDEOPRT, "- IoControlCode: %x: %s\n", IoControlCode,
IoctlName(IoControlCode));
+
+ switch(IoControlCode)
+ {
+ case IOCTL_VIDEO_INIT_WIN32K_CALLBACKS:
+ INFO_(VIDEOPRT, "- IOCTL_VIDEO_INIT_WIN32K_CALLBACKS\n");
+ Status = VideoPortInitWin32kCallbacks(DeviceObject,
+ Irp->AssociatedIrp.SystemBuffer,
+
IrpStack->Parameters.DeviceIoControl.InputBufferLength);
+ break;
+
+ default:
+ /* Forward to the Miniport Driver */
+ Status = VideoPortForwardDeviceControl(DeviceObject, Irp);
+ break;
+ }
INFO_(VIDEOPRT, "- Returned status: %x\n", Irp->IoStatus.Status);
- if (Irp->IoStatus.Status != STATUS_SUCCESS)
- {
- switch (Irp->IoStatus.Status)
- {
- case ERROR_NOT_ENOUGH_MEMORY:
- Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- break;
- case ERROR_MORE_DATA:
- Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW;
- break;
- case ERROR_INVALID_FUNCTION:
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- break;
- case ERROR_INVALID_PARAMETER:
- Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
- break;
- case ERROR_INSUFFICIENT_BUFFER:
- Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
- break;
- case ERROR_DEV_NOT_EXIST:
- Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST;
- break;
- case ERROR_IO_PENDING:
- Irp->IoStatus.Status = STATUS_PENDING;
- break;
- }
- }
-
- Status = Irp->IoStatus.Status;
+ Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
@@ -278,7 +435,6 @@
* Run Level
* PASSIVE_LEVEL
*/
-
NTSTATUS
NTAPI
IntVideoPortDispatchWrite(
Modified: trunk/reactos/win32ss/drivers/videoprt/int10.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/i…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/int10.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/videoprt/int10.c [iso-8859-1] Sat Nov 16 18:40:24 2013
@@ -22,6 +22,115 @@
#include "videoprt.h"
/* PRIVATE FUNCTIONS **********************************************************/
+
+#if defined(_M_IX86) || defined(_M_AMD64)
+NTSTATUS
+NTAPI
+IntInitializeVideoAddressSpace(VOID)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING PhysMemName =
RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
+ NTSTATUS Status;
+ HANDLE PhysMemHandle;
+ PVOID BaseAddress;
+ LARGE_INTEGER Offset;
+ SIZE_T ViewSize;
+ CHAR IVTAndBda[1024+256];
+
+ /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us
mapping the view into the reserved area, but it doesn't. */
+ BaseAddress = 0;
+ ViewSize = 1024 * 1024;
+ Status = ZwFreeVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ &ViewSize,
+ MEM_RELEASE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Couldn't unmap reserved memory (%x)\n", Status);
+ return 0;
+ }
+
+ /* Open the physical memory section */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &PhysMemName,
+ 0,
+ NULL,
+ NULL);
+ Status = ZwOpenSection(&PhysMemHandle,
+ SECTION_ALL_ACCESS,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
+ return Status;
+ }
+
+ /* Map the BIOS and device registers into the address space */
+ Offset.QuadPart = 0xa0000;
+ ViewSize = 0x100000 - 0xa0000;
+ BaseAddress = (PVOID)0xa0000;
+ Status = ZwMapViewOfSection(PhysMemHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ ViewSize,
+ &Offset,
+ &ViewSize,
+ ViewUnmap,
+ 0,
+ PAGE_EXECUTE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Couldn't map physical memory (%x)\n", Status);
+ ZwClose(PhysMemHandle);
+ return Status;
+ }
+
+ /* Close physical memory section handle */
+ ZwClose(PhysMemHandle);
+
+ if (BaseAddress != (PVOID)0xa0000)
+ {
+ DPRINT1("Couldn't map physical memory at the right address (was
%x)\n",
+ BaseAddress);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Allocate some low memory to use for the non-BIOS
+ * parts of the v86 mode address space
+ */
+ BaseAddress = (PVOID)0x1;
+ ViewSize = 0xa0000 - 0x1000;
+ Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_RESERVE | MEM_COMMIT,
+ PAGE_EXECUTE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status);
+ return Status;
+ }
+ if (BaseAddress != (PVOID)0x0)
+ {
+ DPRINT1("Failed to allocate virtual memory at right address (was
%x)\n",
+ BaseAddress);
+ return 0;
+ }
+
+ /* Get the real mode IVT and BDA from the kernel */
+ Status = NtVdmControl(VdmInitialize, IVTAndBda);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtVdmControl failed (status %x)\n", Status);
+ return Status;
+ }
+
+ /* Return success */
+ return STATUS_SUCCESS;
+}
+#endif
#if defined(_M_IX86)
VP_STATUS NTAPI
Added: trunk/reactos/win32ss/drivers/videoprt/registry.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/r…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/registry.c (added)
+++ trunk/reactos/win32ss/drivers/videoprt/registry.c [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -0,0 +1,636 @@
+/*
+ * VideoPort driver
+ *
+ * Copyright (C) 2002-2004, 2007 ReactOS Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "videoprt.h"
+
+NTSTATUS
+NTAPI
+IntCopyRegistryKey(
+ _In_ HANDLE SourceKeyHandle,
+ _In_ HANDLE DestKeyHandle)
+{
+ PVOID InfoBuffer;
+ PKEY_BASIC_INFORMATION KeyInformation;
+ PKEY_VALUE_FULL_INFORMATION KeyValueInformation;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ ULONG Index, InformationLength, RequiredLength;
+ UNICODE_STRING NameString;
+ NTSTATUS Status;
+ HANDLE SourceSubKeyHandle, DestSubKeyHandle;
+
+ /* Start with no buffer, set initial size */
+ InfoBuffer = NULL;
+ InformationLength = 256;
+
+ /* Start looping with key index 0 */
+ Index = 0;
+ while (TRUE)
+ {
+ /* Check if we have no buffer */
+ if (InfoBuffer == NULL)
+ {
+ /* Allocate a new buffer */
+ InfoBuffer = ExAllocatePoolWithTag(PagedPool,
+ InformationLength,
+ TAG_VIDEO_PORT_BUFFER);
+ if (InfoBuffer == NULL)
+ {
+ ERR_(VIDEOPRT, "Could not allocate buffer for key info\n");
+ return Status;
+ }
+ }
+
+ /* Enumerate the next sub-key */
+ KeyInformation = InfoBuffer;
+ Status = ZwEnumerateKey(SourceKeyHandle,
+ Index,
+ KeyBasicInformation,
+ KeyInformation,
+ InformationLength,
+ &RequiredLength);
+ if ((Status == STATUS_BUFFER_OVERFLOW) ||
+ (Status == STATUS_BUFFER_TOO_SMALL))
+ {
+ /* Free the buffer and remember the required size */
+ ExFreePoolWithTag(InfoBuffer, TAG_VIDEO_PORT_BUFFER);
+ InfoBuffer = NULL;
+ InformationLength = RequiredLength;
+
+ /* Try again */
+ continue;
+ }
+ else if (Status == STATUS_NO_MORE_ENTRIES)
+ {
+ /* We are done with the sub-keys */
+ break;
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "ZwEnumerateKey failed, status 0x%lx\n", Status);
+ goto Cleanup;
+ }
+
+ /* Initialize a unicode string from the key name */
+ NameString.Buffer = KeyInformation->Name;
+ NameString.Length = (USHORT)KeyInformation->NameLength;
+ NameString.MaximumLength = NameString.Length;
+
+ /* Initialize object attributes and open the source sub-key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &NameString,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ SourceKeyHandle,
+ NULL);
+ Status = ZwOpenKey(&SourceSubKeyHandle, KEY_READ, &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "failed to open the source key.\n");
+ goto Cleanup;
+ }
+
+ /* Initialize object attributes and create the dest sub-key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &NameString,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ DestKeyHandle,
+ NULL);
+ Status = ZwCreateKey(&DestSubKeyHandle,
+ KEY_WRITE,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "failed to create the destination key.\n");
+ ObCloseHandle(SourceSubKeyHandle, KernelMode);
+ goto Cleanup;
+ }
+
+ /* Recursively copy the sub-key */
+ Status = IntCopyRegistryKey(SourceSubKeyHandle, DestSubKeyHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Just warn, but continue with the remaining sub-keys */
+ WARN_(VIDEOPRT, "failed to copy subkey '%wZ'.\n",
&NameString);
+ }
+
+ /* Close the sub-key handles */
+ ObCloseHandle(SourceSubKeyHandle, KernelMode);
+ ObCloseHandle(DestSubKeyHandle, KernelMode);
+
+ /* Next sub-key */
+ Index++;
+ }
+
+ /* Start looping with value index 0 */
+ Index = 0;
+ while (TRUE)
+ {
+ /* Check if we have no buffer */
+ if (InfoBuffer == NULL)
+ {
+ /* Allocate a new buffer */
+ InfoBuffer = ExAllocatePoolWithTag(PagedPool,
+ InformationLength,
+ TAG_VIDEO_PORT_BUFFER);
+ if (InfoBuffer == NULL)
+ {
+ ERR_(VIDEOPRT, "Could not allocate buffer for key values\n");
+ return Status;
+ }
+ }
+
+ /* Enumerate the next value */
+ KeyValueInformation = InfoBuffer;
+ Status = ZwEnumerateValueKey(SourceKeyHandle,
+ Index,
+ KeyValueFullInformation,
+ KeyValueInformation,
+ InformationLength,
+ &RequiredLength);
+ if ((Status == STATUS_BUFFER_OVERFLOW) ||
+ (Status == STATUS_BUFFER_TOO_SMALL))
+ {
+ /* Free the buffer and remember the required size */
+ ExFreePoolWithTag(InfoBuffer, TAG_VIDEO_PORT_BUFFER);
+ InfoBuffer = NULL;
+ InformationLength = RequiredLength;
+
+ /* Try again */
+ continue;
+ }
+ else if (Status == STATUS_NO_MORE_ENTRIES)
+ {
+ /* We are done with the values */
+ Status = STATUS_SUCCESS;
+ break;
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "ZwEnumerateValueKey failed, status 0x%lx\n",
Status);
+ goto Cleanup;
+ }
+
+ /* Initialize a unicode string from the value name */
+ NameString.Buffer = KeyValueInformation->Name;
+ NameString.Length = (USHORT)KeyValueInformation->NameLength;
+ NameString.MaximumLength = NameString.Length;
+
+ /* Create the key value in the destination key */
+ Status = ZwSetValueKey(DestKeyHandle,
+ &NameString,
+ KeyValueInformation->TitleIndex,
+ KeyValueInformation->Type,
+ (PUCHAR)KeyValueInformation +
KeyValueInformation->DataOffset,
+ KeyValueInformation->DataLength);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Just warn, but continue with the remaining sub-keys */
+ WARN_(VIDEOPRT, "failed to set value '%wZ'.\n",
NameString);
+ }
+
+ /* Next subkey */
+ Index++;
+ }
+
+Cleanup:
+ /* Free the buffer and return the failure code */
+ if (InfoBuffer != NULL)
+ ExFreePoolWithTag(InfoBuffer, TAG_VIDEO_PORT_BUFFER);
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IntCopyRegistryValue(
+ HANDLE SourceKeyHandle,
+ HANDLE DestKeyHandle,
+ PWSTR ValueName)
+{
+ PKEY_VALUE_PARTIAL_INFORMATION ValueInformation;
+ UNICODE_STRING ValueNameString;
+ ULONG Length;
+ NTSTATUS Status;
+
+ RtlInitUnicodeString(&ValueNameString, ValueName);
+
+ /* Query the value length */
+ Status = ZwQueryValueKey(SourceKeyHandle,
+ &ValueNameString,
+ KeyValuePartialInformation,
+ NULL,
+ 0,
+ &Length);
+ if ((Status != STATUS_BUFFER_OVERFLOW) &&
+ (Status != STATUS_BUFFER_TOO_SMALL))
+ {
+ /* The key seems not present */
+ NT_ASSERT(!NT_SUCCESS(Status));
+ return Status;
+ }
+
+ /* Allocate a buffer */
+ ValueInformation = ExAllocatePoolWithTag(PagedPool, Length, TAG_VIDEO_PORT_BUFFER);
+ if (ValueInformation == NULL)
+ {
+ return Status;
+ }
+
+ /* Query the value */
+ Status = ZwQueryValueKey(SourceKeyHandle,
+ &ValueNameString,
+ KeyValuePartialInformation,
+ ValueInformation,
+ Length,
+ &Length);
+ if (!NT_SUCCESS(Status))
+ {
+ ExFreePoolWithTag(ValueInformation, TAG_VIDEO_PORT_BUFFER);
+ return Status;
+ }
+
+ /* Write the registry value */
+ Status = ZwSetValueKey(DestKeyHandle,
+ &ValueNameString,
+ ValueInformation->TitleIndex,
+ ValueInformation->Type,
+ ValueInformation->Data,
+ ValueInformation->DataLength);
+
+ ExFreePoolWithTag(ValueInformation, TAG_VIDEO_PORT_BUFFER);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "ZwSetValueKey failed: status 0x%lx\n", Status);
+ }
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IntSetupDeviceSettingsKey(
+ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
+{
+ static UNICODE_STRING SettingsKeyName = RTL_CONSTANT_STRING(L"Settings");
+ HANDLE DevInstRegKey, SourceKeyHandle, DestKeyHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ NTSTATUS Status;
+
+ /* Open the software key:
HKLM\System\CurrentControlSet\Control\Class\<ClassGUID>\<n> */
+ Status = IoOpenDeviceRegistryKey(DeviceExtension->PhysicalDeviceObject,
+ PLUGPLAY_REGKEY_DRIVER,
+ KEY_ALL_ACCESS,
+ &DevInstRegKey);
+ if (Status != STATUS_SUCCESS)
+ {
+ ERR_(VIDEOPRT, "Failed to open device software key. Status 0x%lx",
Status);
+ return Status;
+ }
+
+ /* Open the 'Settings' sub-key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &SettingsKeyName,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ DevInstRegKey,
+ NULL);
+ Status = ZwOpenKey(&DestKeyHandle, KEY_WRITE, &ObjectAttributes);
+
+ /* Close the device software key */
+ ObCloseHandle(DevInstRegKey, KernelMode);
+
+ if (Status != STATUS_SUCCESS)
+ {
+ ERR_(VIDEOPRT, "Failed to open settings key. Status 0x%lx", Status);
+ return Status;
+ }
+
+ /* Open the device profile key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &DeviceExtension->RegistryPath,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ Status = ZwOpenKey(&SourceKeyHandle, KEY_WRITE, &ObjectAttributes);
+ if (Status != STATUS_SUCCESS)
+ {
+ ERR_(VIDEOPRT, "ZwOpenKey failed for settings key: status 0x%lx",
Status);
+ ObCloseHandle(DestKeyHandle, KernelMode);
+ return Status;
+ }
+
+ IntCopyRegistryValue(SourceKeyHandle, DestKeyHandle,
L"InstalledDisplayDrivers");
+ IntCopyRegistryValue(SourceKeyHandle, DestKeyHandle, L"Attach.ToDesktop");
+
+ ObCloseHandle(SourceKeyHandle, KernelMode);
+ ObCloseHandle(DestKeyHandle, KernelMode);
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+IntCreateNewRegistryPath(
+ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
+{
+ static UNICODE_STRING VideoIdValueName = RTL_CONSTANT_STRING(L"VideoId");
+ static UNICODE_STRING ControlVideoPathName =
+
RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Video\\");
+ HANDLE DevInstRegKey, SettingsKey, NewKey;
+ UCHAR VideoIdBuffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + GUID_STRING_LENGTH];
+ UNICODE_STRING VideoIdString;
+ UUID VideoId;
+ PKEY_VALUE_PARTIAL_INFORMATION ValueInformation ;
+ NTSTATUS Status;
+ ULONG ResultLength;
+ USHORT KeyMaxLength;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+
+ /* Open the hardware key: HKLM\System\CurrentControlSet\Enum\... */
+ Status = IoOpenDeviceRegistryKey(DeviceExtension->PhysicalDeviceObject,
+ PLUGPLAY_REGKEY_DEVICE,
+ KEY_ALL_ACCESS,
+ &DevInstRegKey);
+ if (Status != STATUS_SUCCESS)
+ {
+ ERR_(VIDEOPRT, "IoOpenDeviceRegistryKey failed: status 0x%lx\n",
Status);
+ return Status;
+ }
+
+ /* Query the VideoId value */
+ ValueInformation = (PKEY_VALUE_PARTIAL_INFORMATION)VideoIdBuffer;
+ Status = ZwQueryValueKey(DevInstRegKey,
+ &VideoIdValueName,
+ KeyValuePartialInformation,
+ ValueInformation,
+ sizeof(VideoIdBuffer),
+ &ResultLength);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Create a new video Id */
+ Status = ExUuidCreate(&VideoId);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "ExUuidCreate failed: status 0x%lx\n", Status);
+ ObCloseHandle(DevInstRegKey, KernelMode);
+ return Status;
+ }
+
+ /* Convert the GUID into a string */
+ Status = RtlStringFromGUID(&VideoId, &VideoIdString);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "RtlStringFromGUID failed: status 0x%lx\n",
Status);
+ ObCloseHandle(DevInstRegKey, KernelMode);
+ return Status;
+ }
+
+ /* Copy the GUID String to our buffer */
+ ValueInformation->DataLength = min(VideoIdString.Length, GUID_STRING_LENGTH);
+ RtlCopyMemory(ValueInformation->Data,
+ VideoIdString.Buffer,
+ ValueInformation->DataLength);
+
+ /* Free the GUID string */
+ RtlFreeUnicodeString(&VideoIdString);
+
+ /* Write the VideoId registry value */
+ Status = ZwSetValueKey(DevInstRegKey,
+ &VideoIdValueName,
+ 0,
+ REG_SZ,
+ ValueInformation->Data,
+ ValueInformation->DataLength);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "ZwSetValueKey failed: status 0x%lx\n", Status);
+ ObCloseHandle(DevInstRegKey, KernelMode);
+ return Status;
+ }
+ }
+
+ /* Initialize the VideoId string from the registry data */
+ VideoIdString.Buffer = (PWCHAR)ValueInformation->Data;
+ VideoIdString.Length = (USHORT)ValueInformation->DataLength;
+ VideoIdString.MaximumLength = VideoIdString.Length;
+
+ /* Close the hardware key */
+ ObCloseHandle(DevInstRegKey, KernelMode);
+
+ /* Calculate the size needed for the new registry path name */
+ KeyMaxLength = ControlVideoPathName.Length +
+ VideoIdString.Length +
+ sizeof(L"\\0000");
+
+ /* Allocate the path name buffer */
+ DeviceExtension->NewRegistryPath.Length = 0;
+ DeviceExtension->NewRegistryPath.MaximumLength = KeyMaxLength;
+ DeviceExtension->NewRegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool,
+ KeyMaxLength,
+ TAG_VIDEO_PORT);
+ if (DeviceExtension->NewRegistryPath.Buffer == NULL)
+ {
+ ERR_(VIDEOPRT, "Failed to allocate key name buffer.\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Copy the root key name and append the VideoId string */
+ RtlCopyUnicodeString(&DeviceExtension->NewRegistryPath,
+ &ControlVideoPathName);
+ RtlAppendUnicodeStringToString(&DeviceExtension->NewRegistryPath,
+ &VideoIdString);
+
+ /* Check if we have the key already */
+ Status = RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE,
+ DeviceExtension->NewRegistryPath.Buffer);
+ if (Status != STATUS_SUCCESS)
+ {
+ /* Try to create the new key */
+ Status = RtlCreateRegistryKey(RTL_REGISTRY_ABSOLUTE,
+ DeviceExtension->NewRegistryPath.Buffer);
+ }
+
+ /* Append a the instance path */ /// \todo HACK
+ RtlAppendUnicodeToString(&DeviceExtension->NewRegistryPath, L"\\");
+ RtlAppendUnicodeToString(&DeviceExtension->NewRegistryPath,
L"0000");
+
+ /* Check this key again */
+ Status = RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE,
+ DeviceExtension->NewRegistryPath.Buffer);
+ if (Status != STATUS_SUCCESS)
+ {
+ /* Try to create the new key */
+ Status = RtlCreateRegistryKey(RTL_REGISTRY_ABSOLUTE,
+ DeviceExtension->NewRegistryPath.Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "Failed create key '%wZ'\n",
&DeviceExtension->NewRegistryPath);
+ return Status;
+ }
+
+ /* Open the new key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &DeviceExtension->NewRegistryPath,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ Status = ZwOpenKey(&NewKey, KEY_READ, &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "Failed to open settings key. Status 0x%lx\n",
Status);
+ return Status;
+ }
+
+ /* Open the device profile key */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &DeviceExtension->RegistryPath,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ Status = ZwOpenKey(&SettingsKey, KEY_READ, &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR_(VIDEOPRT, "Failed to open settings key. Status 0x%lx\n",
Status);
+ ObCloseHandle(NewKey, KernelMode);
+ return Status;
+ }
+
+ /* Copy the registry data from the legacy key */
+ Status = IntCopyRegistryKey(SettingsKey, NewKey);
+ }
+
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+IntCreateRegistryPath(
+ IN PCUNICODE_STRING DriverRegistryPath,
+ OUT PUNICODE_STRING DeviceRegistryPath)
+{
+ static WCHAR RegistryMachineSystem[] = L"\\REGISTRY\\MACHINE\\SYSTEM\\";
+ static WCHAR CurrentControlSet[] = L"CURRENTCONTROLSET\\";
+ static WCHAR ControlSet[] = L"CONTROLSET";
+ static WCHAR Insert1[] = L"Hardware
Profiles\\Current\\System\\CurrentControlSet\\";
+ static WCHAR Insert2[] = L"\\Device0";
+ BOOLEAN Valid;
+ UNICODE_STRING AfterControlSet;
+
+ AfterControlSet = *DriverRegistryPath;
+
+ /* Check if path begins with \\REGISTRY\\MACHINE\\SYSTEM\\ */
+ Valid = (DriverRegistryPath->Length > sizeof(RegistryMachineSystem) &&
+ 0 == _wcsnicmp(DriverRegistryPath->Buffer, RegistryMachineSystem,
+ wcslen(RegistryMachineSystem)));
+ if (Valid)
+ {
+ AfterControlSet.Buffer += wcslen(RegistryMachineSystem);
+ AfterControlSet.Length -= sizeof(RegistryMachineSystem) - sizeof(UNICODE_NULL);
+
+ /* Check if path contains CURRENTCONTROLSET */
+ if (AfterControlSet.Length > sizeof(CurrentControlSet) &&
+ 0 == _wcsnicmp(AfterControlSet.Buffer, CurrentControlSet,
wcslen(CurrentControlSet)))
+ {
+ AfterControlSet.Buffer += wcslen(CurrentControlSet);
+ AfterControlSet.Length -= sizeof(CurrentControlSet) - sizeof(UNICODE_NULL);
+ }
+ /* Check if path contains CONTROLSETnum */
+ else if (AfterControlSet.Length > sizeof(ControlSet) &&
+ 0 == _wcsnicmp(AfterControlSet.Buffer, ControlSet, wcslen(ControlSet)))
+ {
+ AfterControlSet.Buffer += wcslen(ControlSet);
+ AfterControlSet.Length -= sizeof(ControlSet) - sizeof(UNICODE_NULL);
+ while (AfterControlSet.Length > 0 &&
+ *AfterControlSet.Buffer >= L'0' &&
+ *AfterControlSet.Buffer <= L'9')
+ {
+ AfterControlSet.Buffer++;
+ AfterControlSet.Length -= sizeof(WCHAR);
+ }
+
+ Valid = (AfterControlSet.Length > 0 && L'\\' ==
*AfterControlSet.Buffer);
+ AfterControlSet.Buffer++;
+ AfterControlSet.Length -= sizeof(WCHAR);
+ AfterControlSet.MaximumLength = AfterControlSet.Length;
+ }
+ else
+ {
+ Valid = FALSE;
+ }
+ }
+
+ if (Valid)
+ {
+ DeviceRegistryPath->MaximumLength = DriverRegistryPath->Length +
sizeof(Insert1) + sizeof(Insert2);
+ DeviceRegistryPath->Buffer = ExAllocatePoolWithTag(PagedPool,
+
DeviceRegistryPath->MaximumLength,
+ TAG_VIDEO_PORT);
+ if (DeviceRegistryPath->Buffer != NULL)
+ {
+ /* Build device path */
+ wcsncpy(DeviceRegistryPath->Buffer,
+ DriverRegistryPath->Buffer,
+ AfterControlSet.Buffer - DriverRegistryPath->Buffer);
+ DeviceRegistryPath->Length = (AfterControlSet.Buffer -
DriverRegistryPath->Buffer) * sizeof(WCHAR);
+ RtlAppendUnicodeToString(DeviceRegistryPath, Insert1);
+ RtlAppendUnicodeStringToString(DeviceRegistryPath, &AfterControlSet);
+ RtlAppendUnicodeToString(DeviceRegistryPath, Insert2);
+
+ /* Check if registry key exists */
+ Valid = NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE,
DeviceRegistryPath->Buffer));
+
+ if (!Valid)
+ ExFreePoolWithTag(DeviceRegistryPath->Buffer, TAG_VIDEO_PORT);
+ }
+ else
+ {
+ Valid = FALSE;
+ }
+ }
+ else
+ {
+ WARN_(VIDEOPRT, "Unparsable registry path %wZ", DriverRegistryPath);
+ }
+
+ /* If path doesn't point to *ControlSet*, use DriverRegistryPath directly */
+ if (!Valid)
+ {
+ DeviceRegistryPath->MaximumLength = DriverRegistryPath->Length +
sizeof(Insert2);
+ DeviceRegistryPath->Buffer = ExAllocatePoolWithTag(NonPagedPool,
+
DeviceRegistryPath->MaximumLength,
+ TAG_VIDEO_PORT);
+
+ if (!DeviceRegistryPath->Buffer)
+ return STATUS_NO_MEMORY;
+
+ RtlCopyUnicodeString(DeviceRegistryPath, DriverRegistryPath);
+ RtlAppendUnicodeToString(DeviceRegistryPath, Insert2);
+ }
+
+ DbgPrint("Formatted registry key '%wZ' -> '%wZ'\n",
+ DriverRegistryPath, DeviceRegistryPath);
+
+ return STATUS_SUCCESS;
+}
+
Propchange: trunk/reactos/win32ss/drivers/videoprt/registry.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/win32ss/drivers/videoprt/videoprt.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/v…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/videoprt.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/videoprt/videoprt.c [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -75,114 +75,6 @@
((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2);
}
-static
-NTSTATUS
-IntCreateRegistryPath(
- IN PCUNICODE_STRING DriverRegistryPath,
- OUT PUNICODE_STRING DeviceRegistryPath)
-{
- static WCHAR RegistryMachineSystem[] = L"\\REGISTRY\\MACHINE\\SYSTEM\\";
- static WCHAR CurrentControlSet[] = L"CURRENTCONTROLSET\\";
- static WCHAR ControlSet[] = L"CONTROLSET";
- static WCHAR Insert1[] = L"Hardware
Profiles\\Current\\System\\CurrentControlSet\\";
- static WCHAR Insert2[] = L"\\Device0";
- BOOLEAN Valid;
- UNICODE_STRING AfterControlSet;
-
- AfterControlSet = *DriverRegistryPath;
-
- /* Check if path begins with \\REGISTRY\\MACHINE\\SYSTEM\\ */
- Valid = (DriverRegistryPath->Length > sizeof(RegistryMachineSystem) &&
- 0 == _wcsnicmp(DriverRegistryPath->Buffer, RegistryMachineSystem,
- wcslen(RegistryMachineSystem)));
- if (Valid)
- {
- AfterControlSet.Buffer += wcslen(RegistryMachineSystem);
- AfterControlSet.Length -= sizeof(RegistryMachineSystem) - sizeof(UNICODE_NULL);
-
- /* Check if path contains CURRENTCONTROLSET */
- if (AfterControlSet.Length > sizeof(CurrentControlSet) &&
- 0 == _wcsnicmp(AfterControlSet.Buffer, CurrentControlSet,
wcslen(CurrentControlSet)))
- {
- AfterControlSet.Buffer += wcslen(CurrentControlSet);
- AfterControlSet.Length -= sizeof(CurrentControlSet) - sizeof(UNICODE_NULL);
- }
- /* Check if path contains CONTROLSETnum */
- else if (AfterControlSet.Length > sizeof(ControlSet) &&
- 0 == _wcsnicmp(AfterControlSet.Buffer, ControlSet, wcslen(ControlSet)))
- {
- AfterControlSet.Buffer += wcslen(ControlSet);
- AfterControlSet.Length -= sizeof(ControlSet) - sizeof(UNICODE_NULL);
- while (AfterControlSet.Length > 0 &&
- *AfterControlSet.Buffer >= L'0' &&
- *AfterControlSet.Buffer <= L'9')
- {
- AfterControlSet.Buffer++;
- AfterControlSet.Length -= sizeof(WCHAR);
- }
-
- Valid = (AfterControlSet.Length > 0 && L'\\' ==
*AfterControlSet.Buffer);
- AfterControlSet.Buffer++;
- AfterControlSet.Length -= sizeof(WCHAR);
- AfterControlSet.MaximumLength = AfterControlSet.Length;
- }
- else
- {
- Valid = FALSE;
- }
- }
-
- if (Valid)
- {
- DeviceRegistryPath->MaximumLength = DriverRegistryPath->Length +
sizeof(Insert1) + sizeof(Insert2);
- DeviceRegistryPath->Buffer = ExAllocatePoolWithTag(PagedPool,
-
DeviceRegistryPath->MaximumLength,
- TAG_VIDEO_PORT);
- if (DeviceRegistryPath->Buffer != NULL)
- {
- /* Build device path */
- wcsncpy(DeviceRegistryPath->Buffer,
- DriverRegistryPath->Buffer,
- AfterControlSet.Buffer - DriverRegistryPath->Buffer);
- DeviceRegistryPath->Length = (AfterControlSet.Buffer -
DriverRegistryPath->Buffer) * sizeof(WCHAR);
- RtlAppendUnicodeToString(DeviceRegistryPath, Insert1);
- RtlAppendUnicodeStringToString(DeviceRegistryPath, &AfterControlSet);
- RtlAppendUnicodeToString(DeviceRegistryPath, Insert2);
-
- /* Check if registry key exists */
- Valid = NT_SUCCESS(RtlCheckRegistryKey(RTL_REGISTRY_ABSOLUTE,
DeviceRegistryPath->Buffer));
-
- if (!Valid)
- ExFreePoolWithTag(DeviceRegistryPath->Buffer, TAG_VIDEO_PORT);
- }
- else
- {
- Valid = FALSE;
- }
- }
- else
- {
- WARN_(VIDEOPRT, "Unparsable registry path %wZ", DriverRegistryPath);
- }
-
- /* If path doesn't point to *ControlSet*, use DriverRegistryPath directly */
- if (!Valid)
- {
- DeviceRegistryPath->MaximumLength = DriverRegistryPath->Length +
sizeof(Insert2);
- DeviceRegistryPath->Buffer = ExAllocatePoolWithTag(NonPagedPool,
-
DeviceRegistryPath->MaximumLength,
- TAG_VIDEO_PORT);
-
- if (!DeviceRegistryPath->Buffer)
- return STATUS_NO_MEMORY;
-
- RtlCopyUnicodeString(DeviceRegistryPath, DriverRegistryPath);
- RtlAppendUnicodeToString(DeviceRegistryPath, Insert2);
- }
-
- return STATUS_SUCCESS;
-}
-
NTSTATUS
NTAPI
IntVideoPortCreateAdapterDeviceObject(
@@ -227,15 +119,15 @@
DriverExtension->InitializationData.HwDeviceExtensionSize);
/* Create the device object. */
- Status = IoCreateDevice(
- DriverObject,
- sizeof(VIDEO_PORT_DEVICE_EXTENSION) +
- DriverExtension->InitializationData.HwDeviceExtensionSize,
- &DeviceName,
- FILE_DEVICE_VIDEO,
- 0,
- TRUE,
- DeviceObject);
+ Size = sizeof(VIDEO_PORT_DEVICE_EXTENSION) +
+ DriverExtension->InitializationData.HwDeviceExtensionSize;
+ Status = IoCreateDevice(DriverObject,
+ Size,
+ &DeviceName,
+ FILE_DEVICE_VIDEO,
+ 0,
+ TRUE,
+ DeviceObject);
if (!NT_SUCCESS(Status))
{
@@ -261,7 +153,7 @@
InitializeListHead(&DeviceExtension->ChildDeviceList);
- /* Get the registry path associated with this driver. */
+ /* Get the registry path associated with this device. */
Status = IntCreateRegistryPath(&DriverExtension->RegistryPath,
&DeviceExtension->RegistryPath);
if (!NT_SUCCESS(Status))
@@ -276,12 +168,11 @@
{
/* Get bus number from the upper level bus driver. */
Size = sizeof(ULONG);
- Status = IoGetDeviceProperty(
- PhysicalDeviceObject,
- DevicePropertyBusNumber,
- Size,
- &DeviceExtension->SystemIoBusNumber,
- &Size);
+ Status = IoGetDeviceProperty(PhysicalDeviceObject,
+ DevicePropertyBusNumber,
+ Size,
+ &DeviceExtension->SystemIoBusNumber,
+ &Size);
if (!NT_SUCCESS(Status))
{
WARN_(VIDEOPRT, "Couldn't get an information from bus driver. We
will try to\n"
@@ -333,6 +224,9 @@
DeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack(
*DeviceObject,
PhysicalDeviceObject);
+
+ IntCreateNewRegistryPath(DeviceExtension);
+ IntSetupDeviceSettingsKey(DeviceExtension);
/* Remove the initailizing flag */
(*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -434,12 +328,7 @@
else
{
ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n",
Status);
- RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
- if (DeviceExtension->NextDeviceObject)
- IoDetachDevice(DeviceExtension->NextDeviceObject);
- IoDeleteDevice(DeviceObject);
-
- return Status;
+ goto Failure;
}
}
}
@@ -457,11 +346,7 @@
if (Status != NO_ERROR)
{
ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status);
- RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
- if (DeviceExtension->NextDeviceObject)
- IoDetachDevice(DeviceExtension->NextDeviceObject);
- IoDeleteDevice(DeviceObject);
- return Status;
+ goto Failure;
}
/*
@@ -501,27 +386,18 @@
/* Allocate interrupt for device. */
if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo))
{
- RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
- if (DeviceExtension->NextDeviceObject)
- IoDetachDevice(DeviceExtension->NextDeviceObject);
- IoDeleteDevice(DeviceObject);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- /*
- * Allocate timer for device.
- */
-
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto Failure;
+ }
+
+ /* Allocate timer for device. */
if (!IntVideoPortSetupTimer(DeviceObject, DriverExtension))
{
if (DeviceExtension->InterruptObject != NULL)
IoDisconnectInterrupt(DeviceExtension->InterruptObject);
- if (DeviceExtension->NextDeviceObject)
- IoDetachDevice(DeviceExtension->NextDeviceObject);
- RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
- IoDeleteDevice(DeviceObject);
ERR_(VIDEOPRT, "IntVideoPortSetupTimer failed\n");
- return STATUS_INSUFFICIENT_RESOURCES;
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto Failure;
}
/* Query children of the device. */
@@ -529,12 +405,19 @@
INFO_(VIDEOPRT, "STATUS_SUCCESS\n");
return STATUS_SUCCESS;
+
+Failure:
+ RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+ if (DeviceExtension->NextDeviceObject)
+ IoDetachDevice(DeviceExtension->NextDeviceObject);
+ IoDeleteDevice(DeviceObject);
+ return Status;
}
VOID
FASTCALL
IntAttachToCSRSS(
- PKPROCESS *CallingProcess,
+ PKPROCESS *CallingProcess,
PKAPC_STATE ApcState)
{
*CallingProcess = (PKPROCESS)PsGetCurrentProcess();
@@ -584,9 +467,9 @@
return STATUS_REVISION_MISMATCH;
}
- if (HwInitializationData->HwFindAdapter == NULL ||
- HwInitializationData->HwInitialize == NULL ||
- HwInitializationData->HwStartIO == NULL)
+ if ((HwInitializationData->HwFindAdapter == NULL) ||
+ (HwInitializationData->HwInitialize == NULL) ||
+ (HwInitializationData->HwStartIO == NULL))
{
ERR_(VIDEOPRT, "Invalid HwInitializationData\n");
return STATUS_INVALID_PARAMETER;
@@ -628,10 +511,10 @@
/* Determine type of the miniport driver */
if ((HwInitializationData->HwInitDataSize >=
- FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface))
- && HwInitializationData->HwSetPowerState
- && HwInitializationData->HwGetPowerState
- && HwInitializationData->HwGetVideoChildDescriptor)
+ FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) &&
+ (HwInitializationData->HwSetPowerState != NULL) &&
+ (HwInitializationData->HwGetPowerState != NULL) &&
+ (HwInitializationData->HwGetVideoChildDescriptor != NULL))
{
INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n");
PnpDriver = TRUE;
@@ -658,12 +541,10 @@
DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
if (DriverExtension == NULL)
{
- Status = IoAllocateDriverObjectExtension(
- DriverObject,
- DriverObject,
- sizeof(VIDEO_PORT_DRIVER_EXTENSION),
- (PVOID *)&DriverExtension);
-
+ Status = IoAllocateDriverObjectExtension(DriverObject,
+ DriverObject,
+ sizeof(VIDEO_PORT_DRIVER_EXTENSION),
+ (PVOID *)&DriverExtension);
if (!NT_SUCCESS(Status))
{
ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n",
Status);
@@ -699,9 +580,7 @@
}
}
- /*
- * Copy the correct miniport initialization data to the device extension.
- */
+ /* Copy the correct miniport initialization data to the device extension. */
RtlCopyMemory(&DriverExtension->InitializationData,
HwInitializationData,
HwInitializationData->HwInitDataSize);
@@ -728,6 +607,7 @@
/* power management */
DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower;
}
+
Status = IntVideoPortCreateAdapterDeviceObject(DriverObject,
DriverExtension,
NULL,
Modified: trunk/reactos/win32ss/drivers/videoprt/videoprt.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/drivers/videoprt/v…
==============================================================================
--- trunk/reactos/win32ss/drivers/videoprt/videoprt.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/drivers/videoprt/videoprt.h [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -30,6 +30,7 @@
#include <ndk/inbvfuncs.h>
#include <ndk/kefuncs.h>
#include <ndk/rtlfuncs.h>
+#include <ndk/obfuncs.h>
#define __BROKEN__
#include <miniport.h>
@@ -46,6 +47,8 @@
#define TAG_VIDEO_PORT_BUFFER '\0mpV'
#define TAG_REQUEST_PACKET 'qRpV'
+#define GUID_STRING_LENGTH 38 * sizeof(WCHAR)
+
typedef struct _VIDEO_PORT_ADDRESS_MAPPING
{
LIST_ENTRY List;
@@ -93,6 +96,7 @@
PDEVICE_OBJECT FunctionalDeviceObject;
PDEVICE_OBJECT NextDeviceObject;
UNICODE_STRING RegistryPath;
+ UNICODE_STRING NewRegistryPath;
PKINTERRUPT InterruptObject;
KSPIN_LOCK InterruptSpinLock;
PCM_RESOURCE_LIST AllocatedResources;
@@ -280,6 +284,10 @@
/* int10.c */
+NTSTATUS
+NTAPI
+IntInitializeVideoAddressSpace(VOID);
+
VP_STATUS NTAPI
IntInt10AllocateBuffer(
IN PVOID Context,
@@ -314,4 +322,36 @@
IN PVOID Context,
IN OUT PINT10_BIOS_ARGUMENTS BiosArguments);
+/* registry.c */
+
+NTSTATUS
+NTAPI
+IntCopyRegistryKey(
+ _In_ HANDLE SourceKeyHandle,
+ _In_ HANDLE DestKeyHandle);
+
+NTSTATUS
+NTAPI
+IntCopyRegistryValue(
+ HANDLE SourceKeyHandle,
+ HANDLE DestKeyHandle,
+ PWSTR ValueName);
+
+NTSTATUS
+NTAPI
+IntSetupDeviceSettingsKey(
+ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension);
+
+NTSTATUS
+NTAPI
+IntCreateNewRegistryPath(
+ PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension);
+
+NTSTATUS
+NTAPI
+IntCreateRegistryPath(
+ IN PCUNICODE_STRING DriverRegistryPath,
+ OUT PUNICODE_STRING DeviceRegistryPath);
+
+
#endif /* VIDEOPRT_H */
Modified: trunk/reactos/win32ss/user/winsrv/usersrv/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/winsrv/usersr…
==============================================================================
--- trunk/reactos/win32ss/user/winsrv/usersrv/init.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/winsrv/usersrv/init.c [iso-8859-1] Sat Nov 16 18:40:24
2013
@@ -89,150 +89,6 @@
return TRUE;
}
-ULONG
-InitializeVideoAddressSpace(VOID)
-{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING PhysMemName =
RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
- NTSTATUS Status;
- HANDLE PhysMemHandle;
- PVOID BaseAddress;
- LARGE_INTEGER Offset;
- SIZE_T ViewSize;
- CHAR IVTAndBda[1024+256];
-
- /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us
mapping the view into the reserved area, but it doesn't. */
- BaseAddress = 0;
- ViewSize = 1024 * 1024;
- Status = ZwFreeVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- &ViewSize,
- MEM_RELEASE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Couldn't unmap reserved memory (%x)\n", Status);
- return 0;
- }
-
- /* Open the physical memory section */
- InitializeObjectAttributes(&ObjectAttributes,
- &PhysMemName,
- 0,
- NULL,
- NULL);
- Status = ZwOpenSection(&PhysMemHandle,
- SECTION_ALL_ACCESS,
- &ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
- return 0;
- }
-
- /* Map the BIOS and device registers into the address space */
- Offset.QuadPart = 0xa0000;
- ViewSize = 0x100000 - 0xa0000;
- BaseAddress = (PVOID)0xa0000;
- Status = ZwMapViewOfSection(PhysMemHandle,
- NtCurrentProcess(),
- &BaseAddress,
- 0,
- ViewSize,
- &Offset,
- &ViewSize,
- ViewUnmap,
- 0,
- PAGE_EXECUTE_READWRITE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Couldn't map physical memory (%x)\n", Status);
- ZwClose(PhysMemHandle);
- return 0;
- }
-
- /* Close physical memory section handle */
- ZwClose(PhysMemHandle);
-
- if (BaseAddress != (PVOID)0xa0000)
- {
- DPRINT1("Couldn't map physical memory at the right address (was
%x)\n",
- BaseAddress);
- return 0;
- }
-
- /* Allocate some low memory to use for the non-BIOS
- * parts of the v86 mode address space
- */
- BaseAddress = (PVOID)0x1;
- ViewSize = 0xa0000 - 0x1000;
- Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- 0,
- &ViewSize,
- MEM_RESERVE | MEM_COMMIT,
- PAGE_EXECUTE_READWRITE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status);
- return 0;
- }
- if (BaseAddress != (PVOID)0x0)
- {
- DPRINT1("Failed to allocate virtual memory at right address (was
%x)\n",
- BaseAddress);
- return 0;
- }
-
- /* Get the real mode IVT and BDA from the kernel */
- Status = NtVdmControl(VdmInitialize, IVTAndBda);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("NtVdmControl failed (status %x)\n", Status);
- return 0;
- }
-
- /* Return success */
- return 1;
-}
-
-/**********************************************************************
- * UserpInitVideo
- *
- * TODO: we need a virtual device for sessions other than
- * TODO: the console one
- */
-NTSTATUS
-UserpInitVideo(VOID)
-{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
- IO_STATUS_BLOCK Iosb;
- HANDLE VideoHandle = (HANDLE) 0;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DPRINT("CSR: %s called\n", __FUNCTION__);
-
- InitializeVideoAddressSpace();
-
- InitializeObjectAttributes(&ObjectAttributes,
- &DeviceName,
- 0,
- NULL,
- NULL);
- Status = NtOpenFile(&VideoHandle,
- FILE_ALL_ACCESS,
- &ObjectAttributes,
- &Iosb,
- 0,
- 0);
- if (NT_SUCCESS(Status))
- {
- NtClose(VideoHandle);
- }
-
- return Status;
-}
-
// From win32ss/user/win32csr/dllmain.c
VOID
WINAPI
@@ -287,8 +143,7 @@
UserServerHeap = RtlGetProcessHeap();
/* Initialize the video */
- UserpInitVideo();
- NtUserInitialize(0, NULL, NULL);
+ NtUserInitialize(0, NULL, NULL); //
PrivateCsrssManualGuiCheck(0);
/* Setup the DLL Object */