[Spice-devel] [PATCH qxl-wddm-dod v2 04/25] Set DriverStarted flag at the begining of the StartDriver function
Frediano Ziglio
fziglio at redhat.com
Tue Sep 6 13:06:29 UTC 2016
>
> From: Sandy Stutsman <sstutsma at redhat.com>
>
> 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.
Wouldn't this be enough ?
diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index 2793a1d..e66920d 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -122,6 +122,9 @@ NTSTATUS QxlDod::StartDevice(_In_ DXGK_START_INFO* pDxgkStartInfo,
RtlZeroMemory(m_CurrentModes, sizeof(m_CurrentModes));
//CHECK ME!!!!!!!!!!!!!
m_CurrentModes[0].DispInfo.TargetId = D3DDDI_ID_UNINITIALIZED;
+
+ m_Flags.DriverStarted = FALSE;
+
// Get device information from OS.
NTSTATUS Status = m_DxgkInterface.DxgkCbGetDeviceInformation(m_DxgkInterface.DeviceHandle, &m_DeviceInfo);
if (!NT_SUCCESS(Status))
> ---
> qxldod/QxlDod.cpp | 110
> +++++++++++++++++++++++++++---------------------------
> 1 file changed, 54 insertions(+), 56 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 2793a1d..3d0cd2e 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;
> }
By the way, this patch contains too much style changes not related to
the rationale.
Also "Fixing possible BSOD" patch reverts some of this patch.
Frediano
More information about the Spice-devel
mailing list