From: Sandy Stutsman <sstutsma@xxxxxxxxxx> With the Driver Verifier on, a DPC generated during the call will assert if the flag is not set. Changed error handling so that if something fails, the code will break out of a do loop and reset the flag to false before returning the error status. --- qxldod/QxlDod.cpp | 110 +++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index 94f2d18..77f4f86 100755 --- a/qxldod/QxlDod.cpp +++ b/qxldod/QxlDod.cpp @@ -113,72 +113,73 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo, { PHYSICAL_ADDRESS PhysicAddress; PAGED_CODE(); + NTSTATUS Status; QXL_ASSERT(pDxgkStartInfo != NULL); QXL_ASSERT(pDxgkInterface != NULL); QXL_ASSERT(pNumberOfViews != NULL); QXL_ASSERT(pNumberOfChildren != NULL); -//CHECK ME!!!!!!!!!!!!! + //CHECK ME!!!!!!!!!!!!! RtlCopyMemory(&m_DxgkInterface, pDxgkInterface, sizeof(m_DxgkInterface)); RtlZeroMemory(m_CurrentModes, sizeof(m_CurrentModes)); -//CHECK ME!!!!!!!!!!!!! + //CHECK ME!!!!!!!!!!!!! m_CurrentModes[0].DispInfo.TargetId = D3DDDI_ID_UNINITIALIZED; - // Get device information from OS. - NTSTATUS Status = m_DxgkInterface.DxgkCbGetDeviceInformation(m_DxgkInterface.DeviceHandle, &m_DeviceInfo); - if (!NT_SUCCESS(Status)) - { - QXL_LOG_ASSERTION1("DxgkCbGetDeviceInformation failed with status 0x%X\n", - Status); - return Status; - } + m_Flags.DriverStarted = TRUE; + do { - Status = CheckHardware(); - if (NT_SUCCESS(Status)) - { - m_pHWDevice = new(NonPagedPoolNx) QxlDevice(this); - } - else - { - m_pHWDevice = new(NonPagedPoolNx) VgaDevice(this); - } + // Get device information from OS. + Status = m_DxgkInterface.DxgkCbGetDeviceInformation(m_DxgkInterface.DeviceHandle, &m_DeviceInfo); + if (!NT_SUCCESS(Status)) { + QXL_LOG_ASSERTION1("DxgkCbGetDeviceInformation failed with status 0x%X\n", + Status); + break; + } - if (!m_pHWDevice) - { - Status = STATUS_NO_MEMORY; - DbgPrint(TRACE_LEVEL_ERROR, ("HWInit failed to allocate memory\n")); - return Status; - } + Status = CheckHardware(); + if (NT_SUCCESS(Status)) { + m_pHWDevice = new(NonPagedPoolNx) QxlDevice(this); + } + else { + m_pHWDevice = new(NonPagedPoolNx) VgaDevice(this); + } - Status = m_pHWDevice->HWInit(m_DeviceInfo.TranslatedResourceList, &m_CurrentModes[0].DispInfo); - if (!NT_SUCCESS(Status)) - { - DbgPrint(TRACE_LEVEL_ERROR, ("HWInit failed with status 0x%X\n", Status)); - return Status; - } + if (!m_pHWDevice) { + Status = STATUS_NO_MEMORY; + DbgPrint(TRACE_LEVEL_ERROR, ("HWInit failed to allocate memory\n")); + break; + } - Status = RegisterHWInfo(m_pHWDevice->GetId()); - if (!NT_SUCCESS(Status)) - { - QXL_LOG_ASSERTION1("RegisterHWInfo failed with status 0x%X\n", - Status); - return Status; - } + Status = m_pHWDevice->HWInit(m_DeviceInfo.TranslatedResourceList, &m_CurrentModes[0].DispInfo); + if (!NT_SUCCESS(Status)) { + DbgPrint(TRACE_LEVEL_ERROR, ("HWInit failed with status 0x%X\n", Status)); + break; + } - PhysicAddress.QuadPart = m_CurrentModes[0].DispInfo.PhysicAddress.QuadPart; - if (m_pHWDevice->GetId() == 0) - { - Status = m_DxgkInterface.DxgkCbAcquirePostDisplayOwnership(m_DxgkInterface.DeviceHandle, &(m_CurrentModes[0].DispInfo)); - } + Status = RegisterHWInfo(m_pHWDevice->GetId()); + if (!NT_SUCCESS(Status)) { + QXL_LOG_ASSERTION1("RegisterHWInfo failed with status 0x%X\n", + Status); + break; + } - if (!NT_SUCCESS(Status) ) - { - DbgPrint(TRACE_LEVEL_ERROR, ("DxgkCbAcquirePostDisplayOwnership failed with status 0x%X Width = %d\n", - Status, m_CurrentModes[0].DispInfo.Width)); - return STATUS_UNSUCCESSFUL; + PhysicAddress.QuadPart = m_CurrentModes[0].DispInfo.PhysicAddress.QuadPart; + if (m_pHWDevice->GetId() == 0) { + Status = m_DxgkInterface.DxgkCbAcquirePostDisplayOwnership(m_DxgkInterface.DeviceHandle, &(m_CurrentModes[0].DispInfo)); + } + + if (!NT_SUCCESS(Status)) { + DbgPrint(TRACE_LEVEL_ERROR, ("DxgkCbAcquirePostDisplayOwnership failed with status 0x%X Width = %d\n", + Status, m_CurrentModes[0].DispInfo.Width)); + Status = STATUS_UNSUCCESSFUL; + break; + } + } while (0); + if (!NT_SUCCESS(Status)) { + m_Flags.DriverStarted = FALSE; + return Status; } - if (m_CurrentModes[0].DispInfo.Width == 0) - { - m_CurrentModes[0].DispInfo.Width = MIN_WIDTH_SIZE; + if (m_CurrentModes[0].DispInfo.Width == 0) { + m_CurrentModes[0].DispInfo.Width = MIN_WIDTH_SIZE; m_CurrentModes[0].DispInfo.Height = MIN_HEIGHT_SIZE; m_CurrentModes[0].DispInfo.Pitch = BPPFromPixelFormat(D3DDDIFMT_R8G8B8) / 8; m_CurrentModes[0].DispInfo.ColorFormat = D3DDDIFMT_R8G8B8; @@ -186,12 +187,9 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo, if (PhysicAddress.QuadPart != 0L) { m_CurrentModes[0].DispInfo.PhysicAddress.QuadPart = PhysicAddress.QuadPart; } - } - - *pNumberOfViews = MAX_VIEWS; - *pNumberOfChildren = MAX_CHILDREN; - m_Flags.DriverStarted = TRUE; + *pNumberOfViews = MAX_VIEWS; + *pNumberOfChildren = MAX_CHILDREN; DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s\n", __FUNCTION__)); return STATUS_SUCCESS; } -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel