int HGSMIBufferProcess (HGSMIAREA *pArea, HGSMICHANNELINFO * pChannelInfo, HGSMIOFFSET offBuffer) { LogFlowFunc(("pArea %p, offBuffer 0x%x\n", pArea, offBuffer)); AssertPtr(pArea); AssertPtr(pChannelInfo); int rc = VERR_GENERAL_FAILURE; // VM_ASSERT_EMT(pIns->pVM); /* Guest has prepared a command description at 'offBuffer'. */ const HGSMIBUFFERHEADER *pHeader = hgsmiVerifyBuffer (pArea, offBuffer); Assert(pHeader); if (pHeader) { /* Pass the command to the appropriate handler registered with this instance. * Start with the handler list head, which is the preallocated HGSMI setup channel. */ HGSMICHANNEL *pChannel = HGSMIChannelFindById (pChannelInfo, pHeader->u8Channel); Assert(pChannel); if (pChannel) { hgsmiBufferProcess (pChannel, pHeader); HGSMI_STRICT_ASSERT(hgsmiVerifyBuffer (pArea, offBuffer) != NULL); rc = VINF_SUCCESS; } else { rc = VERR_INVALID_FUNCTION; } } else { rc = VERR_INVALID_HANDLE; // LogRel(("HGSMI[%s]: ignored invalid guest buffer 0x%08X!!!\n", pIns->pszName, offBuffer)); } return rc; }
/** Process a guest buffer. * * @returns VBox status. * @param pArea Area which supposed to contain the buffer. * @param pChannelInfo The channel pool. * @param offBuffer The buffer location in the area. */ int HGSMIBufferProcess(const HGSMIAREA *pArea, HGSMICHANNELINFO *pChannelInfo, HGSMIOFFSET offBuffer) { LogFlowFunc(("pArea %p, offBuffer 0x%x\n", pArea, offBuffer)); AssertPtrReturn(pArea, VERR_INVALID_PARAMETER); AssertPtrReturn(pChannelInfo, VERR_INVALID_PARAMETER); /* Guest has prepared a command description at 'offBuffer'. */ HGSMIBUFFERCONTEXT bufferContext; int rc = hgsmiVerifyBuffer(pArea, offBuffer, &bufferContext); if (RT_SUCCESS(rc)) { /* Pass the command to the appropriate handler registered with this instance. * Start with the handler list head, which is the preallocated HGSMI setup channel. */ const HGSMICHANNEL *pChannel = HGSMIChannelFindById(pChannelInfo, bufferContext.pHeader->u8Channel); if (pChannel) { const HGSMICHANNELHANDLER *pHandler = &pChannel->handler; if (pHandler->pfnHandler) { pHandler->pfnHandler(pHandler->pvHandler, bufferContext.pHeader->u16ChannelInfo, bufferContext.pvData, bufferContext.cbData); } HGSMI_STRICT_ASSERT(RT_SUCCESS(hgsmiVerifyBuffer(pArea, offBuffer, &bufferContext))); } else { rc = VERR_INVALID_FUNCTION; HGSMI_STRICT_ASSERT_FAILED(); } } return rc; }