diff --git a/win32ss/drivers/videoprt/dispatch.c b/win32ss/drivers/videoprt/dispatch.c index 22b89830e82..88c5ae4e25f 100644 --- a/win32ss/drivers/videoprt/dispatch.c +++ b/win32ss/drivers/videoprt/dispatch.c @@ -964,9 +964,8 @@ IntVideoPortPnPStartDevice( DeviceExtension->InterruptVector); /* Create adapter device object */ - return IntVideoPortFindAdapter(DriverObject, - DriverExtension, - DeviceObject); + return IntVideoPortFindAdapter(DriverObject, DriverExtension, + DeviceObject, FALSE); } diff --git a/win32ss/drivers/videoprt/videoprt.c b/win32ss/drivers/videoprt/videoprt.c index a9ac7df0860..8bc8a259317 100644 --- a/win32ss/drivers/videoprt/videoprt.c +++ b/win32ss/drivers/videoprt/videoprt.c @@ -430,11 +430,11 @@ IntVideoPortEnumBuses( } 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_ _When_(LegacyDetection, _Null_) PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN LegacyDetection) { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; NTSTATUS Status; @@ -442,9 +442,24 @@ IntVideoPortFindAdapter( VIDEO_PORT_CONFIG_INFO ConfigInfo; SYSTEM_BASIC_INFORMATION SystemBasicInfo; UCHAR Again = FALSE; - BOOL LegacyDetection = FALSE; BOOLEAN VgaResourcesReleased = FALSE; + if (LegacyDetection) + { + ASSERT(DeviceObject == NULL); + Status = IntVideoPortCreateAdapterDeviceObject(DriverObject, + DriverExtension, + NULL, // no DeviceExtension->PhysicalDeviceObject + DriverExtension->InitializationData.StartingDeviceNumber, + 0, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status); + return Status; + } + } + DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceExtension->IsVgaDetect = DeviceExtension->IsVgaDriver; DeviceExtension->IsLegacyDetect = FALSE; @@ -485,12 +500,13 @@ IntVideoPortFindAdapter( */ if (DeviceExtension->PhysicalDeviceObject == NULL) { - LegacyDetection = TRUE; + ASSERT(LegacyDetection == TRUE); DeviceExtension->IsLegacyDevice = TRUE; DeviceExtension->IsLegacyDetect = TRUE; } else { + ASSERT(LegacyDetection == FALSE); DeviceExtension->IsLegacyDevice = FALSE; } @@ -1025,8 +1041,7 @@ VideoPortInitialize( INFO_(VIDEOPRT, "Legacy detection for adapter interface %d\n", HwInitializationData->AdapterInterfaceType); - /* FIXME: Move the code for legacy detection - to another function and call it here */ + /* Enable legacy detection, will be invoked below */ LegacyDetection = TRUE; } @@ -1100,46 +1115,26 @@ VideoPortInitialize( DriverExtension->HwContext = HwContext; /* - * Plug & Play drivers registers the device in AddDevice routine. + * Plug & Play drivers register the device in the AddDevice routine. * For legacy drivers we must do it now. */ if (LegacyDetection) { - PDEVICE_OBJECT DeviceObject; - - if (HwInitializationData->HwInitDataSize != SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA) - { - /* Power management */ + /* Power management */ + if (HwInitializationData->HwInitDataSize > SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA) DriverObject->MajorFunction[IRP_MJ_POWER] = IntVideoPortDispatchPower; - } - Status = IntVideoPortCreateAdapterDeviceObject(DriverObject, - DriverExtension, - NULL, - DriverExtension->InitializationData.StartingDeviceNumber, - 0, - &DeviceObject); + Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, NULL, TRUE); if (!NT_SUCCESS(Status)) - { - ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject returned 0x%x\n", Status); - return Status; - } - - Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject); - if (!NT_SUCCESS(Status)) - ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status); - + ERR_(VIDEOPRT, "IntVideoPortFindAdapter(Legacy) 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; - } + 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; } /* diff --git a/win32ss/drivers/videoprt/videoprt.h b/win32ss/drivers/videoprt/videoprt.h index a09a0d1902f..ac17e85cbbf 100644 --- a/win32ss/drivers/videoprt/videoprt.h +++ b/win32ss/drivers/videoprt/videoprt.h @@ -288,11 +288,12 @@ IntVideoPortCreateAdapterDeviceObject( _In_ USHORT DisplayNumber, _Out_opt_ PDEVICE_OBJECT *DeviceObject); -NTSTATUS NTAPI +NTSTATUS 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_ _When_(LegacyDetection, _Null_) PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN LegacyDetection); PVOID NTAPI