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; }
/* simple handle -> value table API */ NTSTATUS vboxWddmHTableCreate(PVBOXWDDM_HTABLE pTbl, uint32_t cSize) { memset(pTbl, 0, sizeof (*pTbl)); pTbl->paData = (PVOID*)vboxWddmMemAllocZero(sizeof (pTbl->paData[0]) * cSize); if (pTbl->paData) { pTbl->cSize = cSize; return STATUS_SUCCESS; } return STATUS_NO_MEMORY; }
PVBOXWDDM_SWAPCHAIN vboxWddmSwapchainCreate() { PVBOXWDDM_SWAPCHAIN pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmMemAllocZero(sizeof (VBOXWDDM_SWAPCHAIN)); Assert(pSwapchain); if (pSwapchain) { InitializeListHead(&pSwapchain->AllocList); pSwapchain->enmState = VBOXWDDM_OBJSTATE_TYPE_INITIALIZED; pSwapchain->cRefs = 1; } return pSwapchain; }
static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheGetAllocDr(PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache) { PVBOXMP_CRSHGSMICON_BUFDR pBufDr = (PVBOXMP_CRSHGSMICON_BUFDR)ASMAtomicXchgPtr((void * volatile *)&pCache->pBufDr, NULL); if (!pBufDr) { pBufDr = (PVBOXMP_CRSHGSMICON_BUFDR)vboxWddmMemAllocZero(sizeof (*pBufDr)); if (!pBufDr) { WARN(("vboxWddmMemAllocZero failed!")); return NULL; } } return pBufDr; }
UNICODE_STRING* vboxWddmVGuidGet(PVBOXMP_DEVEXT pDevExt) { if (pDevExt->VideoGuid.Buffer) return &pDevExt->VideoGuid; Assert(KeGetCurrentIrql() == PASSIVE_LEVEL); WCHAR VideoGuidBuf[512]; ULONG cbVideoGuidBuf = sizeof (VideoGuidBuf); NTSTATUS Status = vboxWddmRegQueryVideoGuidString(cbVideoGuidBuf, VideoGuidBuf, &cbVideoGuidBuf); Assert(Status == STATUS_SUCCESS); if (Status == STATUS_SUCCESS) { PWCHAR pBuf = (PWCHAR)vboxWddmMemAllocZero(cbVideoGuidBuf); Assert(pBuf); if (pBuf) { memcpy(pBuf, VideoGuidBuf, cbVideoGuidBuf); RtlInitUnicodeString(&pDevExt->VideoGuid, pBuf); return &pDevExt->VideoGuid; } } return NULL; }
DECLEXPORT(void *) crAlloc( unsigned int nbytes ) { return vboxWddmMemAllocZero(nbytes); }
VOID vboxWddmVGuidFree(PVBOXMP_DEVEXT pDevExt) { if (pDevExt->VideoGuid.Buffer) { vboxWddmMemFree(pDevExt->VideoGuid.Buffer); pDevExt->VideoGuid.Buffer = NULL; } } /* mm */ NTSTATUS vboxMmInit(PVBOXWDDM_MM pMm, UINT cPages) { UINT cbBuffer = VBOXWDDM_ROUNDBOUND(cPages, 8) >> 3; cbBuffer = VBOXWDDM_ROUNDBOUND(cbBuffer, 4); PULONG pBuf = (PULONG)vboxWddmMemAllocZero(cbBuffer); if (!pBuf) { Assert(0); return STATUS_NO_MEMORY; } RtlInitializeBitMap(&pMm->BitMap, pBuf, cPages); pMm->cPages = cPages; pMm->cAllocs = 0; pMm->pBuffer = pBuf; return STATUS_SUCCESS; } ULONG vboxMmAlloc(PVBOXWDDM_MM pMm, UINT cPages) { ULONG iPage = RtlFindClearBitsAndSet(&pMm->BitMap, cPages, 0);