예제 #1
0
static HRESULT vboxDispKmtOpenAdapterViaHdc(const VBOXDISPKMT_CALLBACKS *pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
{
    D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0};
    HRESULT hr = vboxDispKmtAdpHdcCreate(&OpenAdapterData.hDc);
    if (!SUCCEEDED(hr))
        return hr;

    Assert(OpenAdapterData.hDc);
    NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromHdc(&OpenAdapterData);
    if (NT_SUCCESS(Status))
    {
        pAdapter->hAdapter = OpenAdapterData.hAdapter;
        pAdapter->hDc = OpenAdapterData.hDc;
        pAdapter->pCallbacks = pCallbacks;
        memset(&pAdapter->Luid, 0, sizeof (pAdapter->Luid));
        return S_OK;
    }
    else
    {
        LogFunc(("pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
        hr = E_FAIL;
    }

    DeleteDC(OpenAdapterData.hDc);

    return hr;
}
static HRESULT vboxDispKmtOpenAdapterViaHdc(PVBOXDISPKMT_CALLBACKS pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
{
    D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0};
    HRESULT hr = vboxDispKmtAdpHdcCreate(&OpenAdapterData.hDc);
    if (!SUCCEEDED(hr))
        return hr;

    Assert(OpenAdapterData.hDc);
    NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromHdc(&OpenAdapterData);
#ifdef DEBUG_misha
    /* may fail with xpdm driver */
    Assert(NT_SUCCESS(Status));
#endif
    if (NT_SUCCESS(Status))
    {
        pAdapter->hAdapter = OpenAdapterData.hAdapter;
        pAdapter->hDc = OpenAdapterData.hDc;
        pAdapter->pCallbacks = pCallbacks;
        memset(&pAdapter->Luid, 0, sizeof (pAdapter->Luid));
        return S_OK;
    }
    else
    {
        Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
        hr = E_FAIL;
    }

    DeleteDC(OpenAdapterData.hDc);

    return hr;
}