static DECLCALLBACK(VOID) vboxMpCrShgsmiTransportSendReadAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pDdiCmd, PVOID pvContext) { RT_NOREF(pDevExt); /* we should be called from our DPC routine */ Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext; PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_DDI_CMD(pDdiCmd); VBOXVDMACMD RT_UNTRUSTED_VOLATILE_HOST *pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); VBOXVDMACMD_CHROMIUM_CMD RT_UNTRUSTED_VOLATILE_HOST *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); const UINT cBuffers = 2; Assert(pBody->cBuffers == cBuffers); VBOXMP_CRHGSMICMD_READ RT_UNTRUSTED_VOLATILE_HOST *pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_READ); CRVBOXHGSMIREAD RT_UNTRUSTED_VOLATILE_HOST *pCmd = &pWrData->Cmd; VBOXVDMACMD_CHROMIUM_BUFFER RT_UNTRUSTED_VOLATILE_HOST *pBufCmd = &pBody->aBuffers[0]; Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIREAD)); CRVBOXHGSMIREAD RT_UNTRUSTED_VOLATILE_HOST *pWr = (CRVBOXHGSMIREAD*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer); PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION)pBufCmd->u64GuestData; VBOXVDMACMD_CHROMIUM_BUFFER RT_UNTRUSTED_VOLATILE_HOST *pRxBuf = &pBody->aBuffers[1]; VBOXMP_CRSHGSMICON_BUFDR *pWbDr = (PVBOXMP_CRSHGSMICON_BUFDR)pRxBuf->u64GuestData; void RT_UNTRUSTED_VOLATILE_HOST *pvRx = NULL; uint32_t cbRx = 0; int rc = pDr->rc; if (RT_SUCCESS(rc)) { rc = pWr->hdr.result; if (RT_SUCCESS(rc)) { cbRx = pCmd->cbBuffer; if (cbRx) pvRx = pWbDr->pvBuf; } else { WARN(("CRVBOXHGSMIREAD failed, rc %d", rc)); } } else { WARN(("dma command buffer failed rc %d!", rc)); } if (pfnCompletion) { void RT_UNTRUSTED_VOLATILE_HOST *pvCtx = VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof(VBOXMP_CRHGSMICMD_READ), void); pfnCompletion(pCon, rc, pvRx, cbRx, pvCtx); } vboxMpCrShgsmiBufCacheFree(pCon, &pCon->WbDrCache, pWbDr); }
static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAlloc(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer) { PVBOXMP_CRSHGSMICON_BUFDR pBufDr = vboxMpCrShgsmiBufCacheGetAllocDr(pCache); int rc = vboxMpCrShgsmiBufCacheBufReinit(pCon, pCache, pBufDr, cbBuffer); if (RT_SUCCESS(rc)) return pBufDr; WARN(("vboxMpCrShgsmiBufCacheBufReinit failed, rc %d", rc)); vboxMpCrShgsmiBufCacheFree(pCon, pCache, pBufDr); return NULL; }
static void vboxMpCrShgsmiBufCacheTerm(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache) { if (pCache->pBufDr) vboxMpCrShgsmiBufCacheFree(pCon, pCache, pCache->pBufDr); }