VirtualBox

Changeset 28218 in vbox


Ignore:
Timestamp:
Apr 12, 2010 3:58:07 PM (15 years ago)
Author:
vboxsync
Message:

Guest Control: Update (HGCM low level callbacks, bugfixes).

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/GuestControlSvc.h

    r28206 r28218  
    6868
    6969/**
     70 * Process status when executed in the guest.
     71 */
     72enum eProcessStatus
     73{
     74    PROC_STATUS_STARTED = 1,
     75
     76    PROC_STATUS_TERMINATED = 2
     77};
     78
     79/**
    7080 * The service functions which are callable by host.
    7181 */
     
    178188
    179189} VBoxGuestCtrlHGCMMsgExecCmd;
     190
     191typedef struct _VBoxGuestCtrlHGCMMsgExecStatus
     192{
     193    VBoxGuestHGCMCallInfo hdr;
     194
     195    HGCMFunctionParameter pid;
     196
     197    HGCMFunctionParameter status;
     198
     199    HGCMFunctionParameter flags;
     200
     201    HGCMFunctionParameter data;
     202
     203} VBoxGuestCtrlHGCMMsgExecStatus;
    180204#pragma pack ()
    181205
  • trunk/include/VBox/VBoxGuestLib.h

    r27976 r28218  
    514514VBGLR3DECL(int)     VbglR3GuestCtrlDisconnect(uint32_t u32ClientId);
    515515VBGLR3DECL(int)     VbglR3GuestCtrlGetHostMsg(uint32_t u32ClientId, uint32_t *puMsg, uint32_t *puNumParms);
    516 VBGLR3DECL(int)     VbglR3GuestCtrlGetHostCmdExec(uint32_t u32ClientId, uint32_t uNumParms,
     516VBGLR3DECL(int)     VbglR3GuestCtrlExecGetHostCmd(uint32_t u32ClientId, uint32_t uNumParms,
    517517                                                  char    *pszCmd,      uint32_t cbCmd,
    518518                                                  uint32_t *puFlags,
     
    525525                                                  char *pszPassword,    uint32_t cbPassword,
    526526                                                  uint32_t *puTimeLimit);
     527VBGLR3DECL(int)     VbglR3GuestCtrlExecReportStatus(uint32_t  u32ClientId,
     528                                                    uint32_t  u32PID,
     529                                                    uint32_t  u32Status,
     530                                                    uint32_t  u32Flags,
     531                                                    void     *pvData,
     532                                                    uint32_t  cbData);
    527533/** @}  */
    528534# endif /* VBOX_WITH_GUEST_CONTROL defined */
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp

    r28086 r28218  
    117117    Msg.hdr.u32ClientID = u32ClientId;
    118118    Msg.hdr.u32Function = GUEST_GET_HOST_MSG; /* Tell the host we want our next command. */
    119     Msg.hdr.cParms = 2;
     119    Msg.hdr.cParms = 2;                       /* Just peek for the next message! */
    120120
    121121    VbglHGCMParmUInt32Set(&Msg.msg, 0);
     
    145145 * @param   ppvData
    146146 * @param   uNumParms
    147  */
    148 VBGLR3DECL(int) VbglR3GuestCtrlGetHostCmdExec(uint32_t u32ClientId, uint32_t uNumParms,
     147 ** @todo Docs!
     148 */
     149VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmd(uint32_t u32ClientId, uint32_t uNumParms,
    149150                                              char    *pszCmd,      uint32_t cbCmd,
    150151                                              uint32_t *puFlags,
     
    214215}
    215216
     217
     218
     219
     220/**
     221 * Reports the process status (along with some other stuff) to the host.
     222 *
     223 * @returns VBox status code.
     224 ** @todo Docs!
     225 */
     226VBGLR3DECL(int) VbglR3GuestCtrlExecReportStatus(uint32_t  u32ClientId,
     227                                                uint32_t  u32PID,
     228                                                uint32_t  u32Status,
     229                                                uint32_t  u32Flags,
     230                                                void     *pvData,
     231                                                uint32_t  cbData)
     232{
     233    VBoxGuestCtrlHGCMMsgExecStatus Msg;
     234
     235    Msg.hdr.result = VERR_WRONG_ORDER;
     236    Msg.hdr.u32ClientID = u32ClientId;
     237    Msg.hdr.u32Function = GUEST_EXEC_SEND_STATUS;
     238    Msg.hdr.cParms = 4;
     239
     240    VbglHGCMParmUInt32Set(&Msg.pid, 0);
     241    VbglHGCMParmUInt32Set(&Msg.status, 0);
     242    VbglHGCMParmUInt32Set(&Msg.flags, 0);
     243    VbglHGCMParmPtrSet(&Msg.data, pvData, cbData);
     244
     245    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
     246    if (RT_SUCCESS(rc))
     247    {
     248        int rc2 = Msg.hdr.result;
     249        if (RT_FAILURE(rc2))
     250            rc = rc2;
     251    }
     252    return rc;
     253}
     254
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp

    r28119 r28218  
    110110    uint32_t uTimeLimitMS;
    111111
    112     int rc = VbglR3GuestCtrlGetHostCmdExec(u32ClientId, uNumParms,
     112    int rc = VbglR3GuestCtrlExecGetHostCmd(u32ClientId, uNumParms,
    113113                                           /* Command */
    114114                                           szCmd,      sizeof(szCmd),
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp

    r28119 r28218  
    512512    pData->pszCmd = RTStrDup(pszCmd);
    513513    pData->uFlags = uFlags;
     514    pData->uNumEnvVars = 0;
     515    pData->uNumArgs = 0; /* Initialize in case of RTGetOptArgvFromString() is failing ... */
    514516
    515517    /* Prepare argument list. */
    516518    int rc = RTGetOptArgvFromString(&pData->papszArgs, (int*)&pData->uNumArgs,
    517                                     pszArgs ? pszArgs : "", NULL);
     519                                    (uNumArgs > 0) ? pszArgs : "", NULL);
     520    /* Did we get the same result? */
    518521    Assert(uNumArgs == pData->uNumArgs);
     522
    519523    if (RT_SUCCESS(rc))
    520524    {
     
    590594    VBoxServiceVerbose(3, "Control: Thread of process \"%s\" started.", pData->pszCmd);
    591595
     596    uint32_t u32ClientID;
     597    int rc = VbglR3GuestCtrlConnect(&u32ClientID);
     598    if (RT_SUCCESS(rc))
     599        VBoxServiceVerbose(3, "Control: Thread client ID: %#x\n", u32ClientID);
     600    else
     601    {
     602        VBoxServiceError("Control: Thread failed to connect to the guest control service! Error: %Rrc\n", rc);
     603        return rc;
     604    }
     605
    592606    /*
    593607     * Create the environment.
    594608     */
    595609    RTENV hEnv;
    596     int rc = RTEnvClone(&hEnv, RTENV_DEFAULT);
     610    rc = RTEnvClone(&hEnv, RTENV_DEFAULT);
    597611    if (RT_SUCCESS(rc))
    598612    {
     
    651665                                {
    652666                                    VBoxServiceVerbose(3, "Control: Process \"%s\" started.\n", pData->pszCmd);
     667                                    rc = VbglR3GuestCtrlExecReportStatus(u32ClientID, 123, PROC_STATUS_STARTED,
     668                                                                         0 /* u32Flags */, NULL, 0);
    653669                                    /** @todo Dump a bit more info here. */
    654670
     
    693709    }
    694710
     711    VbglR3GuestCtrlDisconnect(u32ClientID);
    695712    VBoxServiceVerbose(3, "Control: Thread of process \"%s\" ended with rc=%Rrc.\n", pData->pszCmd, rc);
    696713
  • trunk/src/VBox/HostServices/GuestControl/service.cpp

    r28206 r28218  
    505505    int rc = VINF_SUCCESS;
    506506
     507    HostCmd newCmd;
     508    rc = paramBufferAllocate(&newCmd.parmBuf, cParms, paParms);
     509    if (RT_SUCCESS(rc))
     510    {
     511        mHostCmds.push_back(newCmd);
     512   
     513        /* Limit list size by deleting oldest element. */
     514        if (mHostCmds.size() > 256) /** @todo Use a define! */
     515            mHostCmds.pop_front();
     516    }
     517
    507518    /* Some lazy guests to wake up which can process this command right now? */
    508519    if (!mGuestWaiters.empty())
     
    511522        rc = notifyGuest(&curCall, eFunction, cParms, paParms);
    512523        mGuestWaiters.pop_front();
    513     }
    514     else /* No guests waiting, buffer it */
    515     {
    516         HostCmd newCmd;
    517         rc = paramBufferAllocate(&newCmd.parmBuf, cParms, paParms);
    518         if (RT_SUCCESS(rc))
    519         {
    520             mHostCmds.push_back(newCmd);
    521        
    522             /* Limit list size by deleting oldest element. */
    523             if (mHostCmds.size() > 256) /** @todo Use a define! */
    524                 mHostCmds.pop_front();
    525         }
    526524    }
    527525    return rc;
  • trunk/src/VBox/Main/GuestImpl.cpp

    r28207 r28218  
    450450     */
    451451    PHOSTCALLBACKDATA pCBData = reinterpret_cast<PHOSTCALLBACKDATA>(pvParms);
     452    AssertPtr(pCBData);
    452453    AssertReturn(sizeof(HOSTCALLBACKDATA) == cbParms, VERR_INVALID_PARAMETER);
    453454    AssertReturn(HOSTCALLBACKMAGIC == pCBData->u32Magic, VERR_INVALID_PARAMETER);
     
    457458    int rc = VINF_SUCCESS;
    458459    Guest *pGuest = static_cast <Guest *>(pvExtension);
     460    AssertPtr(pGuest);
    459461
    460462    switch (u32Function)
    461463    {       
     464        case GUEST_EXEC_SEND_STATUS:
     465            LogFlowFunc(("GUEST_EXEC_SEND_STATUS\n"));
     466            break;
     467
    462468        default:
    463469            rc = VERR_NOT_SUPPORTED;
     
    614620                            cMsWait = RT_MIN(1000, aTimeoutMS - (uint32_t)cMsElapsed);
    615621                        }
     622                        RTThreadSleep(100);
    616623                    } while (!mSignalled);
    617624#if 0
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette