Changeset 21511 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Jul 11, 2009 3:23:24 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 49961
- Location:
- trunk/src/VBox/Additions/common/VBoxGuestLib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxCalls.c
r21211 r21511 30 30 #endif 31 31 #include <iprt/time.h> 32 #include <iprt/mem.h> 32 33 #include <iprt/path.h> 33 34 #include <iprt/string.h> … … 463 464 } 464 465 return rc; 466 } 467 468 DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer) 469 { 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); 475 uint32_t iPage; 476 int rc; 477 478 if (RT_UNLIKELY(!pData)) 479 return VERR_NO_TMP_MEMORY; 480 481 VBOX_INIT_CALL(&pData->callInfo, WRITE, pClient); 482 483 pData->root.type = VMMDevHGCMParmType_32bit; 484 pData->root.u.value32 = pMap->root; 485 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); 495 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; 502 503 rc = VbglHGCMCall (pClient->handle, &pData->callInfo, cbData); 504 if (RT_SUCCESS (rc)) 505 { 506 rc = pData->callInfo.result; 507 *pcbBuffer = pData->cb.u.value32; 508 } 509 510 RTMemTmpFree(pData); 511 return rc; 512 465 513 } 466 514 -
trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxCalls.h
r21211 r21511 162 162 DECLVBGL(int) vboxCallRead (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked); 163 163 DECLVBGL(int) vboxCallWrite (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked); 164 DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer); 164 165 165 166 DECLVBGL(int) vboxCallLock (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint64_t cbSize, uint32_t fLock);
Note:
See TracChangeset
for help on using the changeset viewer.