9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBoxVideo Display D3D User mode dll
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include "VBoxDispD3DBase.h"
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include "VBoxDispKmt.h"
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include <iprt/assert.h>
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include <iprt/log.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync#ifndef NT_SUCCESS
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync# define NT_SUCCESS(_Status) ((_Status) >= 0)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync#endif
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/**
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Loads a system DLL.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @returns Module handle or NULL
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @param pszName The DLL name.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncstatic HMODULE loadSystemDll(const char *pszName)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync char szPath[MAX_PATH];
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync UINT cchPath = GetSystemDirectoryA(szPath, sizeof(szPath));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync size_t cbName = strlen(pszName) + 1;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (cchPath + 1 + cbName > sizeof(szPath))
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return NULL;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync szPath[cchPath] = '\\';
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync memcpy(&szPath[cchPath + 1], pszName, cbName);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return LoadLibraryA(szPath);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtCallbacksInit(PVBOXDISPKMT_CALLBACKS pCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pCallbacks, 0, sizeof (*pCallbacks));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync pCallbacks->hGdi32 = loadSystemDll("gdi32.dll");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCallbacks->hGdi32 != NULL)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bool bSupported = true;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync bool bSupportedWin8 = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTOpenAdapterFromHdc = (PFND3DKMT_OPENADAPTERFROMHDC)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromHdc");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__"pfnD3DKMTOpenAdapterFromHdc = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromHdc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTOpenAdapterFromHdc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName = (PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromGdiDisplayName");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTOpenAdapterFromGdiDisplayName);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTCloseAdapter = (PFND3DKMT_CLOSEADAPTER)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCloseAdapter");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTCloseAdapter = %p\n", pCallbacks->pfnD3DKMTCloseAdapter));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTCloseAdapter);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTEscape = (PFND3DKMT_ESCAPE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTEscape");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTEscape = %p\n", pCallbacks->pfnD3DKMTEscape));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTEscape);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync pCallbacks->pfnD3DKMTQueryAdapterInfo = (PFND3DKMT_QUERYADAPTERINFO)GetProcAddress(pCallbacks->hGdi32, "D3DKMTQueryAdapterInfo");
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync Log((__FUNCTION__": pfnD3DKMTQueryAdapterInfo = %p\n", pCallbacks->pfnD3DKMTQueryAdapterInfo));
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync bSupported &= !!(pCallbacks->pfnD3DKMTQueryAdapterInfo);
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync
cb0578a5309e1fc264e5a4acc30543bea075be43vboxsync pCallbacks->pfnD3DKMTCreateDevice = (PFND3DKMT_CREATEDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateDevice");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTCreateDevice = %p\n", pCallbacks->pfnD3DKMTCreateDevice));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTCreateDevice);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTDestroyDevice = (PFND3DKMT_DESTROYDEVICE)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyDevice");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTDestroyDevice = %p\n", pCallbacks->pfnD3DKMTDestroyDevice));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTDestroyDevice);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTCreateContext = (PFND3DKMT_CREATECONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateContext");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTCreateContext = %p\n", pCallbacks->pfnD3DKMTCreateContext));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTCreateContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTDestroyContext = (PFND3DKMT_DESTROYCONTEXT)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyContext");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTDestroyContext = %p\n", pCallbacks->pfnD3DKMTDestroyContext));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTDestroyContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTRender = (PFND3DKMT_RENDER)GetProcAddress(pCallbacks->hGdi32, "D3DKMTRender");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTRender = %p\n", pCallbacks->pfnD3DKMTRender));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTRender);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTCreateAllocation = (PFND3DKMT_CREATEALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTCreateAllocation");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTCreateAllocation = %p\n", pCallbacks->pfnD3DKMTCreateAllocation));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTCreateAllocation);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTDestroyAllocation = (PFND3DKMT_DESTROYALLOCATION)GetProcAddress(pCallbacks->hGdi32, "D3DKMTDestroyAllocation");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTDestroyAllocation = %p\n", pCallbacks->pfnD3DKMTDestroyAllocation));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTDestroyAllocation);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTLock = (PFND3DKMT_LOCK)GetProcAddress(pCallbacks->hGdi32, "D3DKMTLock");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTLock = %p\n", pCallbacks->pfnD3DKMTLock));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTLock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnD3DKMTUnlock = (PFND3DKMT_UNLOCK)GetProcAddress(pCallbacks->hGdi32, "D3DKMTUnlock");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTUnlock = %p\n", pCallbacks->pfnD3DKMTUnlock));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bSupported &= !!(pCallbacks->pfnD3DKMTUnlock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync pCallbacks->pfnD3DKMTInvalidateActiveVidPn = (PFND3DKMT_INVALIDATEACTIVEVIDPN)GetProcAddress(pCallbacks->hGdi32, "D3DKMTInvalidateActiveVidPn");
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync Log((__FUNCTION__": pfnD3DKMTInvalidateActiveVidPn = %p\n", pCallbacks->pfnD3DKMTInvalidateActiveVidPn));
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync bSupported &= !!(pCallbacks->pfnD3DKMTInvalidateActiveVidPn);
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync pCallbacks->pfnD3DKMTPollDisplayChildren = (PFND3DKMT_POLLDISPLAYCHILDREN)GetProcAddress(pCallbacks->hGdi32, "D3DKMTPollDisplayChildren");
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync Log((__FUNCTION__": pfnD3DKMTPollDisplayChildren = %p\n", pCallbacks->pfnD3DKMTPollDisplayChildren));
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync bSupported &= !!(pCallbacks->pfnD3DKMTPollDisplayChildren);
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pCallbacks->pfnD3DKMTEnumAdapters = (PFND3DKMT_ENUMADAPTERS)GetProcAddress(pCallbacks->hGdi32, "D3DKMTEnumAdapters");
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Log((__FUNCTION__": pfnD3DKMTEnumAdapters = %p\n", pCallbacks->pfnD3DKMTEnumAdapters));
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync /* this present starting win8 release preview only, so keep going if it is not available,
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync * i.e. do not clear the bSupported on its absence */
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync bSupportedWin8 &= !!(pCallbacks->pfnD3DKMTEnumAdapters);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pCallbacks->pfnD3DKMTOpenAdapterFromLuid = (PFND3DKMT_OPENADAPTERFROMLUID)GetProcAddress(pCallbacks->hGdi32, "D3DKMTOpenAdapterFromLuid");
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromLuid = %p\n", pCallbacks->pfnD3DKMTOpenAdapterFromLuid));
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync /* this present starting win8 release preview only, so keep going if it is not available,
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync * i.e. do not clear the bSupported on its absence */
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync bSupportedWin8 &= !!(pCallbacks->pfnD3DKMTOpenAdapterFromLuid);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*Assert(bSupported);*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bSupported)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (bSupportedWin8)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pCallbacks->enmVersion = VBOXDISPKMT_CALLBACKS_VERSION_WIN8;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync else
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pCallbacks->enmVersion = VBOXDISPKMT_CALLBACKS_VERSION_VISTA_WIN7;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": one of pfnD3DKMT function pointers failed to initialize\n"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = E_NOINTERFACE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync FreeLibrary(pCallbacks->hGdi32);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD winEr = GetLastError();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = HRESULT_FROM_WIN32(winEr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(hr != S_OK);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(hr != S_FALSE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hr == S_OK || hr == S_FALSE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return hr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtCallbacksTerm(PVBOXDISPKMT_CALLBACKS pCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync FreeLibrary(pCallbacks->hGdi32);
72774443050856dc9e820b971545ecc67a2d6871vboxsync#ifdef DEBUG_misha
72774443050856dc9e820b971545ecc67a2d6871vboxsync memset(pCallbacks, 0, sizeof (*pCallbacks));
72774443050856dc9e820b971545ecc67a2d6871vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtAdpHdcCreate(HDC *phDc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DISPLAY_DEVICE DDev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(&DDev, 0, sizeof (DDev));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDev.cb = sizeof (DDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *phDc = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; ; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (EnumDisplayDevices(NULL, /* LPCTSTR lpDevice */ i, /* DWORD iDevNum */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &DDev, 0 /* DWORD dwFlags*/))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (DDev.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HDC hDc = CreateDC(NULL, DDev.DeviceName, NULL, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (hDc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *phDc = hDc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD winEr = GetLastError();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = HRESULT_FROM_WIN32(winEr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(FAILED(hr));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DWORD winEr = GetLastError();
d9e3fb31ad27094d4e0e2664b75b3c608708cfbcvboxsync// BP_WARN();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync hr = HRESULT_FROM_WIN32(winEr);
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync#ifdef DEBUG_misha
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(FAILED(hr));
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync#endif
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync if (!FAILED(hr))
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync {
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync hr = E_FAIL;
441b60f8b0601cc1718368c9c3ef082223ad12a2vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return hr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsyncstatic HRESULT vboxDispKmtOpenAdapterViaHdc(const VBOXDISPKMT_CALLBACKS *pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_OPENADAPTERFROMHDC OpenAdapterData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT hr = vboxDispKmtAdpHdcCreate(&OpenAdapterData.hDc);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (!SUCCEEDED(hr))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return hr;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Assert(OpenAdapterData.hDc);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync NTSTATUS Status = pCallbacks->pfnD3DKMTOpenAdapterFromHdc(&OpenAdapterData);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (NT_SUCCESS(Status))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->hAdapter = OpenAdapterData.hAdapter;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->hDc = OpenAdapterData.hDc;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->pCallbacks = pCallbacks;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync memset(&pAdapter->Luid, 0, sizeof (pAdapter->Luid));
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return S_OK;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync }
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Log((__FUNCTION__": pfnD3DKMTOpenAdapterFromGdiDisplayName failed, Status (0x%x)\n", Status));
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync hr = E_FAIL;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync }
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync DeleteDC(OpenAdapterData.hDc);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return hr;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync}
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsyncstatic HRESULT vboxDispKmtOpenAdapterViaLuid(const VBOXDISPKMT_CALLBACKS *pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync{
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (pCallbacks->enmVersion < VBOXDISPKMT_CALLBACKS_VERSION_WIN8)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return E_NOTIMPL;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync D3DKMT_ENUMADAPTERS EnumAdapters = {0};
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync EnumAdapters.NumAdapters = RT_ELEMENTS(EnumAdapters.Adapters);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync NTSTATUS Status = pCallbacks->pfnD3DKMTEnumAdapters(&EnumAdapters);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef DEBUG_misha
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (!NT_SUCCESS(Status))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return E_FAIL;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Assert(EnumAdapters.NumAdapters);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync /* try the same twice: if we fail to open the adapter containing present sources,
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync * try to open any adapter */
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync for (ULONG f = 0; f < 2; ++f)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync for (ULONG i = 0; i < EnumAdapters.NumAdapters; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (f || EnumAdapters.Adapters[i].NumOfSources)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync D3DKMT_OPENADAPTERFROMLUID OpenAdapterData = {0};
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync OpenAdapterData.AdapterLuid = EnumAdapters.Adapters[i].AdapterLuid;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Status = pCallbacks->pfnD3DKMTOpenAdapterFromLuid(&OpenAdapterData);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync #ifdef DEBUG_misha
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Assert(!Status);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync #endif
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (NT_SUCCESS(Status))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync {
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->hAdapter = OpenAdapterData.hAdapter;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->hDc = NULL;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->Luid = EnumAdapters.Adapters[i].AdapterLuid;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync pAdapter->pCallbacks = pCallbacks;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return S_OK;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync }
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync#ifdef DEBUG_misha
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync Assert(0);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync#endif
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return E_FAIL;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync}
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsyncHRESULT vboxDispKmtOpenAdapter(const VBOXDISPKMT_CALLBACKS *pCallbacks, PVBOXDISPKMT_ADAPTER pAdapter)
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync{
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync HRESULT hr = vboxDispKmtOpenAdapterViaHdc(pCallbacks, pAdapter);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (SUCCEEDED(hr))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return S_OK;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync hr = vboxDispKmtOpenAdapterViaLuid(pCallbacks, pAdapter);
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync if (SUCCEEDED(hr))
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync return S_OK;
4caf19ef0484a5991eed5210bb56cb1104835fc6vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return hr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtCloseAdapter(PVBOXDISPKMT_ADAPTER pAdapter)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_CLOSEADAPTER ClosaAdapterData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ClosaAdapterData.hAdapter = pAdapter->hAdapter;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pAdapter->pCallbacks->pfnD3DKMTCloseAdapter(&ClosaAdapterData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DeleteDC(pAdapter->hDc);
72774443050856dc9e820b971545ecc67a2d6871vboxsync#ifdef DEBUG_misha
72774443050856dc9e820b971545ecc67a2d6871vboxsync memset(pAdapter, 0, sizeof (*pAdapter));
72774443050856dc9e820b971545ecc67a2d6871vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log((__FUNCTION__": pfnD3DKMTCloseAdapter failed, Status (0x%x)\n", Status));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtCreateDevice(PVBOXDISPKMT_ADAPTER pAdapter, PVBOXDISPKMT_DEVICE pDevice)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_CREATEDEVICE CreateDeviceData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync CreateDeviceData.hAdapter = pAdapter->hAdapter;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pAdapter->pCallbacks->pfnD3DKMTCreateDevice(&CreateDeviceData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->pAdapter = pAdapter;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->hDevice = CreateDeviceData.hDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->pCommandBuffer = CreateDeviceData.pCommandBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->CommandBufferSize = CreateDeviceData.CommandBufferSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->pAllocationList = CreateDeviceData.pAllocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->AllocationListSize = CreateDeviceData.AllocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->pPatchLocationList = CreateDeviceData.pPatchLocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDevice->PatchLocationListSize = CreateDeviceData.PatchLocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtDestroyDevice(PVBOXDISPKMT_DEVICE pDevice)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_DESTROYDEVICE DestroyDeviceData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DestroyDeviceData.hDevice = pDevice->hDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pDevice->pAdapter->pCallbacks->pfnD3DKMTDestroyDevice(&DestroyDeviceData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
72774443050856dc9e820b971545ecc67a2d6871vboxsync#ifdef DEBUG_misha
72774443050856dc9e820b971545ecc67a2d6871vboxsync memset(pDevice, 0, sizeof (*pDevice));
72774443050856dc9e820b971545ecc67a2d6871vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtCreateContext(PVBOXDISPKMT_DEVICE pDevice, PVBOXDISPKMT_CONTEXT pContext,
87150caf549846b0edba30c50dabe5092df70b5fvboxsync VBOXWDDM_CONTEXT_TYPE enmType,
87150caf549846b0edba30c50dabe5092df70b5fvboxsync uint32_t crVersionMajor, uint32_t crVersionMinor,
87150caf549846b0edba30c50dabe5092df70b5fvboxsync HANDLE hEvent, uint64_t u64UmInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXWDDM_CREATECONTEXT_INFO Info = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Info.u32IfVersion = 9;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Info.enmType = enmType;
87150caf549846b0edba30c50dabe5092df70b5fvboxsync Info.crVersionMajor = crVersionMajor;
87150caf549846b0edba30c50dabe5092df70b5fvboxsync Info.crVersionMinor = crVersionMinor;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Info.hUmEvent = (uint64_t)hEvent;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Info.u64UmInfo = u64UmInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_CREATECONTEXT ContextData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ContextData.hDevice = pDevice->hDevice;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync ContextData.NodeOrdinal = VBOXWDDM_NODE_ID_3D_KMT;
9cdd4d805ecb43126372f7cf12e4032836cb738avboxsync ContextData.EngineAffinity = VBOXWDDM_ENGINE_ID_3D_KMT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ContextData.pPrivateDriverData = &Info;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ContextData.PrivateDriverDataSize = sizeof (Info);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ContextData.ClientHint = enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL ? D3DKMT_CLIENTHINT_OPENGL : D3DKMT_CLIENTHINT_DX9;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pDevice->pAdapter->pCallbacks->pfnD3DKMTCreateContext(&ContextData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->pDevice = pDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->hContext = ContextData.hContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->pCommandBuffer = ContextData.pCommandBuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->CommandBufferSize = ContextData.CommandBufferSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->pAllocationList = ContextData.pAllocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->AllocationListSize = ContextData.AllocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->pPatchLocationList = ContextData.pPatchLocationList;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pContext->PatchLocationListSize = ContextData.PatchLocationListSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncHRESULT vboxDispKmtDestroyContext(PVBOXDISPKMT_CONTEXT pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DKMT_DESTROYCONTEXT DestroyContextData = {0};
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DestroyContextData.hContext = pContext->hContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = pContext->pDevice->pAdapter->pCallbacks->pfnD3DKMTDestroyContext(&DestroyContextData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!Status);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!Status)
72774443050856dc9e820b971545ecc67a2d6871vboxsync {
72774443050856dc9e820b971545ecc67a2d6871vboxsync#ifdef DEBUG_misha
72774443050856dc9e820b971545ecc67a2d6871vboxsync memset(pContext, 0, sizeof (*pContext));
72774443050856dc9e820b971545ecc67a2d6871vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return S_OK;
72774443050856dc9e820b971545ecc67a2d6871vboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return E_FAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}