diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2014-03-26 19:21:20 +0000 |
---|---|---|
committer | <> | 2014-05-08 15:03:54 +0000 |
commit | fb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch) | |
tree | c2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/Additions/common/VBoxGuestLib | |
parent | 58ed4748338f9466599adfc8a9171280ed99e23f (diff) | |
download | VirtualBox-master.tar.gz |
Imported from /home/lorry/working-area/delta_VirtualBox/VirtualBox-4.3.10.tar.bz2.HEADVirtualBox-4.3.10master
Diffstat (limited to 'src/VBox/Additions/common/VBoxGuestLib')
31 files changed, 1425 insertions, 330 deletions
diff --git a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp index ea1fe187..cae7a8f3 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp @@ -1,10 +1,10 @@ -/* $Revision: 71271 $ */ +/* $Revision: 87431 $ */ /** @file * VBoxGuestLibR0 - Generic VMMDev request management. */ /* - * Copyright (C) 2006-2009 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -69,20 +69,24 @@ DECLVBGL(int) VbglGRVerify (const VMMDevRequestHeader *pReq, size_t cbReq) return VINF_SUCCESS; } - /* This can be a variable size request. Check the request type and limit the size + /* + * This can be a variable size request. Check the request type and limit the size * to VMMDEV_MAX_VMMDEVREQ_SIZE, which is max size supported by the host. + * + * Note: Keep this list sorted for easier human lookup! */ - if ( pReq->requestType == VMMDevReq_LogString - || pReq->requestType == VMMDevReq_VideoSetVisibleRegion - || pReq->requestType == VMMDevReq_SetPointerShape + if ( pReq->requestType == VMMDevReq_ChangeMemBalloon #ifdef VBOX_WITH_64_BITS_GUESTS || pReq->requestType == VMMDevReq_HGCMCall32 || pReq->requestType == VMMDevReq_HGCMCall64 #else || pReq->requestType == VMMDevReq_HGCMCall #endif /* VBOX_WITH_64_BITS_GUESTS */ - || pReq->requestType == VMMDevReq_ChangeMemBalloon - || pReq->requestType == VMMDevReq_RegisterSharedModule) + || pReq->requestType == VMMDevReq_RegisterSharedModule + || pReq->requestType == VMMDevReq_ReportGuestUserState + || pReq->requestType == VMMDevReq_LogString + || pReq->requestType == VMMDevReq_SetPointerShape + || pReq->requestType == VMMDevReq_VideoSetVisibleRegion) { if (cbReq > VMMDEV_MAX_VMMDEVREQ_SIZE) { diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp index f6aa77b4..5521c142 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp @@ -1,4 +1,4 @@ -/* $Revision: 76853 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLib - Host-Guest Communication Manager. * @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp index fa2703aa..efd8d76b 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp @@ -1,10 +1,10 @@ -/* $Revision: 77449 $ */ +/* $Revision: 88366 $ */ /** @file * VBoxGuestLib - Host-Guest Communication Manager internal functions, implemented by VBoxGuest */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -49,9 +49,10 @@ #define VBGLR0_MAX_HGCM_USER_PARM (24*_1M) /** The max parameter buffer size for a kernel request. */ #define VBGLR0_MAX_HGCM_KERNEL_PARM (16*_1M) -#ifdef RT_OS_LINUX +#if defined(RT_OS_LINUX) || defined(RT_OS_DARWIN) /** Linux needs to use bounce buffers since RTR0MemObjLockUser has unwanted - * side effects. */ + * side effects. + * Darwin 32bit & 64bit also needs this because of 4GB/4GB user/kernel space. */ # define USE_BOUNCE_BUFFERS #endif diff --git a/src/VBox/Additions/common/VBoxGuestLib/Init.cpp b/src/VBox/Additions/common/VBoxGuestLib/Init.cpp index c21ce6cd..5298ffe7 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/Init.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/Init.cpp @@ -1,10 +1,10 @@ -/* $Revision: 79609 $ */ +/* $Revision: 89635 $ */ /** @file * VBoxGuestLibR0 - Library initialization. */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -83,7 +83,7 @@ static void vbglQueryDriverInfo (void) int rc = VINF_SUCCESS; rc = RTSemMutexRequest(g_vbgldata.mutexDriverInit, RT_INDEFINITE_WAIT); - + if (RT_FAILURE(rc)) return; @@ -266,7 +266,7 @@ DECLVBGL(int) VbglInit (void) { vbglTerminateCommon (); } - + } return rc; diff --git a/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk b/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk index ed8c689e..244fc2b4 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk +++ b/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2006-2012 Oracle Corporation +# Copyright (C) 2006-2013 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -105,6 +105,7 @@ VBoxGuestR3Lib_SOURCES = \ VBoxGuestR3LibCpuHotPlug.cpp \ VBoxGuestR3LibCredentials.cpp \ VBoxGuestR3LibEvent.cpp \ + VBoxGuestR3LibGuestUser.cpp \ VBoxGuestR3LibGR.cpp \ VBoxGuestR3LibHostChannel.cpp \ VBoxGuestR3LibLog.cpp \ diff --git a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp index 51f1281d..1f1d24f5 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp @@ -1,10 +1,10 @@ -/* $Revision: 67140 $ */ +/* $Revision: 85891 $ */ /** @file * VBoxGuestLibR0 - Physical memory heap. */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -100,7 +100,7 @@ struct _VBGLPHYSHEAPCHUNK uint32_t cbSize; /* Physical address of the chunk */ - RTCCPHYS physAddr; + uint32_t physAddr; /* Number of allocated blocks in the chunk */ int32_t cAllocatedBlocks; @@ -318,9 +318,11 @@ static VBGLPHYSHEAPBLOCK *vbglPhysHeapChunkAlloc (uint32_t cbSize) return NULL; } + AssertRelease(physAddr < _4G && physAddr + cbSize <= _4G); + pChunk->u32Signature = VBGL_PH_CHUNKSIGNATURE; pChunk->cbSize = cbSize; - pChunk->physAddr = physAddr; + pChunk->physAddr = (uint32_t)physAddr; pChunk->cAllocatedBlocks = 0; pChunk->pNext = g_vbgldata.pChunkHead; pChunk->pPrev = NULL; @@ -493,9 +495,9 @@ DECLVBGL(void *) VbglPhysHeapAlloc (uint32_t cbSize) return vbglPhysHeapBlock2Data (pBlock); } -DECLVBGL(RTCCPHYS) VbglPhysHeapGetPhysAddr (void *p) +DECLVBGL(uint32_t) VbglPhysHeapGetPhysAddr (void *p) { - RTCCPHYS physAddr = 0; + uint32_t physAddr = 0; VBGLPHYSHEAPBLOCK *pBlock = vbglPhysHeapData2Block (p); if (pBlock) @@ -504,7 +506,7 @@ DECLVBGL(RTCCPHYS) VbglPhysHeapGetPhysAddr (void *p) ("pBlock = %p, pBlock->fu32Flags = %08X\n", pBlock, pBlock->fu32Flags)); if (pBlock->fu32Flags & VBGL_PH_BF_ALLOCATED) - physAddr = pBlock->pChunk->physAddr + ((char *)p - (char *)pBlock->pChunk); + physAddr = pBlock->pChunk->physAddr + (uint32_t)((uintptr_t)p - (uintptr_t)pBlock->pChunk); } return physAddr; diff --git a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp index c50f287c..008c5e14 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp @@ -1,10 +1,10 @@ -/* $Revision: 78886 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLibR0 - IDC with VBoxGuest and HGCM helpers. */ /* - * Copyright (C) 2006-2009 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -309,7 +309,13 @@ int vbglDriverIOCtl (VBGLDRIVER *pDriver, uint32_t u32Function, void *pvData, ui if (rc != STATUS_SUCCESS) Log(("vbglDriverIOCtl: ntstatus=%x\n", rc)); - return NT_SUCCESS(rc)? VINF_SUCCESS: VERR_VBGL_IOCTL_FAILED; + if (NT_SUCCESS(rc)) + return VINF_SUCCESS; + if (rc == STATUS_INVALID_PARAMETER) + return VERR_INVALID_PARAMETER; + if (rc == STATUS_INVALID_BUFFER_SIZE) + return VERR_OUT_OF_RANGE; + return VERR_VBGL_IOCTL_FAILED; # elif defined (RT_OS_OS2) if ( pDriver->u32Session diff --git a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h index 9e78e404..68603647 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h +++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h @@ -1,10 +1,10 @@ -/* $Revision: 78884 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLibR0 - System dependent helpers internal header. */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h index 98cf339c..6fe015da 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h +++ b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2012 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -138,20 +138,13 @@ extern VBGLDATA g_vbgldata; * * @param a_fLocked For the windows shared folders workarounds. * - * @remarks Disable the PageList feature for 64-bit Windows, because shared - * folders do not work, if this is enabled. This should be reenabled - * again when the problem is fixed. - * @remarks Disabled the PageList feature for 32-bit Windows, see xTracker - * ticket 6096 and public ticket 10290. Hopefully this is the same - * issue as on Windows/AMD64. + * @remarks Disabled the PageList feature for locked memory on Windows, + * because a new MDL is created by VBGL to get the page addresses + * and the pages from the MDL are marked as dirty when they should not. */ #if defined(RT_OS_WINDOWS) -# ifdef RT_ARCH_AMD64 -# define VBGLR0_CAN_USE_PHYS_PAGE_LIST(a_fLocked) ( 0 ) -# else -# define VBGLR0_CAN_USE_PHYS_PAGE_LIST(a_fLocked) \ - ( !(a_fLocked) && (g_vbgldata.hostVersion.features & VMMDEV_HVF_HGCM_PHYS_PAGE_LIST) ) -# endif +# define VBGLR0_CAN_USE_PHYS_PAGE_LIST(a_fLocked) \ + ( !(a_fLocked) && (g_vbgldata.hostVersion.features & VMMDEV_HVF_HGCM_PHYS_PAGE_LIST) ) #else # define VBGLR0_CAN_USE_PHYS_PAGE_LIST(a_fLocked) \ ( !!(g_vbgldata.hostVersion.features & VMMDEV_HVF_HGCM_PHYS_PAGE_LIST) ) diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBGLR3Internal.h b/src/VBox/Additions/common/VBoxGuestLib/VBGLR3Internal.h index a36e8129..463c13dc 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBGLR3Internal.h +++ b/src/VBox/Additions/common/VBoxGuestLib/VBGLR3Internal.h @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h index 0046f8ea..fccd343e 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp index 3fa03d20..893b4718 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp @@ -91,9 +91,18 @@ DECLVBGL(int) vboxCrCtlConConnect(HVBOXCRCTL hCtl, uint32_t *pu32ClientID) RTStrCopy(info.Loc.u.host.achName, sizeof (info.Loc.u.host.achName), "VBoxSharedCrOpenGL"); rc = vbglDriverIOCtl (&hCtl->driver, VBOXGUEST_IOCTL_HGCM_CONNECT, &info, sizeof (info)); if (RT_SUCCESS(rc)) - *pu32ClientID = info.u32ClientID; - else - *pu32ClientID = 0; + { + rc = info.result; + if (RT_SUCCESS(rc)) + { + Assert(info.u32ClientID); + *pu32ClientID = info.u32ClientID; + return rc; + } + } + + Assert(RT_FAILURE(rc)); + *pu32ClientID = 0; return rc; } diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c index a792acaf..3ecb4388 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c @@ -1,10 +1,10 @@ -/* $Revision: 76380 $ */ +/* $Revision: 84251 $ */ /** @file * VBoxGuestR0LibSharedFolders - Ring 0 Shared Folders calls. */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -27,11 +27,12 @@ /* Entire file is ifdef'ed with !VBGL_VBOXGUEST */ #ifndef VBGL_VBOXGUEST +/******************************************************************************* +* Header Files * +*******************************************************************************/ #define LOG_GROUP LOG_GROUP_SHARED_FOLDERS - #ifdef RT_OS_LINUX # include "VBoxGuestR0LibSharedFolders.h" -# define DbgPrint RTAssertMsg2Weak #else # include "VBoxGuestR0LibSharedFolders.h" #endif @@ -41,6 +42,10 @@ #include <iprt/path.h> #include <iprt/string.h> + +/******************************************************************************* +* Defined Constants And Macros * +*******************************************************************************/ #define SHFL_CPARMS_SET_UTF8 0 #define SHFL_CPARMS_SET_SYMLINKS 0 @@ -52,9 +57,6 @@ (a)->u32Function = SHFL_FN_##b; \ (a)->cParms = SHFL_CPARMS_##b -#ifndef RT_OS_WINDOWS -# define RtlZeroMemory(a, b) memset (a, 0, b) -#endif DECLVBGL(int) vboxInit (void) @@ -72,14 +74,12 @@ DECLVBGL(void) vboxUninit (void) DECLVBGL(int) vboxConnect (PVBSFCLIENT pClient) { - int rc = VINF_SUCCESS; - + int rc; VBoxGuestHGCMConnectInfo data; - RtlZeroMemory (&data, sizeof (VBoxGuestHGCMConnectInfo)); - pClient->handle = NULL; + RT_ZERO(data); data.result = VINF_SUCCESS; data.Loc.type = VMMDevHGCMLoc_LocalHost_Existing; strcpy (data.Loc.u.host.achName, "VBoxSharedFolders"); @@ -111,8 +111,7 @@ DECLVBGL(void) vboxDisconnect (PVBSFCLIENT pClient) if (pClient->handle == NULL) return; /* not connected */ - RtlZeroMemory (&data, sizeof (VBoxGuestHGCMDisconnectInfo)); - + RT_ZERO(data); data.result = VINF_SUCCESS; data.u32ClientID = pClient->ulClientID; @@ -125,7 +124,7 @@ DECLVBGL(void) vboxDisconnect (PVBSFCLIENT pClient) } DECLVBGL(int) vboxCallQueryMappings (PVBSFCLIENT pClient, SHFLMAPPING paMappings[], - uint32_t *pcMappings) + uint32_t *pcMappings) { int rc = VINF_SUCCESS; @@ -442,6 +441,52 @@ DECLVBGL(int) vboxCallRead(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, return rc; } +DECLVBGL(int) VbglR0SharedFolderReadPageList(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, + uint64_t offset, uint32_t *pcbBuffer, + uint16_t offFirstPage, uint16_t cPages, RTGCPHYS64 *paPages) +{ + uint32_t cbToRead = *pcbBuffer; + uint32_t cbData = sizeof(VBoxSFRead) + RT_UOFFSETOF(HGCMPageListInfo, aPages[cPages]); + VBoxSFRead *pData = (VBoxSFRead *)RTMemTmpAlloc(cbData); + HGCMPageListInfo *pPgLst = (HGCMPageListInfo *)(pData + 1); + uint16_t iPage; + int rc; + + if (RT_UNLIKELY(!pData)) + return VERR_NO_TMP_MEMORY; + + VBOX_INIT_CALL(&pData->callInfo, READ, pClient); + + pData->root.type = VMMDevHGCMParmType_32bit; + pData->root.u.value32 = pMap->root; + + pData->handle.type = VMMDevHGCMParmType_64bit; + pData->handle.u.value64 = hFile; + pData->offset.type = VMMDevHGCMParmType_64bit; + pData->offset.u.value64 = offset; + pData->cb.type = VMMDevHGCMParmType_32bit; + pData->cb.u.value32 = cbToRead; + pData->buffer.type = VMMDevHGCMParmType_PageList; + pData->buffer.u.PageList.size = cbToRead; + pData->buffer.u.PageList.offset = sizeof(VBoxSFRead); + + pPgLst->flags = VBOX_HGCM_F_PARM_DIRECTION_FROM_HOST; + pPgLst->offFirstPage = offFirstPage; + pPgLst->cPages = cPages; + for (iPage = 0; iPage < cPages; iPage++) + pPgLst->aPages[iPage] = paPages[iPage]; + + rc = VbglHGCMCall(pClient->handle, &pData->callInfo, cbData); + if (RT_SUCCESS (rc)) + { + rc = pData->callInfo.result; + *pcbBuffer = pData->cb.u.value32; + } + + RTMemTmpFree(pData); + return rc; +} + DECLVBGL(int) vboxCallWrite(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked) { @@ -524,6 +569,52 @@ DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHAND } +DECLVBGL(int) VbglR0SharedFolderWritePageList(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, + uint64_t offset, uint32_t *pcbBuffer, + uint16_t offFirstPage, uint16_t cPages, RTGCPHYS64 *paPages) +{ + uint32_t cbToWrite = *pcbBuffer; + uint32_t cbData = sizeof(VBoxSFWrite) + RT_UOFFSETOF(HGCMPageListInfo, aPages[cPages]); + VBoxSFWrite *pData = (VBoxSFWrite *)RTMemTmpAlloc(cbData); + HGCMPageListInfo *pPgLst = (HGCMPageListInfo *)(pData + 1); + uint16_t iPage; + int rc; + + if (RT_UNLIKELY(!pData)) + return VERR_NO_TMP_MEMORY; + + VBOX_INIT_CALL(&pData->callInfo, WRITE, pClient); + + pData->root.type = VMMDevHGCMParmType_32bit; + pData->root.u.value32 = pMap->root; + + pData->handle.type = VMMDevHGCMParmType_64bit; + pData->handle.u.value64 = hFile; + pData->offset.type = VMMDevHGCMParmType_64bit; + pData->offset.u.value64 = offset; + pData->cb.type = VMMDevHGCMParmType_32bit; + pData->cb.u.value32 = cbToWrite; + pData->buffer.type = VMMDevHGCMParmType_PageList; + pData->buffer.u.PageList.size = cbToWrite; + pData->buffer.u.PageList.offset = sizeof(VBoxSFWrite); + + pPgLst->flags = VBOX_HGCM_F_PARM_DIRECTION_TO_HOST; + pPgLst->offFirstPage = offFirstPage; + pPgLst->cPages = cPages; + for (iPage = 0; iPage < cPages; iPage++) + pPgLst->aPages[iPage] = paPages[iPage]; + + rc = VbglHGCMCall (pClient->handle, &pData->callInfo, cbData); + if (RT_SUCCESS (rc)) + { + rc = pData->callInfo.result; + *pcbBuffer = pData->cb.u.value32; + } + + RTMemTmpFree(pData); + return rc; +} + DECLVBGL(int) vboxCallFlush(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile) { int rc = VINF_SUCCESS; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h index 3947a13d..5e5c9576 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -172,8 +172,14 @@ DECLVBGL(int) vboxCallRename (PVBSFCLIENT pClient, PVBSFMAP pMap, PSHFLSTRING pS DECLVBGL(int) vboxCallFlush (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile); DECLVBGL(int) vboxCallRead (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked); +DECLVBGL(int) VbglR0SharedFolderReadPageList(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, + uint64_t offset, uint32_t *pcbBuffer, + uint16_t offFirstPage, uint16_t cPages, RTGCPHYS64 *paPages); DECLVBGL(int) vboxCallWrite (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer, bool fLocked); DECLVBGL(int) VbglR0SfWritePhysCont(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint32_t *pcbBuffer, RTCCPHYS PhysBuffer); +DECLVBGL(int) VbglR0SharedFolderWritePageList(PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, + uint64_t offset, uint32_t *pcbBuffer, + uint16_t offFirstPage, uint16_t cPages, RTGCPHYS64 *paPages); DECLVBGL(int) vboxCallLock (PVBSFCLIENT pClient, PVBSFMAP pMap, SHFLHANDLE hFile, uint64_t offset, uint64_t cbSize, uint32_t fLock); diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp index 32ccf4c4..80e5b877 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -36,14 +36,20 @@ # define INCL_ERRORS # include <os2.h> -#elif defined(RT_OS_FREEBSD) \ +#elif defined(RT_OS_DARWIN) \ + || defined(RT_OS_FREEBSD) \ + || defined(RT_OS_HAIKU) \ || defined(RT_OS_LINUX) \ || defined(RT_OS_SOLARIS) # include <sys/types.h> # include <sys/stat.h> -# if defined(RT_OS_LINUX) /** @todo check this on solaris+freebsd as well. */ +# if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) /** @todo check this on solaris+freebsd as well. */ # include <sys/ioctl.h> # endif +# if defined(RT_OS_DARWIN) +# include <mach/mach_port.h> +# include <IOKit/IOKitLib.h> +# endif # include <errno.h> # include <unistd.h> #endif @@ -85,6 +91,10 @@ static RTFILE g_File = NIL_RTFILE; * inside a single process space. */ static uint32_t volatile g_cInits = 0; +#ifdef RT_OS_DARWIN +/** I/O Kit connection handle. */ +static io_connect_t g_uConnection = 0; +#endif @@ -189,6 +199,40 @@ static int vbglR3Init(const char *pszDeviceName) } g_File = (RTFILE)hf; +#elif defined(RT_OS_DARWIN) + /* + * Darwin is kind of special we need to engage the device via I/O first + * before we open it via the BSD device node. + */ + mach_port_t MasterPort; + kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &MasterPort); + if (kr != kIOReturnSuccess) + return VERR_GENERAL_FAILURE; + + CFDictionaryRef ClassToMatch = IOServiceMatching("org_virtualbox_VBoxGuest"); + if (!ClassToMatch) + return VERR_GENERAL_FAILURE; + + io_service_t ServiceObject = IOServiceGetMatchingService(kIOMasterPortDefault, ClassToMatch); + if (!ServiceObject) + return VERR_NOT_FOUND; + + io_connect_t uConnection; + kr = IOServiceOpen(ServiceObject, mach_task_self(), 0, &uConnection); + IOObjectRelease(ServiceObject); + if (kr != kIOReturnSuccess) + return VERR_OPEN_FAILED; + + RTFILE hFile; + int rc = RTFileOpen(&hFile, pszDeviceName, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); + if (RT_FAILURE(rc)) + { + IOServiceClose(uConnection); + return rc; + } + g_File = hFile; + g_uConnection = uConnection; + #elif defined(VBOX_VBGLR3_XFREE86) int File = xf86open(pszDeviceName, XF86_O_RDWR); if (File == -1) @@ -197,7 +241,7 @@ static int vbglR3Init(const char *pszDeviceName) #else - /* The default implementation. (linux, solaris, freebsd) */ + /* The default implementation. (linux, solaris, freebsd, haiku) */ RTFILE File; int rc = RTFileOpen(&File, pszDeviceName, RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); if (RT_FAILURE(rc)) @@ -262,13 +306,22 @@ VBGLR3DECL(void) VbglR3Term(void) Assert(fRc); NOREF(fRc); # elif defined(RT_OS_OS2) - RTFILE File = g_File; g_File = NIL_RTFILE; AssertReturnVoid(File != NIL_RTFILE); APIRET rc = DosClose((uintptr_t)File); AssertMsg(!rc, ("%ld\n", rc)); +#elif defined(RT_OS_DARWIN) + io_connect_t uConnection = g_uConnection; + RTFILE hFile = g_File; + g_uConnection = 0; + g_File = NIL_RTFILE; + kern_return_t kr = IOServiceClose(uConnection); + AssertMsg(kr == kIOReturnSuccess, ("%#x (%d)\n", kr, kr)); + int rc = RTFileClose(hFile); + AssertRC(rc); + # else /* The IPRT case. */ RTFILE File = g_File; g_File = NIL_RTFILE; @@ -357,7 +410,7 @@ int vbglR3DoIOCtl(unsigned iFunction, void *pvData, size_t cbData) } return VINF_SUCCESS; -#elif defined(RT_OS_LINUX) +#elif defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) # ifdef VBOX_VBGLR3_XFREE86 int rc = xf86ioctl((int)g_File, iFunction, pvData); # else @@ -380,6 +433,20 @@ int vbglR3DoIOCtl(unsigned iFunction, void *pvData, size_t cbData) NOREF(cbData); return rc; +#elif defined(RT_OS_HAIKU) + /* The ioctl hook in Haiku does take the len parameter when specified, + * so just use it. */ + int rc = ioctl((int)g_File, iFunction, pvData, cbData); + if (RT_LIKELY(rc == 0)) + return VINF_SUCCESS; + + /* Positive values are negated VBox error status codes. */ + if (rc > 0) + rc = -rc; + else + rc = RTErrConvertFromErrno(errno); + return rc; + #elif defined(VBOX_VBGLR3_XFREE86) /* PORTME - This is preferred over the RTFileIOCtl variant below, just be careful with the (int). */ /** @todo test status code passing! */ diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibClipboard.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibClipboard.cpp index 2c13b0aa..045d4670 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibClipboard.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibClipboard.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibCredentials.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibCredentials.cpp index a25515e1..7809a420 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibCredentials.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibCredentials.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2009 Oracle Corporation + * Copyright (C) 2009-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp index a314e522..c6ab6545 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2009 Oracle Corporation + * Copyright (C) 2007-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -28,10 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ -#if defined(RT_OS_DARWIN) -# error "PORTME" - -#elif defined(RT_OS_OS2) +#if defined(RT_OS_OS2) # define INCL_BASE # define INCL_ERRORS # include <os2.h> @@ -73,10 +70,7 @@ */ VBGLR3DECL(int) VbglR3Daemonize(bool fNoChDir, bool fNoClose) { -#if defined(RT_OS_DARWIN) -# error "PORTME" - -#elif defined(RT_OS_OS2) +#if defined(RT_OS_OS2) PPIB pPib; PTIB pTib; DosGetInfoBlocks(&pTib, &pPib); diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGR.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGR.cpp index b8a3fa7f..a5e16501 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGR.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGR.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp index 514d60c9..2bd554c4 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010-2011 Oracle Corporation + * Copyright (C) 2010-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -49,10 +49,10 @@ using namespace guestControl; * Connects to the guest control service. * * @returns VBox status code - * @param pu32ClientId Where to put the client id on success. The client id - * must be passed to all the other calls to the service. + * @param puClientId Where to put The client ID on success. The client ID + * must be passed to all the other calls to the service. */ -VBGLR3DECL(int) VbglR3GuestCtrlConnect(uint32_t *pu32ClientId) +VBGLR3DECL(int) VbglR3GuestCtrlConnect(uint32_t *puClientId) { VBoxGuestHGCMConnectInfo Info; Info.result = VERR_WRONG_ORDER; @@ -66,7 +66,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlConnect(uint32_t *pu32ClientId) { rc = Info.result; if (RT_SUCCESS(rc)) - *pu32ClientId = Info.u32ClientID; + *puClientId = Info.u32ClientID; } return rc; } @@ -76,13 +76,13 @@ VBGLR3DECL(int) VbglR3GuestCtrlConnect(uint32_t *pu32ClientId) * Disconnect from the guest control service. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). */ -VBGLR3DECL(int) VbglR3GuestCtrlDisconnect(uint32_t u32ClientId) +VBGLR3DECL(int) VbglR3GuestCtrlDisconnect(uint32_t uClientId) { VBoxGuestHGCMDisconnectInfo Info; Info.result = VERR_WRONG_ORDER; - Info.u32ClientID = u32ClientId; + Info.u32ClientID = uClientId; int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_DISCONNECT, &Info, sizeof(Info)); if (RT_SUCCESS(rc)) @@ -96,22 +96,22 @@ VBGLR3DECL(int) VbglR3GuestCtrlDisconnect(uint32_t u32ClientId) * This will block until a message becomes available. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). * @param puMsg Where to store the message id. * @param puNumParms Where to store the number of parameters which will be received * in a second call to the host. */ -VBGLR3DECL(int) VbglR3GuestCtrlWaitForHostMsg(uint32_t u32ClientId, uint32_t *puMsg, uint32_t *puNumParms) +VBGLR3DECL(int) VbglR3GuestCtrlMsgWaitFor(uint32_t uClientId, uint32_t *puMsg, uint32_t *puNumParms) { AssertPtrReturn(puMsg, VERR_INVALID_POINTER); AssertPtrReturn(puNumParms, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgType Msg; + HGCMMsgCmdWaitFor Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; /* Tell the host we want our next command. */ - Msg.hdr.cParms = 2; /* Just peek for the next message! */ + Msg.hdr.u32ClientID = uClientId; + Msg.hdr.u32Function = GUEST_MSG_WAIT; /* Tell the host we want our next command. */ + Msg.hdr.cParms = 2; /* Just peek for the next message! */ VbglHGCMParmUInt32Set(&Msg.msg, 0); VbglHGCMParmUInt32Set(&Msg.num_parms, 0); @@ -131,17 +131,139 @@ VBGLR3DECL(int) VbglR3GuestCtrlWaitForHostMsg(uint32_t u32ClientId, uint32_t *pu /** + * Asks the host guest control service to set a command filter to this + * client so that it only will receive certain commands in the future. + * The filter(s) are a bitmask for the context IDs, served from the host. + * + * @return IPRT status code. + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). + * @param uValue The value to filter messages for. + * @param uMaskAdd Filter mask to add. + * @param uMaskRemove Filter mask to remove. + */ +VBGLR3DECL(int) VbglR3GuestCtrlMsgFilterSet(uint32_t uClientId, uint32_t uValue, + uint32_t uMaskAdd, uint32_t uMaskRemove) +{ + HGCMMsgCmdFilterSet Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = uClientId; + Msg.hdr.u32Function = GUEST_MSG_FILTER_SET; /* Tell the host we want to set a filter. */ + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.value, uValue); + VbglHGCMParmUInt32Set(&Msg.mask_add, uMaskAdd); + VbglHGCMParmUInt32Set(&Msg.mask_remove, uMaskRemove); + VbglHGCMParmUInt32Set(&Msg.flags, 0 /* Flags, unused */); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + rc = Msg.hdr.result; + return rc; +} + + +/** + * Disables a previously set message filter. + * + * @return IPRT status code. + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). + */ +VBGLR3DECL(int) VbglR3GuestCtrlMsgFilterUnset(uint32_t uClientId) +{ + HGCMMsgCmdFilterUnset Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = uClientId; + Msg.hdr.u32Function = GUEST_MSG_FILTER_UNSET; /* Tell the host we want to unset the filter. */ + Msg.hdr.cParms = 1; + + VbglHGCMParmUInt32Set(&Msg.flags, 0 /* Flags, unused */); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + rc = Msg.hdr.result; + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlMsgReply(PVBGLR3GUESTCTRLCMDCTX pCtx, + int rc) +{ + return VbglR3GuestCtrlMsgReplyEx(pCtx, rc, 0 /* uType */, + NULL /* pvPayload */, 0 /* cbPayload */); +} + + +VBGLR3DECL(int) VbglR3GuestCtrlMsgReplyEx(PVBGLR3GUESTCTRLCMDCTX pCtx, + int rc, uint32_t uType, + void *pvPayload, uint32_t cbPayload) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + /* Everything else is optional. */ + + HGCMMsgCmdReply Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_REPLY; + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.rc, (uint32_t)rc); /* int vs. uint32_t */ + VbglHGCMParmUInt32Set(&Msg.type, uType); + VbglHGCMParmPtrSet(&Msg.payload, pvPayload, cbPayload); + + int rc2 = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc3 = Msg.hdr.result; + if (RT_FAILURE(rc3)) + rc2 = rc3; + } + return rc2; +} + + +/** + * Tells the host service to skip the current message returned by + * VbglR3GuestCtrlMsgWaitFor(). + * + * @return IPRT status code. + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). + */ +VBGLR3DECL(int) VbglR3GuestCtrlMsgSkip(uint32_t uClientId) +{ + HGCMMsgCmdSkip Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = uClientId; + Msg.hdr.u32Function = GUEST_MSG_SKIP; /* Tell the host we want to skip + the current assigned command. */ + Msg.hdr.cParms = 1; + + VbglHGCMParmUInt32Set(&Msg.flags, 0 /* Flags, unused */); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + rc = Msg.hdr.result; + + return rc; +} + + +/** * Asks the host to cancel (release) all pending waits which were deferred. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). + * @param uClientId The client ID returned by VbglR3GuestCtrlConnect(). */ -VBGLR3DECL(int) VbglR3GuestCtrlCancelPendingWaits(uint32_t u32ClientId) +VBGLR3DECL(int) VbglR3GuestCtrlCancelPendingWaits(uint32_t uClientId) { - VBoxGuestCtrlHGCMMsgCancelPendingWaits Msg; + HGCMMsgCancelPendingWaits Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; + Msg.hdr.u32ClientID = uClientId; Msg.hdr.u32Function = GUEST_CANCEL_PENDING_WAITS; Msg.hdr.cParms = 0; @@ -157,28 +279,238 @@ VBGLR3DECL(int) VbglR3GuestCtrlCancelPendingWaits(uint32_t u32ClientId) /** + * Asks a specific guest session to close. + * + * @return IPRT status code. + * @param pCtx Host context. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlSessionClose(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t uFlags) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 2, VERR_INVALID_PARAMETER); + + HGCMMsgSessionClose Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_SESSION_CLOSE; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.flags, uFlags); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlSessionNotify(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uType, uint32_t uResult) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMMsgSessionNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_SESSION_NOTIFY; + Msg.hdr.cParms = 3; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, uType); + VbglHGCMParmUInt32Set(&Msg.result, uResult); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +/** + * Retrieves the request to create a new guest session. + * + * @return IPRT status code. + * @param pCtx Host context. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlSessionGetOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puProtocol, + char *pszUser, uint32_t cbUser, + char *pszPassword, uint32_t cbPassword, + char *pszDomain, uint32_t cbDomain, + uint32_t *puFlags, uint32_t *puSessionID) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 6, VERR_INVALID_PARAMETER); + + AssertPtrReturn(puProtocol, VERR_INVALID_POINTER); + AssertPtrReturn(pszUser, VERR_INVALID_POINTER); + AssertPtrReturn(pszPassword, VERR_INVALID_POINTER); + AssertPtrReturn(pszDomain, VERR_INVALID_POINTER); + AssertPtrReturn(puFlags, VERR_INVALID_POINTER); + + HGCMMsgSessionOpen Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmUInt32Set(&Msg.protocol, 0); + VbglHGCMParmPtrSet(&Msg.username, pszUser, cbUser); + VbglHGCMParmPtrSet(&Msg.password, pszPassword, cbPassword); + VbglHGCMParmPtrSet(&Msg.domain, pszDomain, cbDomain); + VbglHGCMParmUInt32Set(&Msg.flags, 0); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + { + rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.protocol.GetUInt32(puProtocol); + Msg.flags.GetUInt32(puFlags); + + if (puSessionID) + *puSessionID = VBOX_GUESTCTRL_CONTEXTID_GET_SESSION(pCtx->uContextID); + } + } + + return rc; +} + + +/** + * Retrieves the request to terminate an existing guest session. + * + * @return IPRT status code. + * @param pCtx Host context. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlSessionGetClose(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puFlags, uint32_t *puSessionID) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 2, VERR_INVALID_PARAMETER); + + AssertPtrReturn(puFlags, VERR_INVALID_POINTER); + + HGCMMsgSessionClose Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmUInt32Set(&Msg.flags, 0); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + { + rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.flags.GetUInt32(puFlags); + + if (puSessionID) + *puSessionID = VBOX_GUESTCTRL_CONTEXTID_GET_SESSION(pCtx->uContextID); + } + } + + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlPathGetRename(PVBGLR3GUESTCTRLCMDCTX pCtx, + char *pszSource, uint32_t cbSource, + char *pszDest, uint32_t cbDest, + uint32_t *puFlags) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER); + + AssertPtrReturn(pszSource, VERR_INVALID_POINTER); + AssertReturn(cbSource, VERR_INVALID_PARAMETER); + AssertPtrReturn(pszDest, VERR_INVALID_POINTER); + AssertReturn(cbDest, VERR_INVALID_PARAMETER); + AssertPtrReturn(puFlags, VERR_INVALID_POINTER); + + HGCMMsgPathRename Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmPtrSet(&Msg.source, pszSource, cbSource); + VbglHGCMParmPtrSet(&Msg.dest, pszDest, cbDest); + VbglHGCMParmUInt32Set(&Msg.flags, 0); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + { + rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.flags.GetUInt32(puFlags); + } + } + return rc; +} + + +/** * Allocates and gets host data, based on the message id. * * This will block until data becomes available. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). - * @param uNumParms ** @todo Docs! + ** @todo Move the parameters in an own struct! */ -VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdExec(uint32_t u32ClientId, uint32_t cParms, - uint32_t *puContext, - char *pszCmd, uint32_t cbCmd, - uint32_t *puFlags, - char *pszArgs, uint32_t cbArgs, uint32_t *pcArgs, - char *pszEnv, uint32_t *pcbEnv, uint32_t *pcEnvVars, - char *pszUser, uint32_t cbUser, - char *pszPassword, uint32_t cbPassword, - uint32_t *pcMsTimeLimit) -{ - AssertReturn(cParms == 11, VERR_INVALID_PARAMETER); - - AssertPtrReturn(puContext, VERR_INVALID_POINTER); +VBGLR3DECL(int) VbglR3GuestCtrlProcGetStart(PVBGLR3GUESTCTRLCMDCTX pCtx, + char *pszCmd, uint32_t cbCmd, + uint32_t *puFlags, + char *pszArgs, uint32_t cbArgs, uint32_t *pcArgs, + char *pszEnv, uint32_t *pcbEnv, uint32_t *pcEnvVars, + char *pszUser, uint32_t cbUser, + char *pszPassword, uint32_t cbPassword, + uint32_t *puTimeoutMS, + uint32_t *puPriority, + uint64_t *puAffinity, uint32_t cbAffinity, uint32_t *pcAffinity) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertPtrReturn(pszCmd, VERR_INVALID_POINTER); AssertPtrReturn(puFlags, VERR_INVALID_POINTER); AssertPtrReturn(pszArgs, VERR_INVALID_POINTER); @@ -186,16 +518,14 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdExec(uint32_t u32ClientId, uint AssertPtrReturn(pszEnv, VERR_INVALID_POINTER); AssertPtrReturn(pcbEnv, VERR_INVALID_POINTER); AssertPtrReturn(pcEnvVars, VERR_INVALID_POINTER); - AssertPtrReturn(pszUser, VERR_INVALID_POINTER); - AssertPtrReturn(pszPassword, VERR_INVALID_POINTER); - AssertPtrReturn(pcMsTimeLimit, VERR_INVALID_POINTER); + AssertPtrReturn(puTimeoutMS, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgExecCmd Msg; + HGCMMsgProcExec Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 11; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmPtrSet(&Msg.cmd, pszCmd, cbCmd); @@ -205,9 +535,27 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdExec(uint32_t u32ClientId, uint VbglHGCMParmUInt32Set(&Msg.num_env, 0); VbglHGCMParmUInt32Set(&Msg.cb_env, 0); VbglHGCMParmPtrSet(&Msg.env, pszEnv, *pcbEnv); - VbglHGCMParmPtrSet(&Msg.username, pszUser, cbUser); - VbglHGCMParmPtrSet(&Msg.password, pszPassword, cbPassword); - VbglHGCMParmUInt32Set(&Msg.timeout, 0); + if (pCtx->uProtocol < 2) + { + AssertPtrReturn(pszUser, VERR_INVALID_POINTER); + AssertReturn(cbUser, VERR_INVALID_PARAMETER); + AssertPtrReturn(pszPassword, VERR_INVALID_POINTER); + AssertReturn(pszPassword, VERR_INVALID_PARAMETER); + + VbglHGCMParmPtrSet(&Msg.u.v1.username, pszUser, cbUser); + VbglHGCMParmPtrSet(&Msg.u.v1.password, pszPassword, cbPassword); + VbglHGCMParmUInt32Set(&Msg.u.v1.timeout, 0); + } + else + { + AssertPtrReturn(puAffinity, VERR_INVALID_POINTER); + AssertReturn(cbAffinity, VERR_INVALID_PARAMETER); + + VbglHGCMParmUInt32Set(&Msg.u.v2.timeout, 0); + VbglHGCMParmUInt32Set(&Msg.u.v2.priority, 0); + VbglHGCMParmUInt32Set(&Msg.u.v2.num_affinity, 0); + VbglHGCMParmPtrSet(&Msg.u.v2.affinity, puAffinity, cbAffinity); + } int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) @@ -219,12 +567,21 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdExec(uint32_t u32ClientId, uint } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.flags.GetUInt32(puFlags); Msg.num_args.GetUInt32(pcArgs); Msg.num_env.GetUInt32(pcEnvVars); Msg.cb_env.GetUInt32(pcbEnv); - Msg.timeout.GetUInt32(pcMsTimeLimit); + if (pCtx->uProtocol < 2) + { + Msg.u.v1.timeout.GetUInt32(puTimeoutMS); + } + else + { + Msg.u.v2.timeout.GetUInt32(puTimeoutMS); + Msg.u.v2.priority.GetUInt32(puPriority); + Msg.u.v2.num_affinity.GetUInt32(pcAffinity); + } } } return rc; @@ -237,27 +594,24 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdExec(uint32_t u32ClientId, uint * This will block until data becomes available. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). - * @param cParms ** @todo Docs! */ -VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdOutput(uint32_t u32ClientId, uint32_t cParms, - uint32_t *puContext, uint32_t *puPID, - uint32_t *puHandle, uint32_t *puFlags) +VBGLR3DECL(int) VbglR3GuestCtrlProcGetOutput(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puPID, uint32_t *puHandle, uint32_t *puFlags) { - AssertReturn(cParms == 4, VERR_INVALID_PARAMETER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); AssertPtrReturn(puPID, VERR_INVALID_POINTER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); AssertPtrReturn(puFlags, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgExecOut Msg; + HGCMMsgProcOutput Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 4; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.pid, 0); @@ -274,7 +628,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdOutput(uint32_t u32ClientId, ui } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.pid.GetUInt32(puPID); Msg.handle.GetUInt32(puHandle); Msg.flags.GetUInt32(puFlags); @@ -291,30 +645,27 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdOutput(uint32_t u32ClientId, ui * This will block until data becomes available. * * @returns VBox status code. - * @param u32ClientId The client id returned by VbglR3GuestCtrlConnect(). - * @param cParms ** @todo Docs! */ -VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdInput(uint32_t u32ClientId, uint32_t cParms, - uint32_t *puContext, uint32_t *puPID, - uint32_t *puFlags, - void *pvData, uint32_t cbData, - uint32_t *pcbSize) +VBGLR3DECL(int) VbglR3GuestCtrlProcGetInput(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puPID, uint32_t *puFlags, + void *pvData, uint32_t cbData, + uint32_t *pcbSize) { - AssertReturn(cParms == 5, VERR_INVALID_PARAMETER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 5, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); AssertPtrReturn(puPID, VERR_INVALID_POINTER); AssertPtrReturn(puFlags, VERR_INVALID_POINTER); AssertPtrReturn(pvData, VERR_INVALID_POINTER); AssertPtrReturn(pcbSize, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgExecIn Msg; + HGCMMsgProcInput Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 5; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.pid, 0); @@ -332,7 +683,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdInput(uint32_t u32ClientId, uin } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.pid.GetUInt32(puPID); Msg.flags.GetUInt32(puFlags); Msg.size.GetUInt32(pcbSize); @@ -342,151 +693,156 @@ VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdInput(uint32_t u32ClientId, uin } -/** - * Reports the process status (along with some other stuff) to the host. - * - * @returns VBox status code. - ** @todo Docs! - */ -VBGLR3DECL(int) VbglR3GuestCtrlExecReportStatus(uint32_t u32ClientId, - uint32_t u32Context, - uint32_t u32PID, - uint32_t u32Status, - uint32_t u32Flags, - void *pvData, - uint32_t cbData) +VBGLR3DECL(int) VbglR3GuestCtrlDirGetRemove(PVBGLR3GUESTCTRLCMDCTX pCtx, + char *pszPath, uint32_t cbPath, + uint32_t *puFlags) { - VBoxGuestCtrlHGCMMsgExecStatus Msg; + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 3, VERR_INVALID_PARAMETER); - Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_EXEC_SEND_STATUS; - Msg.hdr.cParms = 5; + AssertPtrReturn(pszPath, VERR_INVALID_POINTER); + AssertReturn(cbPath, VERR_INVALID_PARAMETER); + AssertPtrReturn(puFlags, VERR_INVALID_POINTER); - VbglHGCMParmUInt32Set(&Msg.context, u32Context); - VbglHGCMParmUInt32Set(&Msg.pid, u32PID); - VbglHGCMParmUInt32Set(&Msg.status, u32Status); - VbglHGCMParmUInt32Set(&Msg.flags, u32Flags); - VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); + HGCMMsgDirRemove Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmPtrSet(&Msg.path, pszPath, cbPath); + VbglHGCMParmUInt32Set(&Msg.flags, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) { int rc2 = Msg.hdr.result; if (RT_FAILURE(rc2)) + { rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.flags.GetUInt32(puFlags); + } } return rc; } -/** - * Sends output (from stdout/stderr) from a running process. - * - * @returns VBox status code. - ** @todo Docs! - */ -VBGLR3DECL(int) VbglR3GuestCtrlExecSendOut(uint32_t u32ClientId, - uint32_t u32Context, - uint32_t u32PID, - uint32_t u32Handle, - uint32_t u32Flags, - void *pvData, - uint32_t cbData) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, + char *pszFileName, uint32_t cbFileName, + char *pszAccess, uint32_t cbAccess, + char *pszDisposition, uint32_t cbDisposition, + char *pszSharing, uint32_t cbSharing, + uint32_t *puCreationMode, + uint64_t *puOffset) { - VBoxGuestCtrlHGCMMsgExecOut Msg; + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + AssertReturn(pCtx->uNumParms == 7, VERR_INVALID_PARAMETER); - Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_EXEC_SEND_OUTPUT; - Msg.hdr.cParms = 5; + AssertPtrReturn(pszFileName, VERR_INVALID_POINTER); + AssertReturn(cbFileName, VERR_INVALID_PARAMETER); + AssertPtrReturn(pszAccess, VERR_INVALID_POINTER); + AssertReturn(cbAccess, VERR_INVALID_PARAMETER); + AssertPtrReturn(pszDisposition, VERR_INVALID_POINTER); + AssertReturn(cbDisposition, VERR_INVALID_PARAMETER); + AssertPtrReturn(pszSharing, VERR_INVALID_POINTER); + AssertReturn(cbSharing, VERR_INVALID_PARAMETER); + AssertPtrReturn(puCreationMode, VERR_INVALID_POINTER); + AssertPtrReturn(puOffset, VERR_INVALID_POINTER); - VbglHGCMParmUInt32Set(&Msg.context, u32Context); - VbglHGCMParmUInt32Set(&Msg.pid, u32PID); - VbglHGCMParmUInt32Set(&Msg.handle, u32Handle); - VbglHGCMParmUInt32Set(&Msg.flags, u32Flags); - VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); + HGCMMsgFileOpen Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmPtrSet(&Msg.filename, pszFileName, cbFileName); + VbglHGCMParmPtrSet(&Msg.openmode, pszAccess, cbAccess); + VbglHGCMParmPtrSet(&Msg.disposition, pszDisposition, cbDisposition); + VbglHGCMParmPtrSet(&Msg.sharing, pszSharing, cbSharing); + VbglHGCMParmUInt32Set(&Msg.creationmode, 0); + VbglHGCMParmUInt64Set(&Msg.offset, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) { int rc2 = Msg.hdr.result; if (RT_FAILURE(rc2)) + { rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.creationmode.GetUInt32(puCreationMode); + Msg.offset.GetUInt64(puOffset); + } } return rc; } -/** - * Reports back the input status to the host. - * - * @returns VBox status code. - ** @todo Docs! - */ -VBGLR3DECL(int) VbglR3GuestCtrlExecReportStatusIn(uint32_t u32ClientId, - uint32_t u32Context, - uint32_t u32PID, - uint32_t u32Status, - uint32_t u32Flags, - uint32_t cbWritten) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetClose(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle) { - VBoxGuestCtrlHGCMMsgExecStatusIn Msg; + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); - Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = u32ClientId; - Msg.hdr.u32Function = GUEST_EXEC_SEND_INPUT_STATUS; - Msg.hdr.cParms = 5; + AssertReturn(pCtx->uNumParms == 2, VERR_INVALID_PARAMETER); + AssertPtrReturn(puHandle, VERR_INVALID_POINTER); - VbglHGCMParmUInt32Set(&Msg.context, u32Context); - VbglHGCMParmUInt32Set(&Msg.pid, u32PID); - VbglHGCMParmUInt32Set(&Msg.status, u32Status); - VbglHGCMParmUInt32Set(&Msg.flags, u32Flags); - VbglHGCMParmUInt32Set(&Msg.written, cbWritten); + HGCMMsgFileClose Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmUInt32Set(&Msg.handle, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) { int rc2 = Msg.hdr.result; if (RT_FAILURE(rc2)) + { rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.handle.GetUInt32(puHandle); + } } return rc; } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdOpen(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - char *pszFileName, uint32_t cbFileName, - char *pszOpenMode, uint32_t cbOpenMode, - char *pszDisposition, uint32_t cbDisposition, - uint32_t *puCreationMode, - uint64_t *puOffset) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetRead(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puHandle, uint32_t *puToRead) { - AssertReturn(cParms == 6, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); - AssertPtrReturn(pszFileName, VERR_INVALID_POINTER); - AssertReturn(cbFileName, VERR_INVALID_PARAMETER); - AssertPtrReturn(pszOpenMode, VERR_INVALID_POINTER); - AssertReturn(cbOpenMode, VERR_INVALID_PARAMETER); - AssertPtrReturn(pszDisposition, VERR_INVALID_POINTER); - AssertReturn(cbDisposition, VERR_INVALID_PARAMETER); - AssertPtrReturn(puCreationMode, VERR_INVALID_POINTER); - AssertPtrReturn(puOffset, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 3, VERR_INVALID_PARAMETER); + AssertPtrReturn(puHandle, VERR_INVALID_POINTER); + AssertPtrReturn(puToRead, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileOpen Msg; + HGCMMsgFileRead Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 6; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); - VbglHGCMParmPtrSet(&Msg.filename, pszFileName, cbFileName); - VbglHGCMParmPtrSet(&Msg.openmode, pszOpenMode, cbOpenMode); - VbglHGCMParmPtrSet(&Msg.disposition, pszDisposition, cbDisposition); - VbglHGCMParmUInt32Set(&Msg.creationmode, 0); - VbglHGCMParmUInt64Set(&Msg.offset, 0); + VbglHGCMParmUInt32Set(&Msg.handle, 0); + VbglHGCMParmUInt32Set(&Msg.size, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) @@ -498,32 +854,35 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdOpen(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); - Msg.creationmode.GetUInt32(puCreationMode); - Msg.offset.GetUInt64(puOffset); + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.handle.GetUInt32(puHandle); + Msg.size.GetUInt32(puToRead); } } return rc; } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdClose(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - uint32_t *puHandle) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetReadAt(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puHandle, uint32_t *puToRead, uint64_t *puOffset) { - AssertReturn(cParms == 2, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); + AssertPtrReturn(puToRead, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileClose Msg; + HGCMMsgFileReadAt Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 2; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.handle, 0); + VbglHGCMParmUInt32Set(&Msg.offset, 0); + VbglHGCMParmUInt32Set(&Msg.size, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) @@ -535,32 +894,37 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdClose(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.handle.GetUInt32(puHandle); + Msg.offset.GetUInt64(puOffset); + Msg.size.GetUInt32(puToRead); } } return rc; } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdRead(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - uint32_t *puHandle, uint32_t *puToRead) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetWrite(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, + void *pvData, uint32_t cbData, uint32_t *pcbSize) { - AssertReturn(cParms == 4, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); - AssertPtrReturn(puToRead, VERR_INVALID_POINTER); + AssertPtrReturn(pvData, VERR_INVALID_POINTER); + AssertReturn(cbData, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcbSize, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileRead Msg; + HGCMMsgFileWrite Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 4; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.handle, 0); + VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); VbglHGCMParmUInt32Set(&Msg.size, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); @@ -573,38 +937,38 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdRead(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.handle.GetUInt32(puHandle); - Msg.size.GetUInt32(puToRead); + Msg.size.GetUInt32(pcbSize); } } return rc; } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdWrite(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - uint32_t *puHandle, - void *pvData, uint32_t cbData, - uint32_t *pcbSize) + +VBGLR3DECL(int) VbglR3GuestCtrlFileGetWriteAt(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, + void *pvData, uint32_t cbData, uint32_t *pcbSize, uint64_t *puOffset) { - AssertReturn(cParms == 4, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 5, VERR_INVALID_PARAMETER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); AssertPtrReturn(pvData, VERR_INVALID_POINTER); AssertReturn(cbData, VERR_INVALID_PARAMETER); AssertPtrReturn(pcbSize, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileWrite Msg; + HGCMMsgFileWriteAt Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 4; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.handle, 0); VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); VbglHGCMParmUInt32Set(&Msg.size, 0); + VbglHGCMParmUInt32Set(&Msg.offset, 0); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) @@ -616,7 +980,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdWrite(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.handle.GetUInt32(puHandle); Msg.size.GetUInt32(pcbSize); } @@ -625,23 +989,22 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdWrite(uint32_t uClientId, } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdSeek(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - uint32_t *puHandle, - uint32_t *puSeekMethod, uint64_t *puOffset) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetSeek(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puHandle, uint32_t *puSeekMethod, uint64_t *puOffset) { - AssertReturn(cParms == 4, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); AssertPtrReturn(puSeekMethod, VERR_INVALID_POINTER); AssertPtrReturn(puOffset, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileSeek Msg; + HGCMMsgFileSeek Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 4; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.handle, 0); @@ -658,7 +1021,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdSeek(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.handle.GetUInt32(puHandle); Msg.method.GetUInt32(puSeekMethod); Msg.offset.GetUInt64(puOffset); @@ -668,20 +1031,19 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdSeek(uint32_t uClientId, } -VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdTell(uint32_t uClientId, uint32_t cParms, - uint32_t *puContext, - uint32_t *puHandle) +VBGLR3DECL(int) VbglR3GuestCtrlFileGetTell(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle) { - AssertReturn(cParms == 2, VERR_INVALID_PARAMETER); - AssertPtrReturn(puContext, VERR_INVALID_POINTER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 2, VERR_INVALID_PARAMETER); AssertPtrReturn(puHandle, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileTell Msg; + HGCMMsgFileTell Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; - Msg.hdr.u32Function = GUEST_GET_HOST_MSG; - Msg.hdr.cParms = 2; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; VbglHGCMParmUInt32Set(&Msg.context, 0); VbglHGCMParmUInt32Set(&Msg.handle, 0); @@ -696,7 +1058,7 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdTell(uint32_t uClientId, } else { - Msg.context.GetUInt32(puContext); + Msg.context.GetUInt32(&pCtx->uContextID); Msg.handle.GetUInt32(puHandle); } } @@ -704,27 +1066,376 @@ VBGLR3DECL(int) VbglR3GuestCtrlFileGetHostCmdTell(uint32_t uClientId, } -VBGLR3DECL(int) VbglR3GuestCtrlFileNotify(uint32_t uClientId, - uint32_t uContext, uint32_t uHandle, - uint32_t uType, - void *pvPayload, uint32_t cbPayload) +VBGLR3DECL(int) VbglR3GuestCtrlProcGetTerminate(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puPID) { - AssertPtrReturn(uContext, VERR_INVALID_POINTER); - AssertPtrReturn(uHandle, VERR_INVALID_POINTER); - AssertPtrReturn(pvPayload, VERR_INVALID_POINTER); - AssertReturn(cbPayload, VERR_INVALID_PARAMETER); + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); - VBoxGuestCtrlHGCMMsgFileNotify Msg; + AssertReturn(pCtx->uNumParms == 2, VERR_INVALID_PARAMETER); + AssertPtrReturn(puPID, VERR_INVALID_POINTER); + + HGCMMsgProcTerminate Msg; Msg.hdr.result = VERR_WRONG_ORDER; - Msg.hdr.u32ClientID = uClientId; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmUInt32Set(&Msg.pid, 0); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + { + rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.pid.GetUInt32(puPID); + } + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlProcGetWaitFor(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t *puPID, uint32_t *puWaitFlags, uint32_t *puTimeoutMS) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + AssertReturn(pCtx->uNumParms == 5, VERR_INVALID_PARAMETER); + AssertPtrReturn(puPID, VERR_INVALID_POINTER); + + HGCMMsgProcWaitFor Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_MSG_WAIT; + Msg.hdr.cParms = pCtx->uNumParms; + + VbglHGCMParmUInt32Set(&Msg.context, 0); + VbglHGCMParmUInt32Set(&Msg.pid, 0); + VbglHGCMParmUInt32Set(&Msg.flags, 0); + VbglHGCMParmUInt32Set(&Msg.timeout, 0); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + { + rc = rc2; + } + else + { + Msg.context.GetUInt32(&pCtx->uContextID); + Msg.pid.GetUInt32(puPID); + Msg.flags.GetUInt32(puWaitFlags); + Msg.timeout.GetUInt32(puTimeoutMS); + } + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc, uint32_t uFileHandle) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_OPEN); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + VbglHGCMParmUInt32Set(&Msg.u.open.handle, uFileHandle); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbClose(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 3; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_CLOSE); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbError(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t uRc) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 3; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_ERROR); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbRead(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc, + void *pvData, uint32_t cbData) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; Msg.hdr.u32Function = GUEST_FILE_NOTIFY; Msg.hdr.cParms = 4; - VbglHGCMParmUInt32Set(&Msg.context, uContext); + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_READ); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + VbglHGCMParmPtrSet(&Msg.u.read.data, pvData, cbData); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbWrite(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc, uint32_t uWritten) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_WRITE); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + VbglHGCMParmUInt32Set(&Msg.u.write.written, uWritten); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbSeek(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc, uint64_t uOffActual) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_SEEK); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + VbglHGCMParmUInt64Set(&Msg.u.seek.offset, uOffActual); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +VBGLR3DECL(int) VbglR3GuestCtrlFileCbTell(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uRc, uint64_t uOffActual) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMReplyFileNotify Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_FILE_NOTIFY; + Msg.hdr.cParms = 4; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.type, GUEST_FILE_NOTIFYTYPE_TELL); + VbglHGCMParmUInt32Set(&Msg.rc, uRc); + + VbglHGCMParmUInt64Set(&Msg.u.tell.offset, uOffActual); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +/** + * Callback for reporting a guest process status (along with some other stuff) to the host. + * + * @returns VBox status code. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlProcCbStatus(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uPID, uint32_t uStatus, uint32_t uFlags, + void *pvData, uint32_t cbData) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMMsgProcStatus Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_EXEC_STATUS; + Msg.hdr.cParms = 5; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.pid, uPID); + VbglHGCMParmUInt32Set(&Msg.status, uStatus); + VbglHGCMParmUInt32Set(&Msg.flags, uFlags); + VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +/** + * Sends output (from stdout/stderr) from a running process. + * + * @returns VBox status code. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlProcCbOutput(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uPID,uint32_t uHandle, uint32_t uFlags, + void *pvData, uint32_t cbData) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMMsgProcOutput Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_EXEC_OUTPUT; + Msg.hdr.cParms = 5; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.pid, uPID); VbglHGCMParmUInt32Set(&Msg.handle, uHandle); - VbglHGCMParmUInt32Set(&Msg.type, uType); - VbglHGCMParmPtrSet(&Msg.payload, pvPayload, cbPayload); + VbglHGCMParmUInt32Set(&Msg.flags, uFlags); + VbglHGCMParmPtrSet(&Msg.data, pvData, cbData); + + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + { + int rc2 = Msg.hdr.result; + if (RT_FAILURE(rc2)) + rc = rc2; + } + return rc; +} + + +/** + * Callback for reporting back the input status of a guest process to the host. + * + * @returns VBox status code. + ** @todo Docs! + */ +VBGLR3DECL(int) VbglR3GuestCtrlProcCbStatusInput(PVBGLR3GUESTCTRLCMDCTX pCtx, + uint32_t uPID, uint32_t uStatus, + uint32_t uFlags, uint32_t cbWritten) +{ + AssertPtrReturn(pCtx, VERR_INVALID_POINTER); + + HGCMMsgProcStatusInput Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = pCtx->uClientID; + Msg.hdr.u32Function = GUEST_EXEC_INPUT_STATUS; + Msg.hdr.cParms = 5; + + VbglHGCMParmUInt32Set(&Msg.context, pCtx->uContextID); + VbglHGCMParmUInt32Set(&Msg.pid, uPID); + VbglHGCMParmUInt32Set(&Msg.status, uStatus); + VbglHGCMParmUInt32Set(&Msg.flags, uFlags); + VbglHGCMParmUInt32Set(&Msg.written, cbWritten); int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); if (RT_SUCCESS(rc)) diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp index 32c7d796..48539199 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -783,6 +783,32 @@ VBGLR3DECL(void) VbglR3GuestPropEnumFree(PVBGLR3GUESTPROPENUM pHandle) /** + * Deletes a guest property. + * + * @returns VBox status code. + * @param u32ClientId The client id returned by VbglR3InvsSvcConnect(). + * @param pszName The property to delete. Utf8 + */ +VBGLR3DECL(int) VbglR3GuestPropDelete(uint32_t u32ClientId, const char *pszName) +{ + AssertPtrReturn(pszName, VERR_INVALID_POINTER); + + DelProperty Msg; + + Msg.hdr.result = VERR_WRONG_ORDER; + Msg.hdr.u32ClientID = u32ClientId; + Msg.hdr.u32Function = DEL_PROP; + Msg.hdr.cParms = 1; + VbglHGCMParmPtrSetString(&Msg.name, pszName); + int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg)); + if (RT_SUCCESS(rc)) + rc = Msg.hdr.result; + + return rc; +} + + +/** * Deletes a set of keys. * * The set is specified in the same way as for VbglR3GuestPropEnum. diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestUser.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestUser.cpp new file mode 100644 index 00000000..56b95785 --- /dev/null +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestUser.cpp @@ -0,0 +1,114 @@ +/* $Id: VBoxGuestR3LibGuestUser.cpp $ */ +/** @file + * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, + * guest user reporting / utility functions. + */ + +/* + * Copyright (C) 2013 Oracle Corporation + * + * This file is part of VirtualBox Open Source Edition (OSE), as + * available from http://www.virtualbox.org. This file is free software; + * you can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) as published by the Free Software + * Foundation, in version 2 as it comes in the "COPYING" file of the + * VirtualBox OSE distribution. VirtualBox OSE is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. + * + * The contents of this file may alternatively be used under the terms + * of the Common Development and Distribution License Version 1.0 + * (CDDL) only, as it comes in the "COPYING.CDDL" file of the + * VirtualBox OSE distribution, in which case the provisions of the + * CDDL are applicable instead of those of the GPL. + * + * You may elect to license modified versions of this file under the + * terms and conditions of either the GPL or the CDDL or both. + */ + + +/******************************************************************************* +* Header Files * +*******************************************************************************/ +#include <iprt/assert.h> +#include <VBox/log.h> +#include <iprt/mem.h> +#include <iprt/string.h> + +#include "VBGLR3Internal.h" + + +/** + * Reports a state change of a specific guest user. + * + * @returns IPRT status value + * @param pszUser Guest user name to report state for. + * @param pszDomain Domain the guest user's account is bound to. + * @param enmState Guest user state to report. + * @param puDetails Pointer to state details. Optional. + * @param cbDetails Size (in bytes) of state details. Pass 0 + * if puDetails is NULL. + */ +VBGLR3DECL(int) VbglR3GuestUserReportState(const char *pszUser, + const char *pszDomain, + VBoxGuestUserState enmState, + uint8_t *puDetails, + uint32_t cbDetails) +{ + AssertPtrReturn(pszUser, VERR_INVALID_POINTER); + /* pszDomain is optional. */ + /* puDetails is optional. */ + + uint32_t cbBase = sizeof(VMMDevReportGuestUserState); + uint32_t cbUser = strlen(pszUser) + 1; /* Include terminating zero */ + uint32_t cbDomain = pszDomain ? strlen(pszDomain) + 1 /* Dito */ : 0; + + /* Allocate enough space for all fields. */ + unsigned long cbSize = + cbBase + + cbUser + + cbDomain + + cbDetails; + + AssertReturn(cbSize, VERR_BUFFER_UNDERFLOW); + VMMDevReportGuestUserState *pReport = + (VMMDevReportGuestUserState *)RTMemAllocZ(cbSize); + if (!pReport) + return VERR_NO_MEMORY; + + int rc = vmmdevInitRequest(&pReport->header, VMMDevReq_ReportGuestUserState); + if (RT_SUCCESS(rc)) + { + pReport->header.size = cbSize; + + pReport->status.state = enmState; + pReport->status.cbUser = cbUser; + pReport->status.cbDomain = cbDomain; + pReport->status.cbDetails = cbDetails; + + /* + * Note: cbOffDynamic contains the first dynamic array entry within + * VBoxGuestUserStatus. + * Therefore it's vital to *not* change the order of the struct members + * without altering this code. Don't try this at home. + */ + uint32_t cbOffDynamic = + RT_OFFSETOF(VBoxGuestUserStatus, szUser); + + /* pDynamic marks the beginning for the dynamically allocated areas. */ + uint8_t *pDynamic = (uint8_t *)&pReport->status; + pDynamic += cbOffDynamic; + AssertPtr(pDynamic); + + memcpy(pDynamic, pszUser, cbUser); + if (cbDomain) + memcpy(pDynamic + cbUser, pszDomain, cbDomain); + if (cbDetails) + memcpy(pDynamic + cbUser + cbDomain, puDetails, cbDetails); + + rc = vbglR3GRPerform(&pReport->header); + } + + RTMemFree(pReport); + return rc; +} + diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostChannel.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostChannel.cpp index 7051ae62..35ee6b5c 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostChannel.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostChannel.cpp @@ -24,7 +24,7 @@ * terms and conditions of either the GPL or the CDDL or both. */ - + #include <iprt/mem.h> #include <VBox/HostServices/VBoxHostChannel.h> diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp index 03cfce8f..e253838b 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2009 Oracle Corporation + * Copyright (C) 2009-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMouse.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMouse.cpp index 25fc44ee..52e39ab2 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMouse.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMouse.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSeamless.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSeamless.cpp index aa146281..60b47a08 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSeamless.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSeamless.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSharedFolders.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSharedFolders.cpp index 0d6be8ed..1ebec9cd 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSharedFolders.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSharedFolders.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010 Oracle Corporation + * Copyright (C) 2010-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -199,6 +199,11 @@ VBGLR3DECL(int) VbglR3SharedFolderGetMappings(uint32_t u32ClientId, bool fAutoMo ppaMappingsTemp = NULL; } + /* In this case, just return success with 0 mappings */ + if ( rc == VERR_INVALID_PARAMETER + && fAutoMountOnly) + rc = VINF_SUCCESS; + *ppaMappings = ppaMappingsTemp; return rc; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibTime.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibTime.cpp index c03b2c22..13830afe 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibTime.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibTime.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp index 3298d85d..fa972a3e 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2009 Oracle Corporation + * Copyright (C) 2007-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -139,6 +139,69 @@ VBGLR3DECL(int) VbglR3SetPointerShapeReq(VMMDevReqMousePointer *pReq) rc = pReq->header.rc; return rc; } +/** + * Query the last display change request sent from the host to the guest. + * + * @returns iprt status value + * @param pcx Where to store the horizontal pixel resolution + * requested (a value of zero means do not change). + * @param pcy Where to store the vertical pixel resolution + * requested (a value of zero means do not change). + * @param pcBits Where to store the bits per pixel requested (a value + * of zero means do not change). + * @param iDisplay Where to store the display number the request was for + * - 0 for the primary display, 1 for the first + * secondary display, etc. + * @param fAck whether or not to acknowledge the newest request sent by + * the host. If this is set, the function will return the + * most recent host request, otherwise it will return the + * last request to be acknowledged. + * + * @param pcOriginX New horizontal position of the secondary monitor. + * @param pcOriginY New vertical position of the secondary monitor. + * param pfEnabled Secondary monitor is enabled or not. + * + */ +VBGLR3DECL(int) VbglR3GetDisplayChangeRequestEx(uint32_t *pcx, uint32_t *pcy, uint32_t *pcBits, + uint32_t *piDisplay, uint32_t *pcOriginX, uint32_t *pcOriginY, + bool *pfEnabled, bool fAck) +{ + VMMDevDisplayChangeRequestEx Req; + int rc = VINF_SUCCESS; + AssertPtrReturn(pcx, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcy, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcBits, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcOriginX, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcOriginY, VERR_INVALID_PARAMETER); + AssertPtrReturn(piDisplay, VERR_INVALID_PARAMETER); + AssertPtrReturn(pfEnabled, VERR_INVALID_PARAMETER); + RT_ZERO(Req); + rc = vmmdevInitRequest(&Req.header, VMMDevReq_GetDisplayChangeRequestEx); + if (RT_FAILURE(rc)) + { + LogRelFlowFunc(("DisplayChangeRequest Extended not supported. Can't Init the Req.\n")); + return rc; + } + + if (fAck) + Req.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; + rc = vbglR3GRPerform(&Req.header); + if (RT_SUCCESS(rc)) + rc = Req.header.rc; + if (RT_SUCCESS(rc)) + { + *pcx = Req.xres; + *pcy = Req.yres; + *pcBits = Req.bpp; + *piDisplay = Req.display; + *pcOriginX = Req.cxOrigin; + *pcOriginY = Req.cyOrigin; + *pfEnabled = Req.fEnabled; + LogRel(("VbglR3GetDisplayChangeRequestEx: pcx=%d pcy=%d display=%d orgX=%d orgY=%d and Enabled=%d\n", + *pcx, *pcy, *piDisplay, *pcOriginX, *pcOriginY, *pfEnabled)); + } + return rc; +} /** @@ -146,7 +209,6 @@ VBGLR3DECL(int) VbglR3SetPointerShapeReq(VMMDevReqMousePointer *pReq) * * @returns iprt status value * @param pcx Where to store the horizontal pixel resolution - * requested (a value of zero means do not change). * @param pcy Where to store the vertical pixel resolution * requested (a value of zero means do not change). * @param pcBits Where to store the bits per pixel requested (a value diff --git a/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp b/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp index 00779237..beda4bb2 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2010 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp index a8764556..e8ecf07f 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp @@ -1,10 +1,10 @@ -/* $Revision: 77449 $ */ +/* $Revision: 83618 $ */ /** @file * VBoxGuestLibR0 - Physical memory heap. */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -34,6 +34,9 @@ */ DECLR0VBGL(bool) VbglR0CanUsePhysPageList(void) { + /* a_fLocked is false, because the actual capability of the host is requested. + * See VBGLR0_CAN_USE_PHYS_PAGE_LIST definition. + */ int rc = vbglR0Enter(); return RT_SUCCESS(rc) && VBGLR0_CAN_USE_PHYS_PAGE_LIST(/*a_fLocked =*/ false); |