468
DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer)
470
uint32_t cbToWrite = *pcbBuffer;
471
uint32_t cPages = RT_ALIGN_32((PhysBuffer & PAGE_OFFSET_MASK) + cbToWrite, PAGE_SIZE) >> PAGE_SHIFT;
472
uint32_t cbData = sizeof(VBoxSFWrite) + RT_UOFFSETOF(HGCMPageListInfo, aPages[cPages]);
473
VBoxSFWrite *pData = (VBoxSFWrite *)RTMemTmpAlloc(cbData);
474
HGCMPageListInfo *pPgLst = (HGCMPageListInfo *)(pData + 1);
478
if (RT_UNLIKELY(!pData))
479
return VERR_NO_TMP_MEMORY;
481
VBOX_INIT_CALL(&pData->callInfo, WRITE, pClient);
483
pData->root.type = VMMDevHGCMParmType_32bit;
484
pData->root.u.value32 = pMap->root;
486
pData->handle.type = VMMDevHGCMParmType_64bit;
487
pData->handle.u.value64 = hFile;
488
pData->offset.type = VMMDevHGCMParmType_64bit;
489
pData->offset.u.value64 = offset;
490
pData->cb.type = VMMDevHGCMParmType_32bit;
491
pData->cb.u.value32 = cbToWrite;
492
pData->buffer.type = VMMDevHGCMParmType_PageList;
493
pData->buffer.u.PageList.size = cbToWrite;
494
pData->buffer.u.PageList.offset = sizeof(VBoxSFWrite);
496
pPgLst->flags = VBOX_HGCM_F_PARM_DIRECTION_TO_HOST;
497
pPgLst->offFirstPage = PhysBuffer & PAGE_OFFSET_MASK;
498
pPgLst->cPages = cPages;
499
PhysBuffer &= ~(RTCCPHYS)PAGE_OFFSET_MASK;
500
for (iPage = 0; iPage < cPages; iPage++, PhysBuffer += PAGE_SIZE)
501
pPgLst->aPages[iPage] = PhysBuffer;
503
rc = VbglHGCMCall (pClient->handle, &pData->callInfo, cbData);
506
rc = pData->callInfo.result;
507
*pcbBuffer = pData->cb.u.value32;
468
515
DECLVBGL(int) vboxCallFlush(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile)
470
517
int rc = VINF_SUCCESS;