VirtualBox

Ignore:
Timestamp:
Oct 12, 2010 1:20:50 PM (14 years ago)
Author:
vboxsync
Message:

Guest Execution/Copy: Added support for input handling, added more code for data copying.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestCtrl.cpp

    r30013 r33064  
    105105VBGLR3DECL(int) VbglR3GuestCtrlGetHostMsg(uint32_t u32ClientId, uint32_t *puMsg, uint32_t *puNumParms)
    106106{
    107     AssertPtr(puMsg);
    108     AssertPtr(puNumParms);
     107    AssertPtrReturn(puMsg, VERR_INVALID_PARAMETER);
     108    AssertPtrReturn(puNumParms, VERR_INVALID_PARAMETER);
    109109
    110110    VBoxGuestCtrlHGCMMsgType Msg;
     
    178178                                              uint32_t *puTimeLimit)
    179179{
    180     AssertPtr(puContext);
    181     AssertPtr(pszCmd);
    182     AssertPtr(puFlags);
    183     AssertPtr(pszArgs);
    184     AssertPtr(puNumArgs);
    185     AssertPtr(pszEnv);
    186     AssertPtr(pcbEnv);
    187     AssertPtr(puNumEnvVars);
    188     AssertPtr(pszUser);
    189     AssertPtr(pszPassword);
    190     AssertPtr(puTimeLimit);
     180    AssertPtrReturn(puContext, VERR_INVALID_PARAMETER);
     181    AssertPtrReturn(pszCmd, VERR_INVALID_PARAMETER);
     182    AssertPtrReturn(puFlags, VERR_INVALID_PARAMETER);
     183    AssertPtrReturn(pszArgs, VERR_INVALID_PARAMETER);
     184    AssertPtrReturn(puNumArgs, VERR_INVALID_PARAMETER);
     185    AssertPtrReturn(pszEnv, VERR_INVALID_PARAMETER);
     186    AssertPtrReturn(pcbEnv, VERR_INVALID_PARAMETER);
     187    AssertPtrReturn(puNumEnvVars, VERR_INVALID_PARAMETER);
     188    AssertPtrReturn(pszUser, VERR_INVALID_PARAMETER);
     189    AssertPtrReturn(pszPassword, VERR_INVALID_PARAMETER);
     190    AssertPtrReturn(puTimeLimit, VERR_INVALID_PARAMETER);
    191191
    192192    VBoxGuestCtrlHGCMMsgExecCmd Msg;
     
    197197    Msg.hdr.cParms = uNumParms;
    198198
    199     VbglHGCMParmUInt32Set(&Msg.context, 0); /** @todo Put this some header struct! */
     199    VbglHGCMParmUInt32Set(&Msg.context, 0);
    200200    VbglHGCMParmPtrSet(&Msg.cmd, pszCmd, cbCmd);
    201201    VbglHGCMParmUInt32Set(&Msg.flags, 0);
     
    245245                                                    uint32_t *puHandle,       uint32_t *puFlags)
    246246{
    247     AssertPtr(puContext);
    248     AssertPtr(puPID);
     247    AssertPtrReturn(puContext, VERR_INVALID_PARAMETER);
     248    AssertPtrReturn(puPID, VERR_INVALID_PARAMETER);
     249    AssertPtrReturn(puHandle, VERR_INVALID_PARAMETER);
     250    AssertPtrReturn(puFlags, VERR_INVALID_PARAMETER);
    249251
    250252    VBoxGuestCtrlHGCMMsgExecOut Msg;
     
    255257    Msg.hdr.cParms = uNumParms;
    256258
    257     VbglHGCMParmUInt32Set(&Msg.context, 0); /** @todo Put this some header struct! */
     259    VbglHGCMParmUInt32Set(&Msg.context, 0);
    258260    VbglHGCMParmUInt32Set(&Msg.pid, 0);
    259261    VbglHGCMParmUInt32Set(&Msg.handle, 0);
     
    274276            Msg.handle.GetUInt32(puHandle);
    275277            Msg.flags.GetUInt32(puFlags);
     278        }
     279    }
     280    return rc;
     281}
     282
     283
     284/**
     285 * Retrieves the input data from host which then gets sent to the
     286 * started process.
     287 *
     288 * This will block until data becomes available.
     289 *
     290 * @returns VBox status code.
     291 * @param   u32ClientId     The client id returned by VbglR3GuestCtrlConnect().
     292 * @param   uNumParms
     293 ** @todo Docs!
     294 */
     295VBGLR3DECL(int) VbglR3GuestCtrlExecGetHostCmdInput(uint32_t  u32ClientId,    uint32_t   uNumParms,
     296                                                   uint32_t *puContext,      uint32_t  *puPID,
     297                                                   uint32_t *puFlags,
     298                                                   void      *pvData,        uint32_t  cbData,
     299                                                   uint32_t *pcbSize)
     300{
     301    AssertPtrReturn(puContext, VERR_INVALID_PARAMETER);
     302    AssertPtrReturn(puPID, VERR_INVALID_PARAMETER);
     303    AssertPtrReturn(puFlags, VERR_INVALID_PARAMETER);
     304    AssertPtrReturn(pvData, VERR_INVALID_PARAMETER);
     305    AssertPtrReturn(pcbSize, VERR_INVALID_PARAMETER);
     306
     307    VBoxGuestCtrlHGCMMsgExecIn Msg;
     308
     309    Msg.hdr.result = VERR_WRONG_ORDER;
     310    Msg.hdr.u32ClientID = u32ClientId;
     311    Msg.hdr.u32Function = GUEST_GET_HOST_MSG;
     312    Msg.hdr.cParms = uNumParms;
     313
     314    VbglHGCMParmUInt32Set(&Msg.context, 0);
     315    VbglHGCMParmUInt32Set(&Msg.pid, 0);
     316    VbglHGCMParmUInt32Set(&Msg.flags, 0);
     317    VbglHGCMParmPtrSet(&Msg.data, pvData, cbData);
     318    VbglHGCMParmUInt32Set(&Msg.size, 0);
     319
     320    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
     321    if (RT_SUCCESS(rc))
     322    {
     323        int rc2 = Msg.hdr.result;
     324        if (RT_FAILURE(rc2))
     325        {
     326            rc = rc2;
     327        }
     328        else
     329        {
     330            Msg.context.GetUInt32(puContext);
     331            Msg.pid.GetUInt32(puPID);
     332            Msg.flags.GetUInt32(puFlags);
     333            Msg.size.GetUInt32(pcbSize);
    276334        }
    277335    }
     
    355413}
    356414
     415
     416/**
     417 * Reports back the input status to the host.
     418 *
     419 * @returns VBox status code.
     420 ** @todo Docs!
     421 */
     422VBGLR3DECL(int) VbglR3GuestCtrlExecReportStatusIn(uint32_t     u32ClientId,
     423                                                  uint32_t     u32Context,
     424                                                  uint32_t     u32PID,
     425                                                  uint32_t     u32Flags,
     426                                                  uint32_t     cbWritten)
     427{
     428    VBoxGuestCtrlHGCMMsgExecStatusIn Msg;
     429
     430    Msg.hdr.result = VERR_WRONG_ORDER;
     431    Msg.hdr.u32ClientID = u32ClientId;
     432    Msg.hdr.u32Function = GUEST_EXEC_SEND_INPUT_STATUS;
     433    Msg.hdr.cParms = 4;
     434
     435    VbglHGCMParmUInt32Set(&Msg.context, u32Context);
     436    VbglHGCMParmUInt32Set(&Msg.pid, u32PID);
     437    VbglHGCMParmUInt32Set(&Msg.flags, u32Flags);
     438    VbglHGCMParmUInt32Set(&Msg.written, cbWritten);
     439
     440    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
     441    if (RT_SUCCESS(rc))
     442    {
     443        int rc2 = Msg.hdr.result;
     444        if (RT_FAILURE(rc2))
     445            rc = rc2;
     446    }
     447    return rc;
     448}
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