Changeset 79297 in vbox
- Timestamp:
- Jun 24, 2019 9:51:42 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/GuestControl/VBoxGuestControlSvc.cpp
r79288 r79297 877 877 /** List of prepared session (GstCtrlPreparedSession). */ 878 878 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; 879 883 880 884 public: … … 904 908 private: 905 909 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[]); 906 912 int clientMsgPeek(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[], bool fWait); 907 913 int clientMsgGet(ClientState *pClient, VBOXHGCMCALLHANDLE hCall, uint32_t cParms, VBOXHGCMSVCPARM paParms[]); … … 925 931 926 932 933 /** Host feature mask for GUEST_MSG_REPORT_FEATURES/GUEST_MSG_QUERY_FEATURES. */ 934 static uint64_t const g_fGstCtrlHostFeatures0 = VBOX_GUESTCTRL_HF_0_NOTIFY_RDWR_OFFSET; 935 936 937 927 938 /** 928 939 * @interface_method_impl{VBOXHGCMSVCFNTABLE,pfnUnload, … … 1141 1152 return VINF_HGCM_ASYNC_EXECUTE; 1142 1153 } 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 */ 1169 int 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 */ 1222 int 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 1143 1244 1144 1245 /** … … 2003 2104 rc = pThis->clientMakeMeMaster(pClient, hCall, cParms); 2004 2105 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; 2005 2114 case GUEST_MSG_PEEK_NOWAIT: 2006 2115 LogFlowFunc(("[Client %RU32] GUEST_MSG_PEEK_NOWAIT\n", idClient));
Note:
See TracChangeset
for help on using the changeset viewer.