From a937b3aad1fea550010c767f0303856b664a3600 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 13 Nov 2013 21:32:16 +0000 Subject: [PATCH] [VIDEOPRT][FORMATTING] Apply proper indentation. svn path=/trunk/; revision=60982 --- reactos/win32ss/drivers/videoprt/videoprt.c | 2393 +++++++++---------- 1 file changed, 1193 insertions(+), 1200 deletions(-) diff --git a/reactos/win32ss/drivers/videoprt/videoprt.c b/reactos/win32ss/drivers/videoprt/videoprt.c index 00bcec95520..d4695678d12 100644 --- a/reactos/win32ss/drivers/videoprt/videoprt.c +++ b/reactos/win32ss/drivers/videoprt/videoprt.c @@ -30,538 +30,530 @@ ULONG VideoPortDeviceNumber = 0; /* PRIVATE FUNCTIONS **********************************************************/ -ULONG NTAPI +ULONG +NTAPI DriverEntry( - IN PVOID Context1, - IN PVOID Context2) + IN PVOID Context1, + IN PVOID Context2) { - return STATUS_SUCCESS; + return STATUS_SUCCESS; } -PVOID NTAPI +PVOID +NTAPI IntVideoPortImageDirectoryEntryToData( - PVOID BaseAddress, - ULONG Directory) + PVOID BaseAddress, + ULONG Directory) { - PIMAGE_NT_HEADERS NtHeader; - ULONG Va; + PIMAGE_NT_HEADERS NtHeader; + ULONG Va; - NtHeader = RtlImageNtHeader(BaseAddress); - if (NtHeader == NULL) - return NULL; + NtHeader = RtlImageNtHeader(BaseAddress); + if (NtHeader == NULL) + return NULL; - if (Directory >= NtHeader->OptionalHeader.NumberOfRvaAndSizes) - return NULL; + if (Directory >= NtHeader->OptionalHeader.NumberOfRvaAndSizes) + return NULL; - Va = NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress; - if (Va == 0) - return NULL; + Va = NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress; + if (Va == 0) + return NULL; - return (PVOID)((ULONG_PTR)BaseAddress + Va); + return (PVOID)((ULONG_PTR)BaseAddress + Va); } -VOID NTAPI +VOID +NTAPI IntVideoPortDeferredRoutine( - IN PKDPC Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2) + IN PKDPC Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2) { - PVOID HwDeviceExtension = - &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension; - ((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2); + PVOID HwDeviceExtension = + &((PVIDEO_PORT_DEVICE_EXTENSION)DeferredContext)->MiniPortDeviceExtension; + ((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 -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 +NTAPI IntVideoPortCreateAdapterDeviceObject( - IN PDRIVER_OBJECT DriverObject, - IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PDEVICE_OBJECT *DeviceObject OPTIONAL) + IN PDRIVER_OBJECT DriverObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PDEVICE_OBJECT *DeviceObject OPTIONAL) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG DeviceNumber; - ULONG PciSlotNumber; - PCI_SLOT_NUMBER SlotNumber; - ULONG Size; - NTSTATUS Status; - WCHAR DeviceBuffer[20]; - UNICODE_STRING DeviceName; - PDEVICE_OBJECT DeviceObject_; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG DeviceNumber; + ULONG PciSlotNumber; + PCI_SLOT_NUMBER SlotNumber; + ULONG Size; + NTSTATUS Status; + WCHAR DeviceBuffer[20]; + UNICODE_STRING DeviceName; + PDEVICE_OBJECT DeviceObject_; - if (DeviceObject == NULL) - DeviceObject = &DeviceObject_; + if (DeviceObject == NULL) + DeviceObject = &DeviceObject_; - /* - * Find the first free device number that can be used for video device - * object names and symlinks. - */ + /* + * Find the first free device number that can be used for video device + * object names and symlinks. + */ + DeviceNumber = VideoPortDeviceNumber; + if (DeviceNumber == 0xFFFFFFFF) + { + WARN_(VIDEOPRT, "Can't find free device number\n"); + return STATUS_UNSUCCESSFUL; + } - DeviceNumber = VideoPortDeviceNumber; - if (DeviceNumber == 0xFFFFFFFF) - { - WARN_(VIDEOPRT, "Can't find free device number\n"); - return STATUS_UNSUCCESSFUL; - } + /* + * Create the device object. + */ - /* - * Create the device object. - */ + /* Create a unicode device name. */ + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + RtlInitUnicodeString(&DeviceName, DeviceBuffer); - /* Create a unicode device name. */ - swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); - RtlInitUnicodeString(&DeviceName, DeviceBuffer); + INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n", + DriverExtension->InitializationData.HwDeviceExtensionSize); - INFO_(VIDEOPRT, "HwDeviceExtension size is: 0x%x\n", - 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); - /* Create the device object. */ - Status = IoCreateDevice( - DriverObject, - sizeof(VIDEO_PORT_DEVICE_EXTENSION) + - DriverExtension->InitializationData.HwDeviceExtensionSize, - &DeviceName, - FILE_DEVICE_VIDEO, - 0, - TRUE, - DeviceObject); + if (!NT_SUCCESS(Status)) + { + WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status); + return Status; + } - if (!NT_SUCCESS(Status)) - { - WARN_(VIDEOPRT, "IoCreateDevice call failed with status 0x%08x\n", Status); - return Status; - } + /* + * Set the buffering strategy here. If you change this, remember + * to change VidDispatchDeviceControl too. + */ - /* - * Set the buffering strategy here. If you change this, remember - * to change VidDispatchDeviceControl too. - */ + (*DeviceObject)->Flags |= DO_BUFFERED_IO; - (*DeviceObject)->Flags |= DO_BUFFERED_IO; + /* Initialize device extension. */ + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension); + DeviceExtension->Common.Fdo = TRUE; + DeviceExtension->DeviceNumber = DeviceNumber; + DeviceExtension->DriverObject = DriverObject; + DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; + DeviceExtension->FunctionalDeviceObject = *DeviceObject; + DeviceExtension->DriverExtension = DriverExtension; - /* - * Initialize device extension. - */ + InitializeListHead(&DeviceExtension->ChildDeviceList); - DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)((*DeviceObject)->DeviceExtension); - DeviceExtension->Common.Fdo = TRUE; - DeviceExtension->DeviceNumber = DeviceNumber; - DeviceExtension->DriverObject = DriverObject; - DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; - DeviceExtension->FunctionalDeviceObject = *DeviceObject; - DeviceExtension->DriverExtension = DriverExtension; + /* Get the registry path associated with this driver. */ + Status = IntCreateRegistryPath(&DriverExtension->RegistryPath, + &DeviceExtension->RegistryPath); + if (!NT_SUCCESS(Status)) + { + WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status); + IoDeleteDevice(*DeviceObject); + *DeviceObject = NULL; + return Status; + } - InitializeListHead(&DeviceExtension->ChildDeviceList); + if (PhysicalDeviceObject != NULL) + { + /* Get bus number from the upper level bus driver. */ + Size = sizeof(ULONG); + 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" + "use legacy detection method, but even that doesn't mean that\n" + "it will work.\n"); + DeviceExtension->PhysicalDeviceObject = NULL; + } + } - /* - * Get the registry path associated with this driver. - */ + DeviceExtension->AdapterInterfaceType = + DriverExtension->InitializationData.AdapterInterfaceType; - Status = IntCreateRegistryPath( - &DriverExtension->RegistryPath, - &DeviceExtension->RegistryPath); - if (!NT_SUCCESS(Status)) - { - WARN_(VIDEOPRT, "IntCreateRegistryPath() call failed with status 0x%08x\n", Status); - IoDeleteDevice(*DeviceObject); - *DeviceObject = NULL; - return Status; - } + if (PhysicalDeviceObject != NULL) + { + /* Get bus type from the upper level bus driver. */ + Size = sizeof(ULONG); + IoGetDeviceProperty(PhysicalDeviceObject, + DevicePropertyLegacyBusType, + Size, + &DeviceExtension->AdapterInterfaceType, + &Size); - if (PhysicalDeviceObject != NULL) - { - /* Get bus number from the upper level bus driver. */ - Size = sizeof(ULONG); - 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" - "use legacy detection method, but even that doesn't mean that\n" - "it will work.\n"); - DeviceExtension->PhysicalDeviceObject = NULL; - } - } - - DeviceExtension->AdapterInterfaceType = - DriverExtension->InitializationData.AdapterInterfaceType; - - if (PhysicalDeviceObject != NULL) - { - /* Get bus type from the upper level bus driver. */ - Size = sizeof(ULONG); - IoGetDeviceProperty( - PhysicalDeviceObject, - DevicePropertyLegacyBusType, - Size, - &DeviceExtension->AdapterInterfaceType, - &Size); - - /* Get bus device address from the upper level bus driver. */ - Size = sizeof(ULONG); - IoGetDeviceProperty( - PhysicalDeviceObject, - DevicePropertyAddress, - Size, - &PciSlotNumber, - &Size); + /* Get bus device address from the upper level bus driver. */ + Size = sizeof(ULONG); + IoGetDeviceProperty(PhysicalDeviceObject, + DevicePropertyAddress, + Size, + &PciSlotNumber, + &Size); /* Convert slotnumber to PCI_SLOT_NUMBER */ SlotNumber.u.AsULONG = 0; SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF; SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF; DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG; - } + } - InitializeListHead(&DeviceExtension->AddressMappingListHead); - InitializeListHead(&DeviceExtension->DmaAdapterList); + InitializeListHead(&DeviceExtension->AddressMappingListHead); + InitializeListHead(&DeviceExtension->DmaAdapterList); - KeInitializeDpc( - &DeviceExtension->DpcObject, - IntVideoPortDeferredRoutine, - DeviceExtension); + KeInitializeDpc(&DeviceExtension->DpcObject, + IntVideoPortDeferredRoutine, + DeviceExtension); - KeInitializeMutex(&DeviceExtension->DeviceLock, 0); + KeInitializeMutex(&DeviceExtension->DeviceLock, 0); - /* Attach the device. */ - if (PhysicalDeviceObject != NULL) - DeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack( - *DeviceObject, PhysicalDeviceObject); + /* Attach the device. */ + if (PhysicalDeviceObject != NULL) + DeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack( + *DeviceObject, + PhysicalDeviceObject); - /* Remove the initailizing flag */ - (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING; - return STATUS_SUCCESS; + /* Remove the initailizing flag */ + (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING; + return STATUS_SUCCESS; } -NTSTATUS NTAPI +NTSTATUS +NTAPI IntVideoPortFindAdapter( - IN PDRIVER_OBJECT DriverObject, - IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, - IN PDEVICE_OBJECT DeviceObject) + IN PDRIVER_OBJECT DriverObject, + IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, + IN PDEVICE_OBJECT DeviceObject) { - WCHAR DeviceVideoBuffer[20]; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - SIZE_T Size; - NTSTATUS Status; - VIDEO_PORT_CONFIG_INFO ConfigInfo; - SYSTEM_BASIC_INFORMATION SystemBasicInfo; - UCHAR Again = FALSE; - WCHAR DeviceBuffer[20]; - UNICODE_STRING DeviceName; - WCHAR SymlinkBuffer[20]; - UNICODE_STRING SymlinkName; - BOOL LegacyDetection = FALSE; - ULONG DeviceNumber; + WCHAR DeviceVideoBuffer[20]; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + SIZE_T Size; + NTSTATUS Status; + VIDEO_PORT_CONFIG_INFO ConfigInfo; + SYSTEM_BASIC_INFORMATION SystemBasicInfo; + UCHAR Again = FALSE; + WCHAR DeviceBuffer[20]; + UNICODE_STRING DeviceName; + WCHAR SymlinkBuffer[20]; + UNICODE_STRING SymlinkName; + BOOL LegacyDetection = FALSE; + ULONG DeviceNumber; - DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DeviceNumber = DeviceExtension->DeviceNumber; + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DeviceNumber = DeviceExtension->DeviceNumber; - /* - * Setup a ConfigInfo structure that we will pass to HwFindAdapter. - */ + /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */ + RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO)); + ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO); + ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType; + if (ConfigInfo.AdapterInterfaceType == PCIBus) + ConfigInfo.InterruptMode = LevelSensitive; + else + ConfigInfo.InterruptMode = Latched; + ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer; + ConfigInfo.VideoPortGetProcAddress = IntVideoPortGetProcAddress; + ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; + ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel; + ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector; - RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO)); - ConfigInfo.Length = sizeof(VIDEO_PORT_CONFIG_INFO); - ConfigInfo.AdapterInterfaceType = DeviceExtension->AdapterInterfaceType; - if (ConfigInfo.AdapterInterfaceType == PCIBus) - ConfigInfo.InterruptMode = LevelSensitive; - else - ConfigInfo.InterruptMode = Latched; - ConfigInfo.DriverRegistryPath = DriverExtension->RegistryPath.Buffer; - ConfigInfo.VideoPortGetProcAddress = IntVideoPortGetProcAddress; - ConfigInfo.SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - ConfigInfo.BusInterruptLevel = DeviceExtension->InterruptLevel; - ConfigInfo.BusInterruptVector = DeviceExtension->InterruptVector; + Size = sizeof(SystemBasicInfo); + Status = ZwQuerySystemInformation(SystemBasicInformation, + &SystemBasicInfo, + Size, + &Size); + if (NT_SUCCESS(Status)) + { + ConfigInfo.SystemMemorySize = SystemBasicInfo.NumberOfPhysicalPages * + SystemBasicInfo.PageSize; + } - Size = sizeof(SystemBasicInfo); - Status = ZwQuerySystemInformation( - SystemBasicInformation, - &SystemBasicInfo, - Size, - &Size); + /* + * Call miniport HwVidFindAdapter entry point to detect if + * particular device is present. There are two possible code + * paths. The first one is for Legacy drivers (NT4) and cases + * when we don't have information about what bus we're on. The + * second case is the standard one for Plug & Play drivers. + */ + if (DeviceExtension->PhysicalDeviceObject == NULL) + { + LegacyDetection = TRUE; + } - if (NT_SUCCESS(Status)) - { - ConfigInfo.SystemMemorySize = - SystemBasicInfo.NumberOfPhysicalPages * - SystemBasicInfo.PageSize; - } + if (LegacyDetection) + { + ULONG BusNumber, MaxBuses; - /* - * Call miniport HwVidFindAdapter entry point to detect if - * particular device is present. There are two possible code - * paths. The first one is for Legacy drivers (NT4) and cases - * when we don't have information about what bus we're on. The - * second case is the standard one for Plug & Play drivers. - */ - if (DeviceExtension->PhysicalDeviceObject == NULL) - { - LegacyDetection = TRUE; - } + MaxBuses = DeviceExtension->AdapterInterfaceType == PCIBus ? PCI_MAX_BRIDGE_NUMBER : 1; - if (LegacyDetection) - { - ULONG BusNumber, MaxBuses; + for (BusNumber = 0; BusNumber < MaxBuses; BusNumber++) + { + DeviceExtension->SystemIoBusNumber = + ConfigInfo.SystemIoBusNumber = BusNumber; - MaxBuses = DeviceExtension->AdapterInterfaceType == PCIBus ? PCI_MAX_BRIDGE_NUMBER : 1; + RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension, + DriverExtension->InitializationData.HwDeviceExtensionSize); - for (BusNumber = 0; BusNumber < MaxBuses; BusNumber++) - { - DeviceExtension->SystemIoBusNumber = - ConfigInfo.SystemIoBusNumber = BusNumber; + /* FIXME: Need to figure out what string to pass as param 3. */ + Status = DriverExtension->InitializationData.HwFindAdapter( + &DeviceExtension->MiniPortDeviceExtension, + DriverExtension->HwContext, + NULL, + &ConfigInfo, + &Again); - RtlZeroMemory(&DeviceExtension->MiniPortDeviceExtension, - DriverExtension->InitializationData.HwDeviceExtensionSize); + if (Status == ERROR_DEV_NOT_EXIST) + { + continue; + } + else if (Status == NO_ERROR) + { + break; + } + else + { + ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status); + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); + IoDeleteDevice(DeviceObject); - /* FIXME: Need to figure out what string to pass as param 3. */ - Status = DriverExtension->InitializationData.HwFindAdapter( - &DeviceExtension->MiniPortDeviceExtension, - DriverExtension->HwContext, - NULL, - &ConfigInfo, - &Again); + return Status; + } + } + } + else + { + /* FIXME: Need to figure out what string to pass as param 3. */ + Status = DriverExtension->InitializationData.HwFindAdapter( + &DeviceExtension->MiniPortDeviceExtension, + DriverExtension->HwContext, + NULL, + &ConfigInfo, + &Again); + } - if (Status == ERROR_DEV_NOT_EXIST) - { - continue; - } - else if (Status == NO_ERROR) - { - break; - } - else - { - ERR_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status); - RtlFreeUnicodeString(&DeviceExtension->RegistryPath); - if (DeviceExtension->NextDeviceObject) - IoDetachDevice(DeviceExtension->NextDeviceObject); - IoDeleteDevice(DeviceObject); + 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; + } - return Status; - } - } - } - else - { - /* FIXME: Need to figure out what string to pass as param 3. */ - Status = DriverExtension->InitializationData.HwFindAdapter( - &DeviceExtension->MiniPortDeviceExtension, - DriverExtension->HwContext, - NULL, - &ConfigInfo, - &Again); - } + /* + * Now we know the device is present, so let's do all additional tasks + * such as creating symlinks or setting up interrupts and timer. + */ - 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; - } + /* Create a unicode device name. */ + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + RtlInitUnicodeString(&DeviceName, DeviceBuffer); - /* - * Now we know the device is present, so let's do all additional tasks - * such as creating symlinks or setting up interrupts and timer. - */ + /* Create symbolic link "\??\DISPLAYx" */ + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + IoCreateSymbolicLink(&SymlinkName, &DeviceName); - /* Create a unicode device name. */ - swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); - RtlInitUnicodeString(&DeviceName, DeviceBuffer); + /* Add entry to DEVICEMAP\VIDEO key in registry. */ + swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); + RtlWriteRegistryValue( + RTL_REGISTRY_DEVICEMAP, + L"VIDEO", + DeviceVideoBuffer, + REG_SZ, + DeviceExtension->RegistryPath.Buffer, + DeviceExtension->RegistryPath.Length + sizeof(UNICODE_NULL)); - /* Create symbolic link "\??\DISPLAYx" */ - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); - RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); - IoCreateSymbolicLink(&SymlinkName, &DeviceName); + RtlWriteRegistryValue( + RTL_REGISTRY_DEVICEMAP, + L"VIDEO", + L"MaxObjectNumber", + REG_DWORD, + &DeviceNumber, + sizeof(DeviceNumber)); - /* Add entry to DEVICEMAP\VIDEO key in registry. */ - swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); - RtlWriteRegistryValue( - RTL_REGISTRY_DEVICEMAP, - L"VIDEO", - DeviceVideoBuffer, - REG_SZ, - DeviceExtension->RegistryPath.Buffer, - DeviceExtension->RegistryPath.Length + sizeof(UNICODE_NULL)); + /* FIXME: Allocate hardware resources for device. */ - RtlWriteRegistryValue( - RTL_REGISTRY_DEVICEMAP, - L"VIDEO", - L"MaxObjectNumber", - REG_DWORD, - &DeviceNumber, - sizeof(DeviceNumber)); + /* Allocate interrupt for device. */ + if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo)) + { + RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); + IoDeleteDevice(DeviceObject); + return STATUS_INSUFFICIENT_RESOURCES; + } - /* FIXME: Allocate hardware resources for device. */ + /* + * Allocate timer for device. + */ - /* - * Allocate interrupt 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; + } - if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo)) - { - RtlFreeUnicodeString(&DeviceExtension->RegistryPath); - if (DeviceExtension->NextDeviceObject) - IoDetachDevice(DeviceExtension->NextDeviceObject); - IoDeleteDevice(DeviceObject); - return STATUS_INSUFFICIENT_RESOURCES; - } + /* Query children of the device. */ + VideoPortEnumerateChildren(&DeviceExtension->MiniPortDeviceExtension, NULL); - /* - * 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; - } - - /* - * Query children of the device. - */ - VideoPortEnumerateChildren(&DeviceExtension->MiniPortDeviceExtension, NULL); - - INFO_(VIDEOPRT, "STATUS_SUCCESS\n"); - return STATUS_SUCCESS; + INFO_(VIDEOPRT, "STATUS_SUCCESS\n"); + return STATUS_SUCCESS; } -VOID FASTCALL -IntAttachToCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState) +VOID +FASTCALL +IntAttachToCSRSS( + PKPROCESS *CallingProcess, + PKAPC_STATE ApcState) { - *CallingProcess = (PKPROCESS)PsGetCurrentProcess(); - if (*CallingProcess != Csrss) - { - KeStackAttachProcess(Csrss, ApcState); - } + *CallingProcess = (PKPROCESS)PsGetCurrentProcess(); + if (*CallingProcess != Csrss) + { + KeStackAttachProcess(Csrss, ApcState); + } } -VOID FASTCALL -IntDetachFromCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState) +VOID +FASTCALL +IntDetachFromCSRSS( + PKPROCESS *CallingProcess, + PKAPC_STATE ApcState) { - if (*CallingProcess != Csrss) - { - KeUnstackDetachProcess(ApcState); - } + if (*CallingProcess != Csrss) + { + KeUnstackDetachProcess(ApcState); + } } /* PUBLIC FUNCTIONS ***********************************************************/ @@ -569,235 +561,228 @@ IntDetachFromCSRSS(PKPROCESS *CallingProcess, PKAPC_STATE ApcState) /* * @implemented */ - -ULONG NTAPI +ULONG +NTAPI VideoPortInitialize( - IN PVOID Context1, - IN PVOID Context2, - IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, - IN PVOID HwContext) + IN PVOID Context1, + IN PVOID Context2, + IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, + IN PVOID HwContext) { - PDRIVER_OBJECT DriverObject = Context1; - PUNICODE_STRING RegistryPath = Context2; - NTSTATUS Status; - PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; - BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE; + PDRIVER_OBJECT DriverObject = Context1; + PUNICODE_STRING RegistryPath = Context2; + NTSTATUS Status; + PVIDEO_PORT_DRIVER_EXTENSION DriverExtension; + BOOLEAN PnpDriver = FALSE, LegacyDetection = FALSE; - TRACE_(VIDEOPRT, "VideoPortInitialize\n"); + TRACE_(VIDEOPRT, "VideoPortInitialize\n"); - /* - * As a first thing do parameter checks. - */ + /* As a first thing do parameter checks. */ + if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA)) + { + ERR_(VIDEOPRT, "Invalid HwInitializationData\n"); + return STATUS_REVISION_MISMATCH; + } - if (HwInitializationData->HwInitDataSize > sizeof(VIDEO_HW_INITIALIZATION_DATA)) - { - ERR_(VIDEOPRT, "Invalid HwInitializationData\n"); - return STATUS_REVISION_MISMATCH; - } + if (HwInitializationData->HwFindAdapter == NULL || + HwInitializationData->HwInitialize == NULL || + HwInitializationData->HwStartIO == NULL) + { + ERR_(VIDEOPRT, "Invalid HwInitializationData\n"); + return STATUS_INVALID_PARAMETER; + } - if (HwInitializationData->HwFindAdapter == NULL || - HwInitializationData->HwInitialize == NULL || - HwInitializationData->HwStartIO == NULL) - { - ERR_(VIDEOPRT, "Invalid HwInitializationData\n"); - return STATUS_INVALID_PARAMETER; - } + switch (HwInitializationData->HwInitDataSize) + { + /* + * NT4 drivers are special case, because we must use legacy method + * of detection instead of the Plug & Play one. + */ + case SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA: + INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n"); + break; - switch (HwInitializationData->HwInitDataSize) - { - /* - * NT4 drivers are special case, because we must use legacy method - * of detection instead of the Plug & Play one. - */ + case SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA: + INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n"); + break; - case SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA: - INFO_(VIDEOPRT, "We were loaded by a Windows NT miniport driver.\n"); - break; + case sizeof(VIDEO_HW_INITIALIZATION_DATA): + INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n"); + break; - case SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA: - INFO_(VIDEOPRT, "We were loaded by a Windows 2000 miniport driver.\n"); - break; + default: + ERR_(VIDEOPRT, "Invalid HwInitializationData size.\n"); + return STATUS_UNSUCCESSFUL; + } - case sizeof(VIDEO_HW_INITIALIZATION_DATA): - INFO_(VIDEOPRT, "We were loaded by a Windows XP or later miniport driver.\n"); - break; + /* Set dispatching routines */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = IntVideoPortDispatchOpen; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = IntVideoPortDispatchClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = + IntVideoPortDispatchDeviceControl; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = + IntVideoPortDispatchDeviceControl; + DriverObject->MajorFunction[IRP_MJ_WRITE] = + IntVideoPortDispatchWrite; // ReactOS-specific hack + DriverObject->DriverUnload = IntVideoPortUnload; - default: - ERR_(VIDEOPRT, "Invalid HwInitializationData size.\n"); - return STATUS_UNSUCCESSFUL; - } + /* Determine type of the miniport driver */ + if ((HwInitializationData->HwInitDataSize >= + FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) + && HwInitializationData->HwSetPowerState + && HwInitializationData->HwGetPowerState + && HwInitializationData->HwGetVideoChildDescriptor) + { + INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n"); + PnpDriver = TRUE; + } - /* Set dispatching routines */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = IntVideoPortDispatchOpen; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = IntVideoPortDispatchClose; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = - IntVideoPortDispatchDeviceControl; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = - IntVideoPortDispatchDeviceControl; - DriverObject->MajorFunction[IRP_MJ_WRITE] = - IntVideoPortDispatchWrite; // ReactOS-specific hack - DriverObject->DriverUnload = IntVideoPortUnload; + /* Check if legacy detection should be applied */ + if (!PnpDriver || HwContext) + { + INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n", + HwInitializationData->AdapterInterfaceType); - /* Determine type of the miniport driver */ - if ((HwInitializationData->HwInitDataSize >= - FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwQueryInterface)) - && HwInitializationData->HwSetPowerState - && HwInitializationData->HwGetPowerState - && HwInitializationData->HwGetVideoChildDescriptor) - { - INFO_(VIDEOPRT, "The miniport is a PnP miniport driver\n"); - PnpDriver = TRUE; - } + /* FIXME: Move the code for legacy detection + to another function and call it here */ + LegacyDetection = TRUE; + } - /* Check if legacy detection should be applied */ - if (!PnpDriver || HwContext) - { - INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n", - HwInitializationData->AdapterInterfaceType); + /* + * NOTE: + * The driver extension can be already allocated in case that we were + * called by legacy driver and failed detecting device. Some miniport + * drivers in that case adjust parameters and call VideoPortInitialize + * again. + */ + DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); + if (DriverExtension == NULL) + { + Status = IoAllocateDriverObjectExtension( + DriverObject, + DriverObject, + sizeof(VIDEO_PORT_DRIVER_EXTENSION), + (PVOID *)&DriverExtension); - /* FIXME: Move the code for legacy detection - to another function and call it here */ - LegacyDetection = TRUE; - } + if (!NT_SUCCESS(Status)) + { + ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status); + return Status; + } - /* - * NOTE: - * The driver extension can be already allocated in case that we were - * called by legacy driver and failed detecting device. Some miniport - * drivers in that case adjust parameters and call VideoPortInitialize - * again. - */ + /* + * Save the registry path. This should be done only once even if + * VideoPortInitialize is called multiple times. + */ + if (RegistryPath->Length != 0) + { + DriverExtension->RegistryPath.Length = 0; + DriverExtension->RegistryPath.MaximumLength = + RegistryPath->Length + sizeof(UNICODE_NULL); + DriverExtension->RegistryPath.Buffer = + ExAllocatePoolWithTag( + PagedPool, + DriverExtension->RegistryPath.MaximumLength, + 'RTSU'); + if (DriverExtension->RegistryPath.Buffer == NULL) + { + RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL); + return STATUS_INSUFFICIENT_RESOURCES; + } - DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); - if (DriverExtension == NULL) - { - Status = IoAllocateDriverObjectExtension( - DriverObject, - DriverObject, - sizeof(VIDEO_PORT_DRIVER_EXTENSION), - (PVOID *)&DriverExtension); - - if (!NT_SUCCESS(Status)) - { - ERR_(VIDEOPRT, "IoAllocateDriverObjectExtension failed 0x%x\n", Status); - return Status; - } - - /* - * Save the registry path. This should be done only once even if - * VideoPortInitialize is called multiple times. - */ - - if (RegistryPath->Length != 0) - { - DriverExtension->RegistryPath.Length = 0; - DriverExtension->RegistryPath.MaximumLength = - RegistryPath->Length + sizeof(UNICODE_NULL); - DriverExtension->RegistryPath.Buffer = - ExAllocatePoolWithTag( - PagedPool, - DriverExtension->RegistryPath.MaximumLength, - 'RTSU'); - if (DriverExtension->RegistryPath.Buffer == NULL) - { + RtlCopyUnicodeString(&DriverExtension->RegistryPath, RegistryPath); + INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath); + } + else + { RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL); - return STATUS_INSUFFICIENT_RESOURCES; - } + } + } - RtlCopyUnicodeString(&DriverExtension->RegistryPath, RegistryPath); - INFO_(VIDEOPRT, "RegistryPath: %wZ\n", &DriverExtension->RegistryPath); - } - else - { - RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL); - } - } + /* + * Copy the correct miniport initialization data to the device extension. + */ + RtlCopyMemory(&DriverExtension->InitializationData, + HwInitializationData, + HwInitializationData->HwInitDataSize); + if (HwInitializationData->HwInitDataSize < + sizeof(VIDEO_HW_INITIALIZATION_DATA)) + { + RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData + + HwInitializationData->HwInitDataSize), + sizeof(VIDEO_HW_INITIALIZATION_DATA) - + HwInitializationData->HwInitDataSize); + } + DriverExtension->HwContext = HwContext; - /* - * Copy the correct miniport initialization data to the device extension. - */ + /* + * Plug & Play drivers registers the device in AddDevice routine. For + * legacy drivers we must do it now. + */ + if (LegacyDetection) + { + PDEVICE_OBJECT DeviceObject; - RtlCopyMemory( - &DriverExtension->InitializationData, - HwInitializationData, - HwInitializationData->HwInitDataSize); - if (HwInitializationData->HwInitDataSize < - sizeof(VIDEO_HW_INITIALIZATION_DATA)) - { - RtlZeroMemory((PVOID)((ULONG_PTR)&DriverExtension->InitializationData + - HwInitializationData->HwInitDataSize), - sizeof(VIDEO_HW_INITIALIZATION_DATA) - - HwInitializationData->HwInitDataSize); - } - DriverExtension->HwContext = HwContext; + if (HwInitializationData->HwInitDataSize != SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA) + { + /* power management */ + DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; + } + Status = IntVideoPortCreateAdapterDeviceObject(DriverObject, + DriverExtension, + NULL, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status); + return Status; + } - /* - * Plug & Play drivers registers the device in AddDevice routine. For - * legacy drivers we must do it now. - */ + Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject); + if (NT_SUCCESS(Status)) + VideoPortDeviceNumber++; + else + ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status); - if (LegacyDetection) - { - PDEVICE_OBJECT DeviceObject; + return Status; + } + else + { + DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice; + DriverObject->MajorFunction[IRP_MJ_PNP] = IntVideoPortDispatchPnp; + DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; + DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IntVideoPortDispatchSystemControl; - if (HwInitializationData->HwInitDataSize != SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA) - { - /* power management */ - DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; - } - Status = IntVideoPortCreateAdapterDeviceObject(DriverObject, DriverExtension, - NULL, &DeviceObject); - if (!NT_SUCCESS(Status)) - { - ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status); - return Status; - } - - Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject); - if (NT_SUCCESS(Status)) - VideoPortDeviceNumber++; - else - ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status); - - return Status; - } - else - { - DriverObject->DriverExtension->AddDevice = IntVideoPortAddDevice; - DriverObject->MajorFunction[IRP_MJ_PNP] = IntVideoPortDispatchPnp; - DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; - DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IntVideoPortDispatchSystemControl; - - return STATUS_SUCCESS; - } + return STATUS_SUCCESS; + } } /* * @implemented */ - VOID VideoPortDebugPrint( - IN VIDEO_DEBUG_LEVEL DebugPrintLevel, - IN PCHAR DebugMessage, ...) + IN VIDEO_DEBUG_LEVEL DebugPrintLevel, + IN PCHAR DebugMessage, + ...) { - va_list ap; + va_list ap; - va_start(ap, DebugMessage); - vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap); - va_end(ap); + va_start(ap, DebugMessage); + vDbgPrintEx(DPFLTR_IHVVIDEO_ID, DebugPrintLevel, DebugMessage, ap); + va_end(ap); } /* * @unimplemented */ - -VOID NTAPI +VOID +NTAPI VideoPortLogError( - IN PVOID HwDeviceExtension, - IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, - IN VP_STATUS ErrorCode, - IN ULONG UniqueId) + IN PVOID HwDeviceExtension, + IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL, + IN VP_STATUS ErrorCode, + IN ULONG UniqueId) { UNIMPLEMENTED; @@ -810,470 +795,475 @@ VideoPortLogError( /* * @implemented */ - -UCHAR NTAPI +UCHAR +NTAPI VideoPortGetCurrentIrql(VOID) { - return KeGetCurrentIrql(); + return KeGetCurrentIrql(); } typedef struct QueryRegistryCallbackContext { - PVOID HwDeviceExtension; - PVOID HwContext; - PMINIPORT_GET_REGISTRY_ROUTINE HwGetRegistryRoutine; + PVOID HwDeviceExtension; + PVOID HwContext; + PMINIPORT_GET_REGISTRY_ROUTINE HwGetRegistryRoutine; } QUERY_REGISTRY_CALLBACK_CONTEXT, *PQUERY_REGISTRY_CALLBACK_CONTEXT; -static NTSTATUS NTAPI +static +NTSTATUS +NTAPI QueryRegistryCallback( - IN PWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength, - IN PVOID Context, - IN PVOID EntryContext) + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) { - PQUERY_REGISTRY_CALLBACK_CONTEXT CallbackContext = (PQUERY_REGISTRY_CALLBACK_CONTEXT) Context; + PQUERY_REGISTRY_CALLBACK_CONTEXT CallbackContext = (PQUERY_REGISTRY_CALLBACK_CONTEXT) Context; - INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n", + INFO_(VIDEOPRT, "Found registry value for name %S: type %d, length %d\n", ValueName, ValueType, ValueLength); - return (*(CallbackContext->HwGetRegistryRoutine))( - CallbackContext->HwDeviceExtension, - CallbackContext->HwContext, - ValueName, - ValueData, - ValueLength); + return (*(CallbackContext->HwGetRegistryRoutine))( + CallbackContext->HwDeviceExtension, + CallbackContext->HwContext, + ValueName, + ValueData, + ValueLength); } /* * @unimplemented */ -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortGetRegistryParameters( - IN PVOID HwDeviceExtension, - IN PWSTR ParameterName, - IN UCHAR IsParameterFileName, - IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, - IN PVOID HwContext) + IN PVOID HwDeviceExtension, + IN PWSTR ParameterName, + IN UCHAR IsParameterFileName, + IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine, + IN PVOID HwContext) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2] = {{0}}; - QUERY_REGISTRY_CALLBACK_CONTEXT Context; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + RTL_QUERY_REGISTRY_TABLE QueryTable[2] = {{0}}; + QUERY_REGISTRY_CALLBACK_CONTEXT Context; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n", - ParameterName, &DeviceExtension->RegistryPath); + TRACE_(VIDEOPRT, "VideoPortGetRegistryParameters ParameterName %S, RegPath: %wZ\n", + ParameterName, &DeviceExtension->RegistryPath); - Context.HwDeviceExtension = HwDeviceExtension; - Context.HwContext = HwContext; - Context.HwGetRegistryRoutine = GetRegistryRoutine; + Context.HwDeviceExtension = HwDeviceExtension; + Context.HwContext = HwContext; + Context.HwGetRegistryRoutine = GetRegistryRoutine; - QueryTable[0].QueryRoutine = QueryRegistryCallback; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].Name = ParameterName; + QueryTable[0].QueryRoutine = QueryRegistryCallback; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Name = ParameterName; - if (!NT_SUCCESS(RtlQueryRegistryValues( - RTL_REGISTRY_ABSOLUTE, - DeviceExtension->RegistryPath.Buffer, - QueryTable, - &Context, - NULL))) - { - WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the " - "requested parameter\n"); - return ERROR_INVALID_PARAMETER; - } + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + DeviceExtension->RegistryPath.Buffer, + QueryTable, + &Context, + NULL); + if (!NT_SUCCESS(Status)) + { + WARN_(VIDEOPRT, "VideoPortGetRegistryParameters could not find the " + "requested parameter\n"); + return ERROR_INVALID_PARAMETER; + } - if (IsParameterFileName) - { - /* FIXME: need to read the contents of the file */ - UNIMPLEMENTED; - } + if (IsParameterFileName) + { + /* FIXME: need to read the contents of the file */ + UNIMPLEMENTED; + } - return NO_ERROR; + return NO_ERROR; } /* * @implemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortSetRegistryParameters( - IN PVOID HwDeviceExtension, - IN PWSTR ValueName, - IN PVOID ValueData, - IN ULONG ValueLength) + IN PVOID HwDeviceExtension, + IN PWSTR ValueName, + IN PVOID ValueData, + IN ULONG ValueLength) { - VP_STATUS Status; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + VP_STATUS Status; - TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n", - ValueName, - &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->RegistryPath); - ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); - Status = RtlWriteRegistryValue( - RTL_REGISTRY_ABSOLUTE, - VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->RegistryPath.Buffer, - ValueName, - REG_BINARY, - ValueData, - ValueLength); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + TRACE_(VIDEOPRT, "VideoPortSetRegistryParameters ParameterName %S, RegPath: %wZ\n", + ValueName, + &DeviceExtension->RegistryPath); + ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); + Status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, + DeviceExtension->RegistryPath.Buffer, + ValueName, + REG_BINARY, + ValueData, + ValueLength); + if (Status != NO_ERROR) + WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status); - if (Status != NO_ERROR) - WARN_(VIDEOPRT, "VideoPortSetRegistryParameters error 0x%x\n", Status); - - return Status; + return Status; } /* * @implemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortGetVgaStatus( - IN PVOID HwDeviceExtension, - OUT PULONG VgaStatus) + IN PVOID HwDeviceExtension, + OUT PULONG VgaStatus) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n"); + TRACE_(VIDEOPRT, "VideoPortGetVgaStatus\n"); - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - if (KeGetCurrentIrql() == PASSIVE_LEVEL) - { - if (DeviceExtension->AdapterInterfaceType == PCIBus) - { - /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */ - /* Assumed for now */ - *VgaStatus = 1; - return NO_ERROR; - } - } + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + if (KeGetCurrentIrql() == PASSIVE_LEVEL) + { + if (DeviceExtension->AdapterInterfaceType == PCIBus) + { + /* VgaStatus: 0 == VGA not enabled, 1 == VGA enabled. */ + /* Assumed for now */ + *VgaStatus = 1; + return NO_ERROR; + } + } - return ERROR_INVALID_FUNCTION; + return ERROR_INVALID_FUNCTION; } /* * @implemented */ - -PVOID NTAPI +PVOID +NTAPI VideoPortGetRomImage( - IN PVOID HwDeviceExtension, - IN PVOID Unused1, - IN ULONG Unused2, - IN ULONG Length) + IN PVOID HwDeviceExtension, + IN PVOID Unused1, + IN ULONG Unused2, + IN ULONG Length) { - static PVOID RomImageBuffer = NULL; - PKPROCESS CallingProcess; - KAPC_STATE ApcState; + static PVOID RomImageBuffer = NULL; + PKPROCESS CallingProcess; + KAPC_STATE ApcState; - TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n", - HwDeviceExtension, Length); + TRACE_(VIDEOPRT, "VideoPortGetRomImage(HwDeviceExtension 0x%X Length 0x%X)\n", + HwDeviceExtension, Length); - /* If the length is zero then free the existing buffer. */ - if (Length == 0) - { - if (RomImageBuffer != NULL) - { - ExFreePool(RomImageBuffer); - RomImageBuffer = NULL; - } - return NULL; - } - else - { - /* - * The DDK says we shouldn't use the legacy C0000 method but get the - * rom base address from the corresponding pci or acpi register but - * lets ignore that and use C0000 anyway. We have already mapped the - * bios area into memory so we'll copy from there. - */ + /* If the length is zero then free the existing buffer. */ + if (Length == 0) + { + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + RomImageBuffer = NULL; + } + return NULL; + } + else + { + /* + * The DDK says we shouldn't use the legacy C0000 method but get the + * rom base address from the corresponding pci or acpi register but + * lets ignore that and use C0000 anyway. We have already mapped the + * bios area into memory so we'll copy from there. + */ - /* Copy the bios. */ - Length = min(Length, 0x10000); - if (RomImageBuffer != NULL) - { - ExFreePool(RomImageBuffer); - } + /* Copy the bios. */ + Length = min(Length, 0x10000); + if (RomImageBuffer != NULL) + { + ExFreePool(RomImageBuffer); + } - RomImageBuffer = ExAllocatePool(PagedPool, Length); - if (RomImageBuffer == NULL) - { - return NULL; - } + RomImageBuffer = ExAllocatePool(PagedPool, Length); + if (RomImageBuffer == NULL) + { + return NULL; + } - IntAttachToCSRSS(&CallingProcess, &ApcState); - RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length); - IntDetachFromCSRSS(&CallingProcess, &ApcState); + IntAttachToCSRSS(&CallingProcess, &ApcState); + RtlCopyMemory(RomImageBuffer, (PUCHAR)0xC0000, Length); + IntDetachFromCSRSS(&CallingProcess, &ApcState); - return RomImageBuffer; - } + return RomImageBuffer; + } } /* * @implemented */ - -BOOLEAN NTAPI +BOOLEAN +NTAPI VideoPortScanRom( - IN PVOID HwDeviceExtension, - IN PUCHAR RomBase, - IN ULONG RomLength, - IN PUCHAR String) + IN PVOID HwDeviceExtension, + IN PUCHAR RomBase, + IN ULONG RomLength, + IN PUCHAR String) { - ULONG StringLength; - BOOLEAN Found; - PUCHAR SearchLocation; + ULONG StringLength; + BOOLEAN Found; + PUCHAR SearchLocation; - TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String); + TRACE_(VIDEOPRT, "VideoPortScanRom RomBase %p RomLength 0x%x String %s\n", RomBase, RomLength, String); - StringLength = strlen((PCHAR)String); - Found = FALSE; - SearchLocation = RomBase; - for (SearchLocation = RomBase; - !Found && SearchLocation < RomBase + RomLength - StringLength; - SearchLocation++) - { - Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength); - if (Found) - { - INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation); - } - } + StringLength = strlen((PCHAR)String); + Found = FALSE; + SearchLocation = RomBase; + for (SearchLocation = RomBase; + !Found && SearchLocation < RomBase + RomLength - StringLength; + SearchLocation++) + { + Found = (RtlCompareMemory(SearchLocation, String, StringLength) == StringLength); + if (Found) + { + INFO_(VIDEOPRT, "Match found at %p\n", SearchLocation); + } + } - return Found; + return Found; } /* * @implemented */ - -BOOLEAN NTAPI +BOOLEAN +NTAPI VideoPortSynchronizeExecution( - IN PVOID HwDeviceExtension, - IN VIDEO_SYNCHRONIZE_PRIORITY Priority, - IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, - OUT PVOID Context) + IN PVOID HwDeviceExtension, + IN VIDEO_SYNCHRONIZE_PRIORITY Priority, + IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine, + OUT PVOID Context) { - BOOLEAN Ret; - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - KIRQL OldIrql; + BOOLEAN Ret; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + KIRQL OldIrql; - switch (Priority) - { - case VpLowPriority: - Ret = (*SynchronizeRoutine)(Context); - break; - - case VpMediumPriority: - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - if (DeviceExtension->InterruptObject == NULL) + switch (Priority) + { + case VpLowPriority: Ret = (*SynchronizeRoutine)(Context); - else - Ret = KeSynchronizeExecution( - DeviceExtension->InterruptObject, - SynchronizeRoutine, - Context); - break; + break; - case VpHighPriority: - OldIrql = KeGetCurrentIrql(); - if (OldIrql < SYNCH_LEVEL) - KeRaiseIrql(SYNCH_LEVEL, &OldIrql); + case VpMediumPriority: + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + if (DeviceExtension->InterruptObject == NULL) + Ret = (*SynchronizeRoutine)(Context); + else + Ret = KeSynchronizeExecution( + DeviceExtension->InterruptObject, + SynchronizeRoutine, + Context); + break; - Ret = (*SynchronizeRoutine)(Context); + case VpHighPriority: + OldIrql = KeGetCurrentIrql(); + if (OldIrql < SYNCH_LEVEL) + KeRaiseIrql(SYNCH_LEVEL, &OldIrql); - if (OldIrql < SYNCH_LEVEL) - KeLowerIrql(OldIrql); - break; + Ret = (*SynchronizeRoutine)(Context); - default: - Ret = FALSE; - } + if (OldIrql < SYNCH_LEVEL) + KeLowerIrql(OldIrql); + break; - return Ret; + default: + Ret = FALSE; + } + + return Ret; } /* * @implemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortEnumerateChildren( - IN PVOID HwDeviceExtension, - IN PVOID Reserved) + IN PVOID HwDeviceExtension, + IN PVOID Reserved) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG Status; - VIDEO_CHILD_ENUM_INFO ChildEnumInfo; - BOOLEAN bHaveLastMonitorID = FALSE; - UCHAR LastMonitorID[10]; - ULONG Unused; - UINT i; - PDEVICE_OBJECT ChildDeviceObject; - PVIDEO_PORT_CHILD_EXTENSION ChildExtension; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG Status; + VIDEO_CHILD_ENUM_INFO ChildEnumInfo; + BOOLEAN bHaveLastMonitorID = FALSE; + UCHAR LastMonitorID[10]; + ULONG Unused; + UINT i; + PDEVICE_OBJECT ChildDeviceObject; + PVIDEO_PORT_CHILD_EXTENSION ChildExtension; - INFO_(VIDEOPRT, "Starting child device probe\n"); - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - if (DeviceExtension->DriverExtension->InitializationData.HwGetVideoChildDescriptor == NULL) - { - WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n"); - return NO_ERROR; - } + INFO_(VIDEOPRT, "Starting child device probe\n"); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + if (DeviceExtension->DriverExtension->InitializationData.HwGetVideoChildDescriptor == NULL) + { + WARN_(VIDEOPRT, "Miniport's HwGetVideoChildDescriptor is NULL!\n"); + return NO_ERROR; + } - if (!IsListEmpty(&DeviceExtension->ChildDeviceList)) - { - ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n"); - return NO_ERROR; - } + if (!IsListEmpty(&DeviceExtension->ChildDeviceList)) + { + ERR_(VIDEOPRT, "FIXME: Support calling VideoPortEnumerateChildren again!\n"); + return NO_ERROR; + } - /* Enumerate the children */ - for (i = 1; ; i++) - { - Status = IoCreateDevice(DeviceExtension->DriverObject, - sizeof(VIDEO_PORT_CHILD_EXTENSION) + - DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize, - NULL, - FILE_DEVICE_CONTROLLER, - FILE_DEVICE_SECURE_OPEN, - FALSE, - &ChildDeviceObject); - if (!NT_SUCCESS(Status)) - return Status; + /* Enumerate the children */ + for (i = 1; ; i++) + { + Status = IoCreateDevice(DeviceExtension->DriverObject, + sizeof(VIDEO_PORT_CHILD_EXTENSION) + + DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize, + NULL, + FILE_DEVICE_CONTROLLER, + FILE_DEVICE_SECURE_OPEN, + FALSE, + &ChildDeviceObject); + if (!NT_SUCCESS(Status)) + return Status; - ChildExtension = ChildDeviceObject->DeviceExtension; + ChildExtension = ChildDeviceObject->DeviceExtension; - RtlZeroMemory(ChildExtension, sizeof(VIDEO_PORT_CHILD_EXTENSION) + - DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize); + RtlZeroMemory(ChildExtension, + sizeof(VIDEO_PORT_CHILD_EXTENSION) + + DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize); - ChildExtension->Common.Fdo = FALSE; - ChildExtension->ChildId = i; - ChildExtension->PhysicalDeviceObject = ChildDeviceObject; - ChildExtension->DriverObject = DeviceExtension->DriverObject; + ChildExtension->Common.Fdo = FALSE; + ChildExtension->ChildId = i; + ChildExtension->PhysicalDeviceObject = ChildDeviceObject; + ChildExtension->DriverObject = DeviceExtension->DriverObject; - /* Setup the ChildEnumInfo */ - ChildEnumInfo.Size = sizeof(ChildEnumInfo); - ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor); - ChildEnumInfo.ACPIHwId = 0; + /* Setup the ChildEnumInfo */ + ChildEnumInfo.Size = sizeof(ChildEnumInfo); + ChildEnumInfo.ChildDescriptorSize = sizeof(ChildExtension->ChildDescriptor); + ChildEnumInfo.ACPIHwId = 0; - if (DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize) - ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension); - else - ChildEnumInfo.ChildHwDeviceExtension = NULL; + if (DeviceExtension->DriverExtension->InitializationData.HwChildDeviceExtensionSize) + ChildEnumInfo.ChildHwDeviceExtension = VIDEO_PORT_GET_CHILD_EXTENSION(ChildExtension); + else + ChildEnumInfo.ChildHwDeviceExtension = NULL; - ChildEnumInfo.ChildIndex = ChildExtension->ChildId; + ChildEnumInfo.ChildIndex = ChildExtension->ChildId; - INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex); - Status = DeviceExtension->DriverExtension->InitializationData.HwGetVideoChildDescriptor( - HwDeviceExtension, - &ChildEnumInfo, - &ChildExtension->ChildType, - ChildExtension->ChildDescriptor, - &ChildExtension->ChildId, - &Unused); - if (Status == VIDEO_ENUM_MORE_DEVICES) - { - if (ChildExtension->ChildType == Monitor) - { - // Check if the EDID is valid - if (ChildExtension->ChildDescriptor[0] == 0x00 && - ChildExtension->ChildDescriptor[1] == 0xFF && - ChildExtension->ChildDescriptor[2] == 0xFF && - ChildExtension->ChildDescriptor[3] == 0xFF && - ChildExtension->ChildDescriptor[4] == 0xFF && - ChildExtension->ChildDescriptor[5] == 0xFF && - ChildExtension->ChildDescriptor[6] == 0xFF && - ChildExtension->ChildDescriptor[7] == 0x00) + INFO_(VIDEOPRT, "Probing child: %d\n", ChildEnumInfo.ChildIndex); + Status = DeviceExtension->DriverExtension->InitializationData.HwGetVideoChildDescriptor( + HwDeviceExtension, + &ChildEnumInfo, + &ChildExtension->ChildType, + ChildExtension->ChildDescriptor, + &ChildExtension->ChildId, + &Unused); + if (Status == VIDEO_ENUM_MORE_DEVICES) + { + if (ChildExtension->ChildType == Monitor) { - if (bHaveLastMonitorID) - { - // Compare the previous monitor ID with the current one, break the loop if they are identical - if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID)) - { - INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n"); - IoDeleteDevice(ChildDeviceObject); - break; - } - } + // Check if the EDID is valid + if (ChildExtension->ChildDescriptor[0] == 0x00 && + ChildExtension->ChildDescriptor[1] == 0xFF && + ChildExtension->ChildDescriptor[2] == 0xFF && + ChildExtension->ChildDescriptor[3] == 0xFF && + ChildExtension->ChildDescriptor[4] == 0xFF && + ChildExtension->ChildDescriptor[5] == 0xFF && + ChildExtension->ChildDescriptor[6] == 0xFF && + ChildExtension->ChildDescriptor[7] == 0x00) + { + if (bHaveLastMonitorID) + { + // Compare the previous monitor ID with the current one, break the loop if they are identical + if (RtlCompareMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)) == sizeof(LastMonitorID)) + { + INFO_(VIDEOPRT, "Found identical Monitor ID two times, stopping enumeration\n"); + IoDeleteDevice(ChildDeviceObject); + break; + } + } - // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor - RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)); - bHaveLastMonitorID = TRUE; + // Copy 10 bytes from the EDID, which can be used to uniquely identify the monitor + RtlCopyMemory(LastMonitorID, &ChildExtension->ChildDescriptor[8], sizeof(LastMonitorID)); + bHaveLastMonitorID = TRUE; - /* Mark it valid */ - ChildExtension->EdidValid = TRUE; + /* Mark it valid */ + ChildExtension->EdidValid = TRUE; + } + else + { + /* Mark it invalid */ + ChildExtension->EdidValid = FALSE; + } } - else + } + else if (Status == VIDEO_ENUM_INVALID_DEVICE) + { + WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex); + IoDeleteDevice(ChildDeviceObject); + continue; + } + else if (Status == VIDEO_ENUM_NO_MORE_DEVICES) + { + INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1); + IoDeleteDevice(ChildDeviceObject); + break; + } + else + { + WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status); + IoDeleteDevice(ChildDeviceObject); + break; + } + + if (ChildExtension->ChildType == Monitor) + { + UINT j; + PUCHAR p = ChildExtension->ChildDescriptor; + INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId); + for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8) { - /* Mark it invalid */ - ChildExtension->EdidValid = FALSE; + INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n", + p[j + 0], p[j + 1], p[j + 2], p[j + 3], + p[j + 4], p[j + 5], p[j + 6], p[j + 7]); } - } - } - else if (Status == VIDEO_ENUM_INVALID_DEVICE) - { - WARN_(VIDEOPRT, "Child device %d is invalid!\n", ChildEnumInfo.ChildIndex); - IoDeleteDevice(ChildDeviceObject); - continue; - } - else if (Status == VIDEO_ENUM_NO_MORE_DEVICES) - { - INFO_(VIDEOPRT, "End of child enumeration! (%d children enumerated)\n", i - 1); - IoDeleteDevice(ChildDeviceObject); - break; - } - else - { - WARN_(VIDEOPRT, "HwGetVideoChildDescriptor returned unknown status code 0x%x!\n", Status); - IoDeleteDevice(ChildDeviceObject); - break; - } + } + else if (ChildExtension->ChildType == Other) + { + INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor); + } + else + { + ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType); + } - if (ChildExtension->ChildType == Monitor) - { - UINT j; - PUCHAR p = ChildExtension->ChildDescriptor; - INFO_(VIDEOPRT, "Monitor device enumerated! (ChildId = 0x%x)\n", ChildExtension->ChildId); - for (j = 0; j < sizeof (ChildExtension->ChildDescriptor); j += 8) - { - INFO_(VIDEOPRT, "%02x %02x %02x %02x %02x %02x %02x %02x\n", - p[j+0], p[j+1], p[j+2], p[j+3], - p[j+4], p[j+5], p[j+6], p[j+7]); - } - } - else if (ChildExtension->ChildType == Other) - { - INFO_(VIDEOPRT, "\"Other\" device enumerated: DeviceId = %S\n", (PWSTR)ChildExtension->ChildDescriptor); - } - else - { - ERR_(VIDEOPRT, "HwGetVideoChildDescriptor returned unsupported type: %d\n", ChildExtension->ChildType); - } + /* Clear the init flag */ + ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - /* Clear the init flag */ - ChildDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + InsertTailList(&DeviceExtension->ChildDeviceList, + &ChildExtension->ListEntry); + } - InsertTailList(&DeviceExtension->ChildDeviceList, - &ChildExtension->ListEntry); - } + /* Trigger reenumeration by the PnP manager */ + IoInvalidateDeviceRelations(DeviceExtension->PhysicalDeviceObject, BusRelations); - /* Trigger reenumeration by the PnP manager */ - IoInvalidateDeviceRelations(DeviceExtension->PhysicalDeviceObject, BusRelations); - - return NO_ERROR; + return NO_ERROR; } /* * @unimplemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortCreateSecondaryDisplay( - IN PVOID HwDeviceExtension, - IN OUT PVOID *SecondaryDeviceExtension, - IN ULONG Flag) + IN PVOID HwDeviceExtension, + IN OUT PVOID *SecondaryDeviceExtension, + IN ULONG Flag) { UNIMPLEMENTED; return ERROR_DEV_NOT_EXIST; @@ -1282,144 +1272,145 @@ VideoPortCreateSecondaryDisplay( /* * @implemented */ - -BOOLEAN NTAPI +BOOLEAN +NTAPI VideoPortQueueDpc( - IN PVOID HwDeviceExtension, - IN PMINIPORT_DPC_ROUTINE CallbackRoutine, - IN PVOID Context) + IN PVOID HwDeviceExtension, + IN PMINIPORT_DPC_ROUTINE CallbackRoutine, + IN PVOID Context) { - return KeInsertQueueDpc( - &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject, - (PVOID)CallbackRoutine, - (PVOID)Context); + return KeInsertQueueDpc( + &VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension)->DpcObject, + (PVOID)CallbackRoutine, + (PVOID)Context); } /* * @implemented */ - -PVOID NTAPI -VideoPortGetAssociatedDeviceExtension(IN PVOID DeviceObject) +PVOID +NTAPI +VideoPortGetAssociatedDeviceExtension( + IN PVOID DeviceObject) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n"); - DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension; - if (!DeviceExtension) - return NULL; - return DeviceExtension->MiniPortDeviceExtension; + TRACE_(VIDEOPRT, "VideoPortGetAssociatedDeviceExtension\n"); + DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension; + if (!DeviceExtension) + return NULL; + return DeviceExtension->MiniPortDeviceExtension; } /* * @implemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortGetVersion( - IN PVOID HwDeviceExtension, - IN OUT PVPOSVERSIONINFO VpOsVersionInfo) + IN PVOID HwDeviceExtension, + IN OUT PVPOSVERSIONINFO VpOsVersionInfo) { - RTL_OSVERSIONINFOEXW Version; + RTL_OSVERSIONINFOEXW Version; - Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); - if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) - { + Version.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); + if (VpOsVersionInfo->Size >= sizeof(VPOSVERSIONINFO)) + { #if 1 - if (NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&Version))) - { - VpOsVersionInfo->MajorVersion = Version.dwMajorVersion; - VpOsVersionInfo->MinorVersion = Version.dwMinorVersion; - VpOsVersionInfo->BuildNumber = Version.dwBuildNumber; - VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor; - VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor; - return NO_ERROR; - } - return ERROR_INVALID_PARAMETER; + if (NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&Version))) + { + VpOsVersionInfo->MajorVersion = Version.dwMajorVersion; + VpOsVersionInfo->MinorVersion = Version.dwMinorVersion; + VpOsVersionInfo->BuildNumber = Version.dwBuildNumber; + VpOsVersionInfo->ServicePackMajor = Version.wServicePackMajor; + VpOsVersionInfo->ServicePackMinor = Version.wServicePackMinor; + return NO_ERROR; + } + return ERROR_INVALID_PARAMETER; #else - VpOsVersionInfo->MajorVersion = 5; - VpOsVersionInfo->MinorVersion = 0; - VpOsVersionInfo->BuildNumber = 2195; - VpOsVersionInfo->ServicePackMajor = 4; - VpOsVersionInfo->ServicePackMinor = 0; - return NO_ERROR; + VpOsVersionInfo->MajorVersion = 5; + VpOsVersionInfo->MinorVersion = 0; + VpOsVersionInfo->BuildNumber = 2195; + VpOsVersionInfo->ServicePackMajor = 4; + VpOsVersionInfo->ServicePackMinor = 0; + return NO_ERROR; #endif - } + } - return ERROR_INVALID_PARAMETER; + return ERROR_INVALID_PARAMETER; } /* * @implemented */ - -BOOLEAN NTAPI +BOOLEAN +NTAPI VideoPortCheckForDeviceExistence( - IN PVOID HwDeviceExtension, - IN USHORT VendorId, - IN USHORT DeviceId, - IN UCHAR RevisionId, - IN USHORT SubVendorId, - IN USHORT SubSystemId, - IN ULONG Flags) + IN PVOID HwDeviceExtension, + IN USHORT VendorId, + IN USHORT DeviceId, + IN UCHAR RevisionId, + IN USHORT SubVendorId, + IN USHORT SubSystemId, + IN ULONG Flags) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - PCI_DEVICE_PRESENT_INTERFACE PciDevicePresentInterface; - IO_STATUS_BLOCK IoStatusBlock; - IO_STACK_LOCATION IoStack; - ULONG PciFlags = 0; - NTSTATUS Status; - BOOL DevicePresent; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + PCI_DEVICE_PRESENT_INTERFACE PciDevicePresentInterface; + IO_STATUS_BLOCK IoStatusBlock; + IO_STACK_LOCATION IoStack; + ULONG PciFlags = 0; + NTSTATUS Status; + BOOL DevicePresent; - TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n"); + TRACE_(VIDEOPRT, "VideoPortCheckForDeviceExistence\n"); - if (Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS)) - { - WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS)); - return FALSE; - } + if (Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS)) + { + WARN_(VIDEOPRT, "VideoPortCheckForDeviceExistence: Unknown flags 0x%lx\n", Flags & ~(CDE_USE_REVISION | CDE_USE_SUBSYSTEM_IDS)); + return FALSE; + } - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - PciDevicePresentInterface.Size = sizeof(PCI_DEVICE_PRESENT_INTERFACE); - PciDevicePresentInterface.Version = 1; - IoStack.Parameters.QueryInterface.Size = PciDevicePresentInterface.Size; - IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version; - IoStack.Parameters.QueryInterface.Interface = (PINTERFACE)&PciDevicePresentInterface; - IoStack.Parameters.QueryInterface.InterfaceType = - &GUID_PCI_DEVICE_PRESENT_INTERFACE; - Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject, - &IoStatusBlock, IRP_MN_QUERY_INTERFACE, &IoStack); - if (!NT_SUCCESS(Status)) - { - WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status); - return FALSE; - } + PciDevicePresentInterface.Size = sizeof(PCI_DEVICE_PRESENT_INTERFACE); + PciDevicePresentInterface.Version = 1; + IoStack.Parameters.QueryInterface.Size = PciDevicePresentInterface.Size; + IoStack.Parameters.QueryInterface.Version = PciDevicePresentInterface.Version; + IoStack.Parameters.QueryInterface.Interface = (PINTERFACE)&PciDevicePresentInterface; + IoStack.Parameters.QueryInterface.InterfaceType = + &GUID_PCI_DEVICE_PRESENT_INTERFACE; + Status = IopInitiatePnpIrp(DeviceExtension->NextDeviceObject, + &IoStatusBlock, IRP_MN_QUERY_INTERFACE, &IoStack); + if (!NT_SUCCESS(Status)) + { + WARN_(VIDEOPRT, "IopInitiatePnpIrp() failed! (Status 0x%lx)\n", Status); + return FALSE; + } - if (Flags & CDE_USE_REVISION) - PciFlags |= PCI_USE_REVISION; - if (Flags & CDE_USE_SUBSYSTEM_IDS) - PciFlags |= PCI_USE_SUBSYSTEM_IDS; + if (Flags & CDE_USE_REVISION) + PciFlags |= PCI_USE_REVISION; + if (Flags & CDE_USE_SUBSYSTEM_IDS) + PciFlags |= PCI_USE_SUBSYSTEM_IDS; - DevicePresent = PciDevicePresentInterface.IsDevicePresent( - VendorId, DeviceId, RevisionId, - SubVendorId, SubSystemId, PciFlags); + DevicePresent = PciDevicePresentInterface.IsDevicePresent( + VendorId, DeviceId, RevisionId, + SubVendorId, SubSystemId, PciFlags); - PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context); + PciDevicePresentInterface.InterfaceDereference(PciDevicePresentInterface.Context); - return DevicePresent; + return DevicePresent; } /* * @unimplemented */ - -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortRegisterBugcheckCallback( - IN PVOID HwDeviceExtension, - IN ULONG BugcheckCode, - IN PVIDEO_BUGCHECK_CALLBACK Callback, - IN ULONG BugcheckDataSize) + IN PVOID HwDeviceExtension, + IN ULONG BugcheckCode, + IN PVIDEO_BUGCHECK_CALLBACK Callback, + IN ULONG BugcheckDataSize) { UNIMPLEMENTED; return NO_ERROR; @@ -1428,64 +1419,64 @@ VideoPortRegisterBugcheckCallback( /* * @implemented */ - -LONGLONG NTAPI +LONGLONG +NTAPI VideoPortQueryPerformanceCounter( - IN PVOID HwDeviceExtension, - OUT PLONGLONG PerformanceFrequency OPTIONAL) + IN PVOID HwDeviceExtension, + OUT PLONGLONG PerformanceFrequency OPTIONAL) { - LARGE_INTEGER Result; + LARGE_INTEGER Result; - TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n"); - Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency); - return Result.QuadPart; + TRACE_(VIDEOPRT, "VideoPortQueryPerformanceCounter\n"); + Result = KeQueryPerformanceCounter((PLARGE_INTEGER)PerformanceFrequency); + return Result.QuadPart; } /* * @implemented */ - -VOID NTAPI +VOID +NTAPI VideoPortAcquireDeviceLock( - IN PVOID HwDeviceExtension) + IN PVOID HwDeviceExtension) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - (void)Status; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + (void)Status; - TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n"); - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - Status = KeWaitForMutexObject(&DeviceExtension->DeviceLock, Executive, - KernelMode, FALSE, NULL); - // ASSERT(Status == STATUS_SUCCESS); + TRACE_(VIDEOPRT, "VideoPortAcquireDeviceLock\n"); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + Status = KeWaitForMutexObject(&DeviceExtension->DeviceLock, Executive, + KernelMode, FALSE, NULL); + // ASSERT(Status == STATUS_SUCCESS); } /* * @implemented */ - -VOID NTAPI +VOID +NTAPI VideoPortReleaseDeviceLock( - IN PVOID HwDeviceExtension) + IN PVOID HwDeviceExtension) { - PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - LONG Status; - (void)Status; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + LONG Status; + (void)Status; - TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n"); - DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); - Status = KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE); - //ASSERT(Status == STATUS_SUCCESS); + TRACE_(VIDEOPRT, "VideoPortReleaseDeviceLock\n"); + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + Status = KeReleaseMutex(&DeviceExtension->DeviceLock, FALSE); + //ASSERT(Status == STATUS_SUCCESS); } /* * @unimplemented */ - -VOID NTAPI +VOID +NTAPI VpNotifyEaData( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Data) + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Data) { UNIMPLEMENTED; } @@ -1493,12 +1484,13 @@ VpNotifyEaData( /* * @implemented */ -PVOID NTAPI +PVOID +NTAPI VideoPortAllocateContiguousMemory( - IN PVOID HwDeviceExtension, - IN ULONG NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress - ) + IN PVOID HwDeviceExtension, + IN ULONG NumberOfBytes, + IN PHYSICAL_ADDRESS HighestAcceptableAddress +) { return MmAllocateContiguousMemory(NumberOfBytes, HighestAcceptableAddress); @@ -1507,96 +1499,97 @@ VideoPortAllocateContiguousMemory( /* * @implemented */ -BOOLEAN NTAPI +BOOLEAN +NTAPI VideoPortIsNoVesa(VOID) { - NTSTATUS Status; - HANDLE KeyHandle; - UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions"); - OBJECT_ATTRIBUTES ObjectAttributes; - PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; - ULONG Length, NewLength; + NTSTATUS Status; + HANDLE KeyHandle; + UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control"); + UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions"); + OBJECT_ATTRIBUTES ObjectAttributes; + PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + ULONG Length, NewLength; - /* Initialize object attributes with the path we want */ - InitializeObjectAttributes(&ObjectAttributes, - &Path, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); + /* Initialize object attributes with the path we want */ + InitializeObjectAttributes(&ObjectAttributes, + &Path, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); - /* Open the key */ - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); + /* Open the key */ + Status = ZwOpenKey(&KeyHandle, + KEY_QUERY_VALUE, + &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status); - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status); + return FALSE; + } - /* Find out how large our buffer should be */ - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - NULL, - 0, - &Length); - if (Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL) - { - VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); - ZwClose(KeyHandle); - return FALSE; - } + /* Find out how large our buffer should be */ + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + NULL, + 0, + &Length); + if (Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL) + { + VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); + ZwClose(KeyHandle); + return FALSE; + } - /* Allocate it */ - KeyInfo = ExAllocatePool(PagedPool, Length); - if (!KeyInfo) - { - VideoPortDebugPrint(Error, "Out of memory\n"); - ZwClose(KeyHandle); - return FALSE; - } + /* Allocate it */ + KeyInfo = ExAllocatePool(PagedPool, Length); + if (!KeyInfo) + { + VideoPortDebugPrint(Error, "Out of memory\n"); + ZwClose(KeyHandle); + return FALSE; + } - /* Now for real this time */ - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - KeyInfo, - Length, - &NewLength); + /* Now for real this time */ + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + KeyInfo, + Length, + &NewLength); - ZwClose(KeyHandle); + ZwClose(KeyHandle); - if (!NT_SUCCESS(Status)) - { - VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); - ExFreePool(KeyInfo); - return FALSE; - } + if (!NT_SUCCESS(Status)) + { + VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); + ExFreePool(KeyInfo); + return FALSE; + } - /* Sanity check */ - if (KeyInfo->Type != REG_SZ) - { - VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n"); - ExFreePool(KeyInfo); - return FALSE; - } + /* Sanity check */ + if (KeyInfo->Type != REG_SZ) + { + VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n"); + ExFreePool(KeyInfo); + return FALSE; + } - /* Check if NOVESA or BASEVIDEO is present in the start options */ - if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA") || - wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO")) - { - VideoPortDebugPrint(Info, "VESA mode disabled\n"); - ExFreePool(KeyInfo); - return TRUE; - } + /* Check if NOVESA or BASEVIDEO is present in the start options */ + if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA") || + wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO")) + { + VideoPortDebugPrint(Info, "VESA mode disabled\n"); + ExFreePool(KeyInfo); + return TRUE; + } - ExFreePool(KeyInfo); + ExFreePool(KeyInfo); - VideoPortDebugPrint(Info, "VESA mode enabled\n"); + VideoPortDebugPrint(Info, "VESA mode enabled\n"); - return FALSE; + return FALSE; }