diff options
| author | Ritesh Raj Sarraf <rrs@debian.org> | 2013-11-19 03:24:56 -0500 |
|---|---|---|
| committer | Ritesh Raj Sarraf <rrs@debian.org> | 2013-11-19 03:24:56 -0500 |
| commit | 1d0b96390adf6a8d181d6daad57b7228e69ec9e0 (patch) | |
| tree | 3ea3b604ff6f42a30270c75bb97bdfa40032e6b9 /src/VBox/Additions/common/VBoxGuestLib | |
| parent | 915d69eb315216560c765c50574aa84bd89b197b (diff) | |
| download | virtualbox-1d0b96390adf6a8d181d6daad57b7228e69ec9e0.tar.gz | |
Imported Upstream version 4.3.2-dfsg
Diffstat (limited to 'src/VBox/Additions/common/VBoxGuestLib')
17 files changed, 1225 insertions, 293 deletions
diff --git a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp index ad336f9ae..cae7a8f3f 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp @@ -1,10 +1,10 @@ -/* $Revision: 83687 $ */ +/* $Revision: 87431 $ */ /** @file * VBoxGuestLibR0 - Generic VMMDev request management. */ /* - * Copyright (C) 2006-2011 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 0a6d65aa9..5521c142e 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLib - Host-Guest Communication Manager. * diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp index 7357398ec..efd8d76bb 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 88366 $ */ /** @file * VBoxGuestLib - Host-Guest Communication Manager internal functions, implemented by VBoxGuest */ @@ -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 d6c667d37..5298ffe7d 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/Init.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/Init.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 89635 $ */ /** @file * VBoxGuestLibR0 - Library initialization. */ @@ -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 ed8c689ef..e60199565 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; @@ -41,10 +41,16 @@ LIBRARIES += \ ifndef VBOX_ONLY_TESTSUITE if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd) LIBRARIES += \ - VBoxGuestR3LibXFree86 + VBoxGuestR3LibXFree86 endif endif LIBRARIES.win.amd64 += VBoxGuestR3Lib-x86 VBoxGuestR3LibShared-x86 +ifneq ($(VBOX_WITH_COMPATIBLE_LINUX_GUEST_PACKAGE),) + LIBRARIES.linux.amd64 += \ + VBoxGuestR3Lib-x86 \ + VBoxGuestR3LibShared-x86 \ + VBoxGuestR3LibXFree86-x86 +endif # @@ -105,6 +111,7 @@ VBoxGuestR3Lib_SOURCES = \ VBoxGuestR3LibCpuHotPlug.cpp \ VBoxGuestR3LibCredentials.cpp \ VBoxGuestR3LibEvent.cpp \ + VBoxGuestR3LibGuestUser.cpp \ VBoxGuestR3LibGR.cpp \ VBoxGuestR3LibHostChannel.cpp \ VBoxGuestR3LibLog.cpp \ @@ -159,7 +166,7 @@ VBoxGuestR3Lib-x86_BLD_TRG_ARCH := x86 # -# VBoxGuestR3LibShared-x86 - an x86 (32-bit) variant of VBoxGuestR3LibShared for 64-bit Windows. +# VBoxGuestR3LibShared-x86 - an x86 (32-bit) variant of VBoxGuestR3LibShared for 64-bit Linux. # VBoxGuestR3LibShared-x86_EXTENDS := VBoxGuestR3LibShared VBoxGuestR3LibShared-x86_BLD_TRG_ARCH := x86 @@ -196,5 +203,12 @@ VBoxGuestR3LibXFree86_INCS = \ VBoxGuestR3LibRuntimeXF86.cpp_CXXFLAGS = -Wno-shadow +# +# VBoxGuestR3LibXFree86-x86 - an x86 (32-bit) variant of VBoxGuestR3LibXFree86 for 64-bit Linux. +# +VBoxGuestR3LibXFree86-x86_TEMPLATE := VBOXGUESTR3XF86LIB_X86 +VBoxGuestR3LibXFree86-x86_EXTENDS := VBoxGuestR3LibXFree86 + + include $(FILE_KBUILD_SUB_FOOTER) diff --git a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp index 73e219a3d..1f1d24f59 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 85891 $ */ /** @file * VBoxGuestLibR0 - Physical memory heap. */ @@ -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 c7c379ee9..008c5e144 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLibR0 - IDC with VBoxGuest and HGCM helpers. */ diff --git a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h index b22ca1c9d..686036470 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h +++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h @@ -1,4 +1,4 @@ -/* $Revision: 83687 $ */ +/* $Revision: 83575 $ */ /** @file * VBoxGuestLibR0 - System dependent helpers internal header. */ diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c index f05111309..3ecb4388d 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c @@ -1,4 +1,4 @@ -/* $Revision: 83629 $ */ +/* $Revision: 84251 $ */ /** @file * VBoxGuestR0LibSharedFolders - Ring 0 Shared Folders calls. */ @@ -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; diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp index 662d70b69..80e5b877a 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2012 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/VBoxGuestR3LibDaemonize.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp index 2687112fe..c6ab6545b 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp @@ -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/VBoxGuestR3LibGuestCtrl.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp index f28cafed6..2bd554c4a 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010-2012 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 4fb9bf59b..485391994 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2011 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 000000000..56b95785c --- /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 7051ae628..35ee6b5c6 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/VBoxGuestR3LibVideo.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp index b8eef1603..fa972a3e0 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2013 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/VbglR0CanUsePhysPageList.cpp b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp index 04f69636c..e8ecf07f1 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp @@ -1,4 +1,4 @@ -/* $Revision: 83629 $ */ +/* $Revision: 83618 $ */ /** @file * VBoxGuestLibR0 - Physical memory heap. */ |
