NTSTATUS vboxWddmHTableRealloc(PVBOXWDDM_HTABLE pTbl, uint32_t cNewSize) { Assert(cNewSize > pTbl->cSize); if (cNewSize > pTbl->cSize) { PVOID *pvNewData = (PVOID*)vboxWddmMemAllocZero(sizeof (pTbl->paData[0]) * cNewSize); if (!pvNewData) { WARN(("vboxWddmMemAllocZero failed for size (%d)", sizeof (pTbl->paData[0]) * cNewSize)); return STATUS_NO_MEMORY; } memcpy(pvNewData, pTbl->paData, sizeof (pTbl->paData[0]) * pTbl->cSize); vboxWddmMemFree(pTbl->paData); pTbl->iNext2Search = pTbl->cSize; pTbl->cSize = cNewSize; pTbl->paData = pvNewData; return STATUS_SUCCESS; } else if (cNewSize >= pTbl->cData) { AssertFailed(); return STATUS_NOT_IMPLEMENTED; } return STATUS_INVALID_PARAMETER; }
VOID vboxWddmHTableDestroy(PVBOXWDDM_HTABLE pTbl) { if (!pTbl->paData) return; vboxWddmMemFree(pTbl->paData); }
VOID vboxWddmVGuidFree(PVBOXMP_DEVEXT pDevExt) { if (pDevExt->VideoGuid.Buffer) { vboxWddmMemFree(pDevExt->VideoGuid.Buffer); pDevExt->VideoGuid.Buffer = NULL; } }
static void vboxMpCrShgsmiBufCacheFree(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr) { if (ASMAtomicCmpXchgPtr(&pCache->pBufDr, pDr, NULL)) return; /* the value is already cached, free the current one */ VBoxMpCrShgsmiTransportBufFree(pCon, pDr->pvBuf); vboxWddmMemFree(pDr); }
DECLINLINE(VOID) vboxWddmSwapchainRelease(PVBOXWDDM_SWAPCHAIN pSwapchain) { const uint32_t cRefs = ASMAtomicDecU32(&pSwapchain->cRefs); Assert(cRefs < UINT32_MAX/2); if (!cRefs) { vboxWddmMemFree(pSwapchain); } }
//extern DECLEXPORT(void *) crCalloc( unsigned int nbytes ); //extern DECLEXPORT(void) crRealloc( void **ptr, unsigned int bytes ); DECLEXPORT(void) crFree( void *ptr ) { vboxWddmMemFree(ptr); }
/* process the swapchain info passed from user-mode display driver & synchronizes the driver state with it */ NTSTATUS vboxWddmSwapchainCtxEscape(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXDISPIFESCAPE_SWAPCHAININFO pSwapchainInfo, UINT cbSize) { Assert((cbSize >= RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[0]))); if (cbSize < RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[0])) return STATUS_INVALID_PARAMETER; Assert(cbSize >= RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[pSwapchainInfo->SwapchainInfo.cAllocs])); if (cbSize < RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[pSwapchainInfo->SwapchainInfo.cAllocs])) return STATUS_INVALID_PARAMETER; PVBOXWDDM_SWAPCHAIN pSwapchain = NULL; PVBOXWDDM_ALLOCATION *apAlloc = NULL; Assert(KeGetCurrentIrql() == PASSIVE_LEVEL); NTSTATUS Status = STATUS_SUCCESS; do { if (pSwapchainInfo->SwapchainInfo.cAllocs) { apAlloc = (PVBOXWDDM_ALLOCATION *)vboxWddmMemAlloc(sizeof (PVBOXWDDM_ALLOCATION) * pSwapchainInfo->SwapchainInfo.cAllocs); Assert(apAlloc); if (!apAlloc) { Status = STATUS_NO_MEMORY; break; } for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) { DXGKARGCB_GETHANDLEDATA GhData; GhData.hObject = pSwapchainInfo->SwapchainInfo.ahAllocs[i]; GhData.Type = DXGK_HANDLE_ALLOCATION; GhData.Flags.Value = 0; PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData); Assert(pAlloc); if (!pAlloc) { Status = STATUS_INVALID_PARAMETER; break; } apAlloc[i] = pAlloc; } if (!NT_SUCCESS(Status)) break; } if (pSwapchainInfo->SwapchainInfo.hSwapchainKm) { ExAcquireFastMutex(&pDevExt->ContextMutex); pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableGet(&pContext->Swapchains, (VBOXWDDM_HANDLE)pSwapchainInfo->SwapchainInfo.hSwapchainKm); Assert(pSwapchain); if (!pSwapchain) { ExReleaseFastMutex(&pDevExt->ContextMutex); Status = STATUS_INVALID_PARAMETER; break; } Assert(pSwapchain->hSwapchainKm == pSwapchainInfo->SwapchainInfo.hSwapchainKm); Assert(pSwapchain->pContext == pContext); if (pSwapchain->pContext != pContext) { ExReleaseFastMutex(&pDevExt->ContextMutex); Status = STATUS_INVALID_PARAMETER; break; } } else if (pSwapchainInfo->SwapchainInfo.cAllocs) { pSwapchain = vboxWddmSwapchainCreate(); if (!pSwapchain) { Status = STATUS_NO_MEMORY; break; } ExAcquireFastMutex(&pDevExt->ContextMutex); BOOLEAN bRc = vboxWddmSwapchainCtxAddLocked(pDevExt, pContext, pSwapchain); Assert(bRc); } else { Status = STATUS_INVALID_PARAMETER; break; } memset(&pSwapchain->ViewRect, 0, sizeof (pSwapchain->ViewRect)); if (pSwapchain->pLastReportedRects) { vboxVideoCmCmdRelease(pSwapchain->pLastReportedRects); pSwapchain->pLastReportedRects = NULL; } vboxWddmSwapchainAllocRemoveAll(pDevExt, pSwapchain); if (pSwapchainInfo->SwapchainInfo.cAllocs) { for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) { vboxWddmSwapchainAllocAdd(pDevExt, pSwapchain, apAlloc[i]); } pSwapchain->hSwapchainUm = pSwapchainInfo->SwapchainInfo.hSwapchainUm; } else { vboxWddmSwapchainCtxRemoveLocked(pDevExt, pContext, pSwapchain); } ExReleaseFastMutex(&pDevExt->ContextMutex); if (pSwapchainInfo->SwapchainInfo.cAllocs) { Assert(pSwapchain->pContext); Assert(pSwapchain->hSwapchainKm); pSwapchainInfo->SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm; } else { vboxWddmSwapchainDestroy(pDevExt, pSwapchain); pSwapchainInfo->SwapchainInfo.hSwapchainKm = 0; } Assert(Status == STATUS_SUCCESS); } while (0); /* cleanup */ if (apAlloc) vboxWddmMemFree(apAlloc); return Status; }