gctrl.cpp revision ca0ee85505c252493a3ee53577848ef8939f991b
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/* $Id$ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @file
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * Guest Control Service: Internal function used by service, Main and testcase.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2010 Sun Microsystems, Inc.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * additional information or have any questions.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @page pg_svc_guest_control Guest Control HGCM Service
cd6f71bc352f550074f1ba2c830a2cf2f0b3dd46vboxsync *
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync * @todo Write up some nice text here.
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync */
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define LOG_GROUP LOG_GROUP_HGCM
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/HostServices/GuestControlSvc.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync/** @todo Remove unused header files below! */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <iprt/alloca.h>
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync#include <iprt/initterm.h>
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#include <iprt/crc32.h>
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#include <iprt/ctype.h>
b0b15690f00527424b2d5fb88456d747252322f7vboxsync#include <iprt/env.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/file.h>
efff36b306e370346025647a158689021df2e1d1vboxsync#include <iprt/getopt.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/handle.h>
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#include <iprt/mem.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/message.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/param.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/path.h>
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#include <iprt/pipe.h>
efff36b306e370346025647a158689021df2e1d1vboxsync#include <iprt/poll.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/process.h>
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync#include <iprt/stream.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/thread.h>
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include "gctrl.h"
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
efff36b306e370346025647a158689021df2e1d1vboxsyncnamespace guestControl {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/**
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Creates the argument list as an array used for executing a program.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @returns VBox status code.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * @todo
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @todo Respect spaces when quoting for arguments, e.g. "c:\\program files\\".
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @todo Handle empty ("") argguments.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncint gctrlPrepareExecArgv(char *pszArgs, void **ppvList, uint32_t *pcbList, uint32_t *pcArgs)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync char **ppaArg;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync int iArgs;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync int rc = RTGetOptArgvFromString(&ppaArg, &iArgs, pszArgs, NULL);
0abd77741a608f6c41c8dfcd4781b8b84adf1044vboxsync if (RT_SUCCESS(rc))
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync char *pszTemp = NULL;
9496f2d398b49813176939d7a339ae513d5175efvboxsync *pcbList = 0;
9496f2d398b49813176939d7a339ae513d5175efvboxsync for (int i=0; i<iArgs; i++)
9496f2d398b49813176939d7a339ae513d5175efvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (i > 0) /* Insert space as delimiter. */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = RTStrAAppendN(&pszTemp, " ", 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (RT_FAILURE(rc))
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync break;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync else
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = RTStrAAppendN(&pszTemp, ppaArg[i], strlen(ppaArg[i]));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (RT_FAILURE(rc))
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync break;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTGetOptArgvFree(ppaArg);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *ppvList = pszTemp;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *pcArgs = iArgs;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *pcbList = strlen(pszTemp) + 1; /* Include zero termination. */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync else
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTStrFree(pszTemp);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return rc;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/**
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * Appends environment variables to the environment block. Each var=value pair is separated
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * by NULL (\0) sequence. The whole block will be stored in one blob and disassembled on the
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * guest side later to fit into the HGCM param structure.
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync *
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync * @returns VBox status code.
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync *
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * @todo
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync *
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncint gctrlAddToExecEnvv(char *pszEnv, void **ppvList, uint32_t *pcbList, uint32_t *pcEnv)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync int rc = VINF_SUCCESS;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync uint32_t cbLen = strlen(pszEnv);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync if (*ppvList)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync {
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync uint32_t cbNewLen = *pcbList + cbLen + 1; /* Include zero termination. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync char *pvTmp = (char*)RTMemRealloc(*ppvList, cbNewLen);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync if (NULL == pvTmp)
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync {
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync rc = VERR_NO_MEMORY;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync }
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync else
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync memcpy(pvTmp + *pcbList, pszEnv, cbLen);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync pvTmp[cbNewLen - 1] = '\0'; /* Add zero termination. */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *ppvList = (void**)pvTmp;
cab115cfa31c584def7069312a1e23c3fc88533bvboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync else
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync char *pcTmp;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RTStrAPrintf(&pcTmp, "%s", pszEnv) > 0)
21029597fc4b76d0db0c9542daee201447281781vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *ppvList = (void**)pcTmp;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync /* Reset counters. */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *pcEnv = 0;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *pcbList = 0;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
c0a370e600bb60153a269fb32b5f709347c35768vboxsync {
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync *pcbList += cbLen + 1; /* Include zero termination. */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *pcEnv += 1; /* Increase env pairs count. */
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync return rc;
9496f2d398b49813176939d7a339ae513d5175efvboxsync}
9496f2d398b49813176939d7a339ae513d5175efvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/*
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncint gctrlAllocateExecBlock(PVBOXGUESTCTRLEXECBLOCK *ppBlock,
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync const char *pszCmd, uint32_t fFlags,
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync uint32_t cArgs, const char * const *papszArgs,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t cEnvVars, const char * const *papszEnv,
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync const char *pszStdIn, const char *pszStdOut, const char *pszStdErr,
16a9adc14900ca18e6909679a579f6833425e030vboxsync const char *pszUsername, const char *pszPassword, RTMSINTERVAL cMillies)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
16a9adc14900ca18e6909679a579f6833425e030vboxsync PVBOXGUESTCTRLEXECBLOCK pNewBlock = (VBOXGUESTCTRLEXECBLOCK*)RTMemAlloc(sizeof(VBOXGUESTCTRLEXECBLOCK));
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync int rc;
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (pNewBlock)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync *ppBlock = pNewBlock;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync rc = VINF_SUCCESS;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync }
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync else
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = VERR_NO_MEMORY;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync return rc;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync}
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsyncint gctrlFreeExecBlock(PVBOXGUESTCTRLEXECBLOCK pBlock)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync AssertPtr(pBlock);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync RTStrFree(pBlock->pszCmd);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTMemFree(pBlock->pvArgs);
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync RTMemFree(pBlock->pvEnv);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTStrFree(pBlock->pszStdIn);
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync RTStrFree(pBlock->pszStdOut);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RTStrFree(pBlock->pszStdErr);
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RTStrFree(pBlock->pszUsername);
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RTStrFree(pBlock->pszPassword);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync RT_ZERO(*pBlock);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync return VINF_SUCCESS;
009d45aa55691312278d41edb20154dc208d9cd8vboxsync}
009d45aa55691312278d41edb20154dc208d9cd8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncint gctrlPrepareHostCmdExec(PVBOXHGCMSVCPARM *ppaParms, uint32_t *pcParms,
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync PVBOXGUESTCTRLEXECBLOCK pBlock)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtr(ppaParms);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertPtr(pBlock);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync PVBOXHGCMSVCPARM pNewParms =
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync (VBOXHGCMSVCPARM*)RTMemAlloc(sizeof(VBOXHGCMSVCPARM) * 13);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync int rc;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pNewParms)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[0].setUInt32(HOST_EXEC_CMD);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[1].setUInt32(pBlock->u32Flags);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[2].setPointer((void*)pBlock->pszCmd, (uint32_t)strlen(pBlock->pszCmd) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[3].setUInt32(pBlock->u32Args);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[4].setPointer((void*)pBlock->pvArgs, pBlock->cbArgs);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[5].setUInt32(pBlock->u32EnvVars);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[6].setPointer((void*)pBlock->pvEnv, pBlock->cbEnv);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[7].setPointer((void*)pBlock->pszStdIn, (uint32_t)strlen(pBlock->pszStdIn) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[8].setPointer((void*)pBlock->pszStdOut, (uint32_t)strlen(pBlock->pszStdOut) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[9].setPointer((void*)pBlock->pszStdErr, (uint32_t)strlen(pBlock->pszStdErr) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[10].setPointer((void*)pBlock->pszUsername, (uint32_t)strlen(pBlock->pszUsername) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[11].setPointer((void*)pBlock->pszPassword, (uint32_t)strlen(pBlock->pszPassword) + 1);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pNewParms[12].setUInt32(pBlock->cMillies);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *ppaParms = pNewParms;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = VINF_SUCCESS;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync else
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync rc = VERR_NO_MEMORY;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (pcParms)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *pcParms = 13;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return rc;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncvoid gctrlFreeHostCmd(PVBOXHGCMSVCPARM paParms)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync{
16a9adc14900ca18e6909679a579f6833425e030vboxsync RTMemFree(paParms);
16a9adc14900ca18e6909679a579f6833425e030vboxsync}
16a9adc14900ca18e6909679a579f6833425e030vboxsync*/
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync}
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync