Pregunta

Estoy tratando de usar el siguiente código:

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);

Donde está el marco de dibujo ...

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;
}
}

También debería mencionar que configuré m_flashTexture usando lo siguiente:

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); 

Cada vez que ejecuto este código (hay más, pero está enterrado en un montón de otras clases, avíseme si cree que algo más sería útil ...) obtengo una pantalla azul de la muerte que se causa en algún lugar del Flashplayer -> Función Drawframe (). No tengo idea de lo que está causando la pantalla azul.

¿Alguna idea o alguien ve algo que se destaque que parezca que causaría una pantalla azul?

Gracias.

Más información

Aquí están los resultados del volcado de choque

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

Alguien sabe que significa esto?

¿Fue útil?

Solución

Cada vez que escribe una aplicación de espacio de usuario y causa un BSOD, entonces ciertamente hay un error en algún código de nivel de núcleo (ya sea el kernel de Windows o algún controlador, en este caso, parece que IGDPMD64.sys). En pocas palabras, el sistema operativo debería nunca, bajo ninguna circunstancia, bloquear debido a algo que hizo una aplicación de espacio de usuario. Así que analizaría si hay o no una actualización para este controlador o no.

Sin embargo, también es probable que tenga un error en su código que use DirectX incorrectamente y active este error del controlador.

Ciertamente, intentaría crear un programa completo y completo que desencadena el bloqueo. Por lo menos, puede enviarlo a los escritores de controladores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top