VirtualBox

Changeset 43462 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Sep 28, 2012 10:46:41 AM (12 years ago)
Author:
vboxsync
Message:

HGCM Host Channel service: implemented a generic Query function.

File:
1 edited

Legend:

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

    r43346 r43462  
    276276    return rc;
    277277}
     278
     279VBGLR3DECL(int) VbglR3HostChannelQuery(const char *pszName,
     280                                       uint32_t u32HGCMClientId,
     281                                       uint32_t u32Code,
     282                                       void *pvParm,
     283                                       uint32_t cbParm,
     284                                       void *pvData,
     285                                       uint32_t cbData,
     286                                       uint32_t *pu32SizeDataReturned)
     287{
     288    /* Make a heap copy of the name, because HGCM can not use some of other memory types. */
     289    size_t cbName = strlen(pszName) + 1;
     290    char *pszCopy = (char *)RTMemAlloc(cbName);
     291    if (pszCopy == NULL)
     292    {
     293        return VERR_NO_MEMORY;
     294    }
     295
     296    memcpy(pszCopy, pszName, cbName);
     297
     298    VBoxHostChannelQuery parms;
     299
     300    parms.hdr.result = VERR_WRONG_ORDER;
     301    parms.hdr.u32ClientID = u32HGCMClientId;
     302    parms.hdr.u32Function = VBOX_HOST_CHANNEL_FN_QUERY;
     303    parms.hdr.cParms = 5;
     304
     305    VbglHGCMParmPtrSet(&parms.name, pszCopy, (uint32_t)cbName);
     306    VbglHGCMParmUInt32Set(&parms.code, u32Code);
     307    VbglHGCMParmPtrSet(&parms.parm, pvParm, cbParm);
     308    VbglHGCMParmPtrSet(&parms.data, pvData, cbData);
     309    VbglHGCMParmUInt32Set(&parms.sizeDataReturned, 0);
     310
     311    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(parms)), &parms, sizeof(parms));
     312
     313    if (RT_SUCCESS(rc))
     314    {
     315        rc = parms.hdr.result;
     316
     317        if (RT_SUCCESS(rc))
     318        {
     319            *pu32SizeDataReturned = parms.sizeDataReturned.u.value32;
     320        }
     321    }
     322
     323    RTMemFree(pszCopy);
     324
     325    return rc;
     326}
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