VirtualBox

Changeset 79297 in vbox


Ignore:
Timestamp:
Jun 24, 2019 9:51:42 AM (6 years ago)
Author:
vboxsync
Message:

Main,VBoxService,GstCtrlSvc: Added functions for exchanging feature masks between guest and host so new features can more easily be added without resorting to version comparsion magic. Added alternative read and write completion notifications that includes the new file offset. Made sure RTFileReadAt and RTFileWriteAt are followed by a RTFileSeek call so we'll end up with the same file position regardless of guest OS. bugref:9320

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/GuestControl/VBoxGuestControlSvc.cpp

    r79288 r79297  
    877877    /** List of prepared session (GstCtrlPreparedSession). */
    878878    RTLISTANCHOR            m_PreparedSessions;
     879    /** Guest feature flags, VBOX_GUESTCTRL_GF_0_XXX. */
     880    uint64_t                m_fGuestFeatures0;
     881    /** Guest feature flags, VBOX_GUESTCTRL_GF_1_XXX. */
     882    uint64_t                m_fGuestFeatures1;
    879883
    880884public:
     
    904908private:
    905909    int clientMakeMeMaster(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms);
     910    int clientReportFeatures(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
     911    int clientQueryFeatures(VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
    906912    int clientMsgPeek(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[], bool fWait);
    907913    int clientMsgGet(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
     
    925931
    926932
     933/** Host feature mask for GUEST_MSG_REPORT_FEATURES/GUEST_MSG_QUERY_FEATURES. */
     934static uint64_t const g_fGstCtrlHostFeatures0 = VBOX_GUESTCTRL_HF_0_NOTIFY_RDWR_OFFSET;
     935
     936
     937
    927938/**
    928939 * @interface_method_impl{VBOXHGCMSVCFNTABLE,pfnUnload,
     
    11411152    return VINF_HGCM_ASYNC_EXECUTE;
    11421153}
     1154
     1155
     1156/**
     1157 * Implements GUEST_MSG_REPORT_FEATURES.
     1158 *
     1159 * @returns VBox status code.
     1160 * @retval  VINF_HGCM_ASYNC_EXECUTE on success (we complete the message here).
     1161 * @retval  VERR_ACCESS_DENIED if not master
     1162 * @retval  VERR_INVALID_PARAMETER if bit 63 in the 2nd parameter isn't set.
     1163 * @retval  VERR_WRONG_PARAMETER_COUNT
     1164 *
     1165 * @param   pClient     The client state.
     1166 * @param   hCall       The client's call handle.
     1167 * @param   cParms      Number of parameters.
     1168 */
     1169int GstCtrlService::clientReportFeatures(ClientState *pClient, VBOXHGCMCALLHANDLE hCall,
     1170                                         uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     1171{
     1172    /*
     1173     * Validate the request.
     1174     */
     1175    ASSERT_GUEST_RETURN(cParms == 2, VERR_WRONG_PARAMETER_COUNT);
     1176    ASSERT_GUEST_RETURN(paParms[0].type == VBOX_HGCM_SVC_PARM_64BIT, VERR_WRONG_PARAMETER_TYPE);
     1177    uint64_t const fFeatures0 = paParms[0].u.uint64;
     1178    ASSERT_GUEST_RETURN(paParms[1].type == VBOX_HGCM_SVC_PARM_64BIT, VERR_WRONG_PARAMETER_TYPE);
     1179    uint64_t const fFeatures1 = paParms[1].u.uint64;
     1180    ASSERT_GUEST_RETURN(fFeatures1 & VBOX_GUESTCTRL_GF_1_MUST_BE_ONE, VERR_INVALID_PARAMETER);
     1181
     1182    ASSERT_GUEST_RETURN(pClient->m_fIsMaster, VERR_ACCESS_DENIED);
     1183
     1184    /*
     1185     * Do the work.
     1186     */
     1187    VBOXHGCMSVCPARM aCopyForMain[2] = { paParms[0], paParms[1] };
     1188
     1189    paParms[0].u.uint64 = g_fGstCtrlHostFeatures0;
     1190    paParms[1].u.uint64 = 0;
     1191
     1192    int rc = mpHelpers->pfnCallComplete(hCall, VINF_SUCCESS);
     1193    if (RT_SUCCESS(rc))
     1194    {
     1195        m_fGuestFeatures0 = fFeatures0;
     1196        m_fGuestFeatures1 = fFeatures1;
     1197        Log(("[Client %RU32] features: %#RX64 %#RX64\n", pClient->m_idClient, fFeatures0, fFeatures1));
     1198
     1199        /*
     1200         * Forward the info to main.
     1201         */
     1202        hostCallback(GUEST_MSG_REPORT_FEATURES, RT_ELEMENTS(aCopyForMain), aCopyForMain);
     1203    }
     1204    else
     1205        LogFunc(("pfnCallComplete -> %Rrc\n", rc));
     1206
     1207    return VINF_HGCM_ASYNC_EXECUTE;
     1208}
     1209
     1210
     1211/**
     1212 * Implements GUEST_MSG_QUERY_FEATURES.
     1213 *
     1214 * @returns VBox status code.
     1215 * @retval  VINF_HGCM_ASYNC_EXECUTE on success (we complete the message here).
     1216 * @retval  VERR_WRONG_PARAMETER_COUNT
     1217 *
     1218 * @param   pClient     The client state.
     1219 * @param   hCall       The client's call handle.
     1220 * @param   cParms      Number of parameters.
     1221 */
     1222int GstCtrlService::clientQueryFeatures(VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     1223{
     1224    /*
     1225     * Validate the request.
     1226     */
     1227    ASSERT_GUEST_RETURN(cParms == 2, VERR_WRONG_PARAMETER_COUNT);
     1228    ASSERT_GUEST_RETURN(paParms[0].type == VBOX_HGCM_SVC_PARM_64BIT, VERR_WRONG_PARAMETER_TYPE);
     1229    ASSERT_GUEST_RETURN(paParms[1].type == VBOX_HGCM_SVC_PARM_64BIT, VERR_WRONG_PARAMETER_TYPE);
     1230    ASSERT_GUEST(paParms[1].u.uint64 & RT_BIT_64(63));
     1231
     1232    /*
     1233     * Do the work.
     1234     */
     1235    paParms[0].u.uint64 = g_fGstCtrlHostFeatures0;
     1236    paParms[1].u.uint64 = 0;
     1237    int rc = mpHelpers->pfnCallComplete(hCall, VINF_SUCCESS);
     1238    if (RT_FAILURE(rc))
     1239        LogFunc(("pfnCallComplete -> %Rrc\n", rc));
     1240
     1241    return VINF_HGCM_ASYNC_EXECUTE;
     1242}
     1243
    11431244
    11441245/**
     
    20032104            rc = pThis->clientMakeMeMaster(pClient, hCall, cParms);
    20042105            break;
     2106        case GUEST_MSG_REPORT_FEATURES:
     2107            LogFlowFunc(("[Client %RU32] GUEST_MSG_REPORT_FEATURES\n", idClient));
     2108            rc = pThis->clientReportFeatures(pClient, hCall, cParms, paParms);
     2109            break;
     2110        case GUEST_MSG_QUERY_FEATURES:
     2111            LogFlowFunc(("[Client %RU32] GUEST_MSG_QUERY_FEATURES\n", idClient));
     2112            rc = pThis->clientQueryFeatures(hCall, cParms, paParms);
     2113            break;
    20052114        case GUEST_MSG_PEEK_NOWAIT:
    20062115            LogFlowFunc(("[Client %RU32] GUEST_MSG_PEEK_NOWAIT\n", idClient));
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