summaryrefslogtreecommitdiff
path: root/src/VBox/Additions/common/VBoxGuestLib
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-03-26 19:21:20 +0000
committer <>2014-05-08 15:03:54 +0000
commitfb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch)
treec2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/Additions/common/VBoxGuestLib
parent58ed4748338f9466599adfc8a9171280ed99e23f (diff)
downloadVirtualBox-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')
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp20
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp4
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp9
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/Init.cpp8
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk3
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp16
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp12
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/SysHlp.h4
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h19
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBGLR3Internal.h2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp15
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c119
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h8
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp79
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibClipboard.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibCredentials.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp12
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGR.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp1183
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp28
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestUser.cpp114
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostChannel.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibHostVersion.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMouse.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSeamless.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibSharedFolders.cpp7
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibTime.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibVideo.cpp66
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp2
-rw-r--r--src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp7
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);