DirectX11私のプログラムを実行しているときの死のブルースクリーン

StackOverflow https://stackoverflow.com/questions/9345306

  •  27-10-2019
  •  | 
  •  

質問

次のコードを使用しようとしています。

HRESULT hResult;
HDC hDC;
IDXGISurface1 *pSurface = NULL; 
hResult = m_flashTexture->QueryInterface(__uuidof(IDXGISurface1), (void**)&pSurface); 
hResult = pSurface->GetDC(TRUE, &hDC);                  
assert(SUCCEEDED(hResult));  
m_flashPlayer->DrawFrame(hDC);

ドローフレームはどこにありますか...

void CFlashDXPlayer::DrawFrame(HDC dc)
{
if (m_dirtyFlag)
{
    IViewObject* pViewObject = NULL;
    m_flashInterface->QueryInterface(IID_IViewObject, (LPVOID*) &pViewObject);
    if (pViewObject != NULL)
    {
        // Combine regions
        HRGN unionRgn, first, second = NULL;
        unionRgn = CreateRectRgnIndirect(&m_dirtyRects[0]);
        if (m_dirtyRects.size() >= 2)
            second = CreateRectRgn(0, 0, 1, 1);

        for (std::vector<RECT>::iterator it = m_dirtyRects.begin() + 1; it != m_dirtyRects.end(); ++it)
        {
            // Fill combined region
            first = unionRgn;
            SetRectRgn(second, it->left, it->top, it->right, it->bottom);
            unionRgn = CreateRectRgn(0, 0, 1, 1);

            CombineRgn(unionRgn, first, second, RGN_OR);
            DeleteObject(first);
        }

        if (second)
            DeleteObject(second);

        RECT clipRgnRect; GetRgnBox(unionRgn, &clipRgnRect);
        RECTL clipRect = { 0, 0, m_width, m_height };

        // Fill background
        if (m_transpMode != TMODE_FULL_ALPHA)
        {
            // Set clip region
            SelectClipRgn(dc, unionRgn);

            COLORREF fillColor = GetBackgroundColor();
            HBRUSH fillColorBrush = CreateSolidBrush(fillColor);
            FillRgn(dc, unionRgn, fillColorBrush);
            DeleteObject(fillColorBrush);

            // Draw to main buffer
            HRESULT hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, dc, &clipRect, &clipRect, NULL, 0);
            assert(SUCCEEDED(hr));
        }
        else
        {
            if (m_alphaBlackDC == NULL)
            {
                // Create memory buffers
                BITMAPINFOHEADER bih = {0};
                bih.biSize = sizeof(BITMAPINFOHEADER);
                bih.biBitCount = 32;
                bih.biCompression = BI_RGB;
                bih.biPlanes = 1;
                bih.biWidth = LONG(m_width);
                bih.biHeight = -LONG(m_height);

                m_alphaBlackDC = CreateCompatibleDC(dc);
                m_alphaBlackBitmap = CreateDIBSection(m_alphaBlackDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaBlackBuffer, 0, 0);
                SelectObject(m_alphaBlackDC, m_alphaBlackBitmap);

                m_alphaWhiteDC = CreateCompatibleDC(dc);
                m_alphaWhiteBitmap = CreateDIBSection(m_alphaWhiteDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaWhiteBuffer, 0, 0);
                SelectObject(m_alphaWhiteDC, m_alphaWhiteBitmap);
            }

            HRESULT hr;
            HBRUSH fillColorBrush;

            // Render frame twice - against white and against black background to calculate alpha
            SelectClipRgn(m_alphaBlackDC, unionRgn);

            COLORREF blackColor = 0x00000000;
            fillColorBrush = CreateSolidBrush(blackColor);
            FillRgn(m_alphaBlackDC, unionRgn, fillColorBrush);
            DeleteObject(fillColorBrush);

            hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaBlackDC, &clipRect, &clipRect, NULL, 0);
            assert(SUCCEEDED(hr));

            // White background
            SelectClipRgn(m_alphaWhiteDC, unionRgn);

            COLORREF whiteColor = 0x00FFFFFF;
            fillColorBrush = CreateSolidBrush(whiteColor);
            FillRgn(m_alphaWhiteDC, unionRgn, fillColorBrush);
            DeleteObject(fillColorBrush);

            hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaWhiteDC, &clipRect, &clipRect, NULL, 0);
            assert(SUCCEEDED(hr));

            // Combine alpha
            for (LONG y = clipRgnRect.top; y < clipRgnRect.bottom; ++y)
            {
                int offset = y * m_width * 4 + clipRgnRect.left * 4;
                for (LONG x = clipRgnRect.left; x < clipRgnRect.right; ++x)
                {
                    BYTE blackRed = m_alphaBlackBuffer[offset];
                    BYTE whiteRed = m_alphaWhiteBuffer[offset];
                    m_alphaBlackBuffer[offset + 3] = 255 - (whiteRed - blackRed);
                    offset += 4;
                }
            }

            // Blit result to target DC
            BitBlt(dc, clipRgnRect.left, clipRgnRect.top,
                   clipRgnRect.right - clipRgnRect.left,
                   clipRgnRect.bottom - clipRgnRect.top,
                   m_alphaBlackDC, clipRgnRect.left, clipRgnRect.top, SRCCOPY);
        }

        DeleteObject(unionRgn);
        pViewObject->Release();
    }

    m_dirtyFlag = false;
    m_dirtyRects.clear();
    m_dirtyUnionRect.left = m_dirtyUnionRect.top = LONG_MAX;
    m_dirtyUnionRect.right = m_dirtyUnionRect.bottom = -LONG_MAX;
}
}

また、以下を使用してm_flashtextureをセットアップすることにも言及する必要があります。

D3D11_TEXTURE2D_DESC textureDesc;                  
ZeroMemory(&textureDesc, sizeof(textureDesc));                  
textureDesc.Width = width;                  
textureDesc.Height = height;                  
textureDesc.MipLevels = 1;                  
textureDesc.ArraySize = 1;                  
textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;                  
textureDesc.SampleDesc.Count = 1;                  
textureDesc.Usage = D3D11_USAGE_DEFAULT;                  
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE |     D3D11_BIND_RENDER_TARGET;                  
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;  
HRESULT hr = device->CreateTexture2D(&textureDesc, NULL, &m_flashTexture); 

このコードを実行するたびに(それにもっとありますが、他のクラスの束に埋め込まれているので、何か他のものが役立つと思うかどうかを教えてください。)フラッシュプレイヤーのどこかに引き起こされる死の青いスクリーンが得られます - > drawframe()関数。ブルースクリーンの原因が何であるかわかりません。

何かアイデアや、それがブルースクリーンを引き起こすように見える際立っている何かを見ている人はいますか?

ありがとう。

詳しくは

これがクラッシュダンプの結果です

ADDITIONAL_DEBUG_TEXT:  
Use '!findthebuild' command to search for the target build information.
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and   load symbols.

FAULTING_MODULE: fffff80002c01000 nt

DEBUG_FLR_IMAGE_TIMESTAMP:  4d41a3e1

READ_ADDRESS: unable to get nt!MmSpecialPoolStart
unable to get nt!MmSpecialPoolEnd
unable to get nt!MmPoolCodeStart
unable to get nt!MmPoolCodeEnd
fffff8814061c6a0 

FAULTING_IP: 
igdpmd64+15a878
fffff880`0697c878 8b0408          mov     eax,dword ptr [rax+rcx]

MM_INTERNAL_CODE:  5

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  VISTA_DRIVER_FAULT

BUGCHECK_STR:  0x50

CURRENT_IRQL:  0

LAST_CONTROL_TRANSFER:  from fffff80002c283bf to fffff80002c7dc40

STACK_TEXT:  
fffff880`0a7e5878 fffff800`02c283bf : 00000000`00000050 fffff881`4061c6a0 00000000`00000000     fffff880`0a7e59e0 : nt+0x7cc40
fffff880`0a7e5880 00000000`00000050 : fffff881`4061c6a0 00000000`00000000 fffff880`0a7e59e0     00000000`00000005 : nt+0x273bf
fffff880`0a7e5888 fffff881`4061c6a0 : 00000000`00000000 fffff880`0a7e59e0 00000000`00000005 00000000`00000000 : 0x50
fffff880`0a7e5890 00000000`00000000 : fffff880`0a7e59e0 00000000`00000005 00000000`00000000 00000000`00000000 : 0xfffff881`4061c6a0


STACK_COMMAND:  .bugcheck ; kb

FOLLOWUP_IP: 
igdpmd64+15a878
fffff880`0697c878 8b0408          mov     eax,dword ptr [rax+rcx]

SYMBOL_NAME:  igdpmd64+15a878

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: igdpmd64

IMAGE_NAME:  igdpmd64.sys

BUCKET_ID:  WRONG_SYMBOLS

Followup: MachineOwner

誰かがこれが何を意味するのか知っていますか?

役に立ちましたか?

解決

ユーザースペースアプリケーションを作成してBSODを引き起こすたびに、いくつかのカーネルレベルコードにバグがあります(Windowsカーネル自体、または一部のドライバーのいずれか、この場合、IGDPMD64.SYSのように見えます)。簡単に言えば、OSは必要です いかなる状況でも、決して, 、ユーザースペースアプリケーションが行ったことのためにクラッシュします。したがって、このドライバーのアップグレードがあるかどうかを調べます。

ただし、DirectXを誤って使用しており、このドライバーのバグをトリガーしているコードにバグがある可能性があります。

確かに、私はクラッシュを引き起こす絶対に最小限の完全なプログラムを作成しようとします。少なくとも、ドライバーライターに提出できるように。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top