HRESULT vboxUhgsmiKmtDestroy(PVBOXUHGSMI_PRIVATE_KMT pHgsmi) { HRESULT hr = vboxDispKmtDestroyContext(&pHgsmi->Context); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtDestroyDevice(&pHgsmi->Device); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtCloseAdapter(&pHgsmi->Adapter); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtCallbacksTerm(&pHgsmi->Callbacks); Assert(hr == S_OK); if (hr == S_OK) { #ifdef DEBUG_misha memset(pHgsmi, 0, sizeof (*pHgsmi)); #endif return S_OK; } } } } return hr; }
static PVBOXDISPMPLOGGER vboxDispMpLoggerGet() { if (ASMAtomicCmpXchgU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_INITIALIZING, VBOXDISPMPLOGGER_STATE_UNINITIALIZED)) { HRESULT hr = vboxDispKmtCallbacksInit(&g_VBoxDispMpLogger.KmtCallbacks); if (hr == S_OK) { /* we are on Vista+ * check if we can Open Adapter, i.e. WDDM driver is installed */ VBOXDISPKMT_ADAPTER Adapter; hr = vboxDispKmtOpenAdapter(&g_VBoxDispMpLogger.KmtCallbacks, &Adapter); if (hr == S_OK) { ASMAtomicWriteU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState, VBOXDISPMPLOGGER_STATE_INITIALIZED); vboxDispKmtCloseAdapter(&Adapter); return &g_VBoxDispMpLogger; } vboxDispKmtCallbacksTerm(&g_VBoxDispMpLogger.KmtCallbacks); } } else if (ASMAtomicReadU32((volatile uint32_t *)&g_VBoxDispMpLogger.enmState) == VBOXDISPMPLOGGER_STATE_INITIALIZED) { return &g_VBoxDispMpLogger; } return NULL; }
static void vboxDispMpLoggerDumpBuf(void *pvBuf, uint32_t cbBuf, VBOXDISPIFESCAPE_DBGDUMPBUF_TYPE enmBuf) { PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet(); if (!pLogger) return; VBOXDISPKMT_ADAPTER Adapter; HRESULT hr = vboxDispKmtOpenAdapter(&pLogger->KmtCallbacks, &Adapter); if (hr == S_OK) { uint32_t cbCmd = RT_OFFSETOF(VBOXDISPIFESCAPE_DBGDUMPBUF, aBuf[cbBuf]); PVBOXDISPIFESCAPE_DBGDUMPBUF pCmd = (PVBOXDISPIFESCAPE_DBGDUMPBUF)RTMemAllocZ(cbCmd); if (pCmd) { pCmd->EscapeHdr.escapeCode = VBOXESC_DBGDUMPBUF; pCmd->enmType = enmBuf; #ifdef VBOX_WDDM_WOW64 pCmd->Flags.WoW64 = 1; #endif memcpy(pCmd->aBuf, pvBuf, cbBuf); D3DKMT_ESCAPE EscapeData = {0}; EscapeData.hAdapter = Adapter.hAdapter; //EscapeData.hDevice = NULL; EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; // EscapeData.Flags.HardwareAccess = 1; EscapeData.pPrivateDriverData = pCmd; EscapeData.PrivateDriverDataSize = cbCmd; //EscapeData.hContext = NULL; int Status = pLogger->KmtCallbacks.pfnD3DKMTEscape(&EscapeData); if (Status) { BP_WARN(); } RTMemFree(pCmd); } else { BP_WARN(); } hr = vboxDispKmtCloseAdapter(&Adapter); if(hr != S_OK) { BP_WARN(); } } }
VBOXDISPMPLOGGER_DECL(void) VBoxDispMpLoggerLog(const char *pszString) { PVBOXDISPMPLOGGER pLogger = vboxDispMpLoggerGet(); if (!pLogger) return; VBOXDISPKMT_ADAPTER Adapter; HRESULT hr = vboxDispKmtOpenAdapter(&pLogger->KmtCallbacks, &Adapter); if (hr == S_OK) { uint32_t cbString = (uint32_t)strlen(pszString) + 1; uint32_t cbCmd = RT_OFFSETOF(VBOXDISPIFESCAPE_DBGPRINT, aStringBuf[cbString]); PVBOXDISPIFESCAPE_DBGPRINT pCmd = (PVBOXDISPIFESCAPE_DBGPRINT)RTMemAllocZ(cbCmd); if (pCmd) { pCmd->EscapeHdr.escapeCode = VBOXESC_DBGPRINT; memcpy(pCmd->aStringBuf, pszString, cbString); D3DKMT_ESCAPE EscapeData = {0}; EscapeData.hAdapter = Adapter.hAdapter; //EscapeData.hDevice = NULL; EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; // EscapeData.Flags.HardwareAccess = 1; EscapeData.pPrivateDriverData = pCmd; EscapeData.PrivateDriverDataSize = cbCmd; //EscapeData.hContext = NULL; int Status = pLogger->KmtCallbacks.pfnD3DKMTEscape(&EscapeData); if (Status) { BP_WARN(); } RTMemFree(pCmd); } else { BP_WARN(); } hr = vboxDispKmtCloseAdapter(&Adapter); if(hr != S_OK) { BP_WARN(); } } }
static HRESULT vboxUhgsmiKmtEngineCreate(PVBOXUHGSMI_PRIVATE_KMT pHgsmi, BOOL bD3D) { HRESULT hr = vboxDispKmtCallbacksInit(&pHgsmi->Callbacks); if (hr == S_OK) { hr = vboxDispKmtOpenAdapter(&pHgsmi->Callbacks, &pHgsmi->Adapter); if (hr == S_OK) { hr = vboxDispKmtCreateDevice(&pHgsmi->Adapter, &pHgsmi->Device); if (hr == S_OK) { hr = vboxDispKmtCreateContext(&pHgsmi->Device, &pHgsmi->Context, bD3D ? VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_3D : VBOXWDDM_CONTEXT_TYPE_CUSTOM_UHGSMI_GL, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, NULL, 0); if (hr == S_OK) { return S_OK; } else { WARN(("vboxDispKmtCreateContext failed, hr(0x%x)", hr)); } vboxDispKmtDestroyDevice(&pHgsmi->Device); } else { WARN(("vboxDispKmtCreateDevice failed, hr(0x%x)", hr)); } vboxDispKmtCloseAdapter(&pHgsmi->Adapter); } else { // WARN(("vboxDispKmtOpenAdapter failed, hr(0x%x)", hr)); } vboxDispKmtCallbacksTerm(&pHgsmi->Callbacks); } else { WARN(("vboxDispKmtCallbacksInit failed, hr(0x%x)", hr)); } return hr; }
DECLCALLBACK(void) VBoxDispMpLoggerLog(const char *pszString) { D3DKMTFUNCTIONS const *d3dkmt = D3DKMTFunctions(); if (d3dkmt->pfnD3DKMTEscape == NULL) return; D3DKMT_HANDLE hAdapter; NTSTATUS Status = vboxDispKmtOpenAdapter(&hAdapter); Assert(Status == STATUS_SUCCESS); if (Status == 0) { uint32_t cbString = (uint32_t)strlen(pszString) + 1; uint32_t cbCmd = RT_UOFFSETOF_DYN(VBOXDISPIFESCAPE_DBGPRINT, aStringBuf[cbString]); PVBOXDISPIFESCAPE_DBGPRINT pCmd = (PVBOXDISPIFESCAPE_DBGPRINT)malloc(cbCmd); Assert(pCmd); if (pCmd) { pCmd->EscapeHdr.escapeCode = VBOXESC_DBGPRINT; pCmd->EscapeHdr.u32CmdSpecific = 0; memcpy(pCmd->aStringBuf, pszString, cbString); D3DKMT_ESCAPE EscapeData; memset(&EscapeData, 0, sizeof(EscapeData)); EscapeData.hAdapter = hAdapter; // EscapeData.hDevice = NULL; EscapeData.Type = D3DKMT_ESCAPE_DRIVERPRIVATE; // EscapeData.Flags.HardwareAccess = 0; EscapeData.pPrivateDriverData = pCmd; EscapeData.PrivateDriverDataSize = cbCmd; // EscapeData.hContext = NULL; Status = d3dkmt->pfnD3DKMTEscape(&EscapeData); Assert(Status == STATUS_SUCCESS); free(pCmd); } Status = vboxDispKmtCloseAdapter(hAdapter); Assert(Status == STATUS_SUCCESS); } }
HRESULT vboxUhgsmiKmtDestroy(PVBOXUHGSMI_PRIVATE_KMT pHgsmi) { HRESULT hr = vboxDispKmtDestroyContext(&pHgsmi->Context); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtDestroyDevice(&pHgsmi->Device); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtCloseAdapter(&pHgsmi->Adapter); Assert(hr == S_OK); if (hr == S_OK) { hr = vboxDispKmtCallbacksTerm(&pHgsmi->Callbacks); Assert(hr == S_OK); if (hr == S_OK) return S_OK; } } } return hr; }