384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync/* $Id$ */
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync/** @file
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * VBox WDDM Display backdoor logger implementation
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync */
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync/*
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * Copyright (C) 2012 Oracle Corporation
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync *
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * available from http://www.virtualbox.org. This file is free software;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * General Public License (GPL) as published by the Free Software
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync */
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync/* We're unable to use standard r3 vbgl-based backdoor logging API because win8 Metro apps
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * can not do CreateFile/Read/Write by default
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * this is why we use miniport escape functionality to issue backdoor log string to the miniport
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * and submit it to host via standard r0 backdoor logging api accordingly */
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _interlockedbittestandset _interlockedbittestandset_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _interlockedbittestandreset _interlockedbittestandreset_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# pragma warning(disable : 4163)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# include <windows.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# pragma warning(default : 4163)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _InterlockedExchange
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _InterlockedExchangeAdd
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _InterlockedCompareExchange
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _InterlockedAddLargeStatistic
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _interlockedbittestandset
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _interlockedbittestandreset
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _interlockedbittestandset64
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# undef _interlockedbittestandreset64
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# else
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# include <windows.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync# endif
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include "VBoxDispMpLogger.h"
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <d3d9types.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <D3dumddi.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <d3dhal.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include "../../common/wddm/VBoxMPIf.h"
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include "VBoxDispKmt.h"
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#define VBOX_VIDEO_LOG_NAME "VBoxDispMpLogger"
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <common/VBoxVideoLog.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <iprt/asm.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <iprt/assert.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <iprt/mem.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <stdio.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsynctypedef enum
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPMPLOGGER_STATE_UNINITIALIZED = 0,
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPMPLOGGER_STATE_INITIALIZING,
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPMPLOGGER_STATE_INITIALIZED,
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPMPLOGGER_STATE_UNINITIALIZING
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync} VBOXDISPMPLOGGER_STATE;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsynctypedef struct VBOXDISPMPLOGGER
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPKMT_CALLBACKS KmtCallbacks;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPMPLOGGER_STATE enmState;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync} VBOXDISPMPLOGGER, *PVBOXDISPMPLOGGER;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncstatic VBOXDISPMPLOGGER g_VBoxDispMpLogger = {0};
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncstatic PVBOXDISPMPLOGGER vboxDispMpLoggerGet()
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (ASMAtomicCmpXchgU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_INITIALIZING, VBOXDISPMPLOGGER_STATE_UNINITIALIZED))
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync HRESULT hr = vboxDispKmtCallbacksInit(&g_VBoxDispMpLogger.KmtCallbacks);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (hr == S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync /* we are on Vista+
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync * check if we can Open Adapter, i.e. WDDM driver is installed */
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPKMT_ADAPTER Adapter;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync hr = vboxDispKmtOpenAdapter(&g_VBoxDispMpLogger.KmtCallbacks, &Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (hr == S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync ASMAtomicWriteU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_INITIALIZED);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync vboxDispKmtCloseAdapter(&Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return &g_VBoxDispMpLogger;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync vboxDispKmtCallbacksTerm(&g_VBoxDispMpLogger.KmtCallbacks);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync else if (ASMAtomicReadU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState) == VBOXDISPMPLOGGER_STATE_INITIALIZED)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return &g_VBoxDispMpLogger;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return NULL;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncVBOXDISPMPLOGGER_DECL(int) VBoxDispMpLoggerInit()
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (!pLogger)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return VERR_NOT_SUPPORTED;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return VINF_SUCCESS;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncVBOXDISPMPLOGGER_DECL(int) VBoxDispMpLoggerTerm()
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (ASMAtomicCmpXchgU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_UNINITIALIZING, VBOXDISPMPLOGGER_STATE_INITIALIZED))
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync vboxDispKmtCallbacksTerm(&g_VBoxDispMpLogger.KmtCallbacks);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync ASMAtomicWriteU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_UNINITIALIZED);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return S_OK;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync else if (ASMAtomicReadU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState) == VBOXDISPMPLOGGER_STATE_UNINITIALIZED)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return S_OK;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return VERR_NOT_SUPPORTED;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncVBOXDISPMPLOGGER_DECL(void) VBoxDispMpLoggerLog(char * szString)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (!pLogger)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPKMT_ADAPTER Adapter;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync HRESULT hr = vboxDispKmtOpenAdapter(&pLogger->KmtCallbacks, &Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (hr == S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync uint32_t cbString = (uint32_t)strlen(szString) + 1;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync uint32_t cbCmd = RT_OFFSETOF(VBOXDISPIFESCAPE_DBGPRINT, aStringBuf[cbString]);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPIFESCAPE_DBGPRINT pCmd = (PVBOXDISPIFESCAPE_DBGPRINT)RTMemAllocZ(cbCmd);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (pCmd)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync pCmd->EscapeHdr.escapeCode = VBOXESC_DBGPRINT;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync memcpy(pCmd->aStringBuf, szString, cbString);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync D3DKMT_ESCAPE EscapeData = {0};
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.hAdapter = Adapter.hAdapter;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync //EscapeData.hDevice = NULL;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync // EscapeData.Flags.HardwareAccess = 1;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.pPrivateDriverData = pCmd;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.PrivateDriverDataSize = cbCmd;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync //EscapeData.hContext = NULL;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync int Status = pLogger->KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (Status)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync RTMemFree(pCmd);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync else
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync hr = vboxDispKmtCloseAdapter(&Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if(hr != S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncVBOXDISPMPLOGGER_DECL(void) VBoxDispMpLoggerLogF(char * szString, ...)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (!pLogger)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync char szBuffer[4096] = {0};
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync va_list pArgList;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync va_start(pArgList, szString);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync _vsnprintf(szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]), szString, pArgList);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync va_end(pArgList);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBoxDispMpLoggerLog(szBuffer);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncstatic void vboxDispMpLoggerDumpBuf(void *pvBuf, uint32_t cbBuf, VBOXDISPIFESCAPE_DBGDUMPBUF_TYPE enmBuf)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (!pLogger)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync return;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync VBOXDISPKMT_ADAPTER Adapter;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync HRESULT hr = vboxDispKmtOpenAdapter(&pLogger->KmtCallbacks, &Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (hr == S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync uint32_t cbCmd = RT_OFFSETOF(VBOXDISPIFESCAPE_DBGDUMPBUF, aBuf[cbBuf]);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync PVBOXDISPIFESCAPE_DBGDUMPBUF pCmd = (PVBOXDISPIFESCAPE_DBGDUMPBUF)RTMemAllocZ(cbCmd);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (pCmd)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync pCmd->EscapeHdr.escapeCode = VBOXESC_DBGDUMPBUF;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync pCmd->enmType = enmBuf;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#ifdef VBOX_WDDM_WOW64
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync pCmd->Flags.WoW64 = 1;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#endif
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync memcpy(pCmd->aBuf, pvBuf, cbBuf);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync D3DKMT_ESCAPE EscapeData = {0};
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.hAdapter = Adapter.hAdapter;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync //EscapeData.hDevice = NULL;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync // EscapeData.Flags.HardwareAccess = 1;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.pPrivateDriverData = pCmd;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync EscapeData.PrivateDriverDataSize = cbCmd;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync //EscapeData.hContext = NULL;
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync int Status = pLogger->KmtCallbacks.pfnD3DKMTEscape(&EscapeData);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if (Status)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync RTMemFree(pCmd);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync else
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync hr = vboxDispKmtCloseAdapter(&Adapter);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync if(hr != S_OK)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync {
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync BP_WARN();
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync }
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsyncVBOXDISPMPLOGGER_DECL(void) VBoxDispMpLoggerDumpD3DCAPS9(struct _D3DCAPS9 *pCaps)
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync{
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync vboxDispMpLoggerDumpBuf(pCaps, sizeof (*pCaps), VBOXDISPIFESCAPE_DBGDUMPBUF_TYPE_D3DCAPS9);
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync}