Changeset 14352 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Nov 19, 2008 2:10:24 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39566
- Location:
- trunk/src/VBox/Additions/common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r14316 r14352 389 389 pSession->aHGCMClientIds[i] = 0; 390 390 Log(("VBoxGuestCloseSession: disconnecting client id %#RX32\n", Info.u32ClientID)); 391 VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);391 VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 392 392 } 393 393 #endif … … 910 910 } 911 911 912 913 912 /** 914 913 * This is a callback for dealing with async waits. … … 918 917 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User) 919 918 { 920 const bool fInterruptible = (bool)u32User;921 919 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; 922 920 LogFunc(("requestType=%d\n", pHdr->header.requestType)); 923 VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, fInterruptible, RT_INDEFINITE_WAIT); 924 } 925 921 VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, 922 pDevExt, false /* fInterruptible */, 923 RT_INDEFINITE_WAIT); 924 } 926 925 927 926 /** … … 930 929 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 931 930 */ 932 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User) 931 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackInterruptible(VMMDevHGCMRequestHeader *pHdr, 932 void *pvUser, uint32_t u32User) 933 933 { 934 934 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; 935 935 LogFunc(("requestType=%d\n", pHdr->header.requestType)); 936 VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, true /* fInterruptible */, u32User); 937 } 938 939 940 /** 941 * This is an uninterruptible callback for dealing with async waits with a timeout. 942 * 943 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 944 */ 945 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User) 946 { 947 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; 948 LogFunc(("requestType=%d\n", pHdr->header.requestType)); 949 VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, false /* fInterruptible */, u32User); 950 } 951 936 VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, 937 pDevExt, true /* fInterruptible */, 938 u32User); 939 } 952 940 953 941 static int VBoxGuestCommonIOCtl_HGCMConnect(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMConnectInfo *pInfo, … … 963 951 ? pInfo->Loc.u.host.achName : "<not local host>")); 964 952 965 int rc = VbglHGCMConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);953 int rc = VbglHGCMConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 966 954 if (RT_SUCCESS(rc)) 967 955 { … … 993 981 Info.result = 0; 994 982 Info.u32ClientID = pInfo->u32ClientID; 995 VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);983 VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 996 984 return VERR_TOO_MANY_OPEN_FILES; 997 985 } … … 1035 1023 */ 1036 1024 Log(("VBoxGuestCommonIOCtl: HGCM_DISCONNECT: u32Client=%RX32\n", pInfo->u32ClientID)); 1037 int rc = VbglHGCMDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);1025 int rc = VbglHGCMDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 1038 1026 if (RT_SUCCESS(rc)) 1039 1027 { … … 1053 1041 1054 1042 1055 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCallTimeout. */ 1056 static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfo *pInfo, 1043 static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt, 1044 PVBOXGUESTSESSION pSession, 1045 VBoxGuestHGCMCallInfo *pInfo, 1046 uint32_t u32Timeout, bool fInterruptible, 1057 1047 size_t cbData, size_t *pcbDataReturned) 1058 1048 { … … 1099 1089 */ 1100 1090 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID)); 1101 int rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, pSession->R0Process != NIL_RTR0PROCESS); 1091 int rc; 1092 if (fInterruptible) 1093 rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, 1094 u32Timeout); 1095 else 1096 rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, u32Timeout); 1102 1097 if (RT_SUCCESS(rc)) 1103 1098 { … … 1110 1105 } 1111 1106 1112 1113 # ifdef HGCM_TIMEOUT1114 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall.1115 * @todo r=bird: merge the two. */1116 static int VBoxGuestCommonIOCtl_HGCMCallTimeout(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfoTimeout *pInfoTimeout,1117 size_t cbData, size_t *pcbDataReturned)1118 {1119 VBoxGuestHGCMCallInfo *pInfo = &pInfoTimeout->info;1120 /*1121 * Some more validations.1122 */1123 if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */1124 {1125 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));1126 return VERR_INVALID_PARAMETER;1127 }1128 const size_t cbActual = sizeof(*pInfoTimeout) + pInfo->cParms * sizeof(HGCMFunctionParameter);1129 if (cbData < cbActual)1130 {1131 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",1132 cbData, cbActual));1133 return VERR_INVALID_PARAMETER;1134 }1135 1136 /*1137 * Validate the client id.1138 */1139 const uint32_t u32ClientId = pInfo->u32ClientID;1140 unsigned i;1141 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;1142 RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp);1143 for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++)1144 if (pSession->aHGCMClientIds[i] == u32ClientId)1145 break;1146 RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock, &Tmp);1147 if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds)))1148 {1149 static unsigned s_cErrors = 0;1150 if (s_cErrors++ > 32)1151 LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId));1152 return VERR_INVALID_HANDLE;1153 }1154 1155 /*1156 * The VbglHGCMCall call will invoke the callback if the HGCM1157 * call is performed in an ASYNC fashion. This function can1158 * deal with cancelled requests, so we let user more requests1159 * be interruptible (should add a flag for this later I guess).1160 */1161 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));1162 int rc;1163 if (pSession->R0Process == NIL_RTR0PROCESS)1164 rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeout, pDevExt, pInfoTimeout->u32Timeout);1165 else1166 rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible, pDevExt,1167 pInfoTimeout->u32Timeout);1168 if (RT_SUCCESS(rc))1169 {1170 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: result=%Rrc\n", pInfo->result));1171 if (pcbDataReturned)1172 *pcbDataReturned = cbActual;1173 }1174 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: Failed. rc=%Rrc.\n", rc));1175 return rc;1176 }1177 # endif /* HGCM_TIMEOUT */1178 1179 1180 1107 /** 1181 1108 * @returns VBox status code. Unlike the other HGCM IOCtls this will combine … … 1196 1123 Info.result = (uint32_t)VERR_WRONG_ORDER; /** @todo Vitali, why is this member unsigned? */ 1197 1124 Info.u32ClientID = pDevExt->u32ClipboardClientId; 1198 rc = VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, 0);1125 rc = VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 1199 1126 if (RT_SUCCESS(rc)) 1200 1127 { … … 1219 1146 Info.result = (uint32_t)VERR_WRONG_ORDER; 1220 1147 1221 rc = VbglHGCMConnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, 0);1148 rc = VbglHGCMConnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 1222 1149 if (RT_FAILURE(rc)) 1223 1150 { … … 1323 1250 * These ones are tricky and can be done later. 1324 1251 */ 1325 /**@todo r=bird: Merge the handling of these two. The only difference is that the 2nd has one or two extra argument preceeding the call info. */1326 1252 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0))) 1327 1253 { 1328 1254 CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo)); 1329 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, cbData, pcbDataReturned); 1330 } 1331 # ifdef HGCM_TIMEOUT 1332 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(0))) 1333 { 1334 CHECKRET_MIN_SIZE("HGCM_CALL_TIMEOUT", sizeof(VBoxGuestHGCMCallInfoTimeout)); 1335 rc = VBoxGuestCommonIOCtl_HGCMCallTimeout(pDevExt, pSession, (VBoxGuestHGCMCallInfoTimeout *)pvData, cbData, pcbDataReturned); 1336 } 1337 # endif /* HGCM_TIMEOUT */ 1255 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS; 1256 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, 1257 RT_INDEFINITE_WAIT, fInterruptible, 1258 cbData, pcbDataReturned); 1259 } 1260 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0))) 1261 { 1262 CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed)); 1263 VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData; 1264 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, 1265 pInfo->u32Timeout, !!pInfo->fInterruptible, 1266 cbData, pcbDataReturned); 1267 } 1338 1268 #endif /* VBOX_WITH_HGCM */ 1339 1269 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_LOG(0))) -
trunk/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp
r14207 r14352 187 187 } 188 188 189 DECLVBGL(int) VbglHGCMCallTime out(VBGLHGCMHANDLE handle,190 VBoxGuestHGCMCallInfoTimeout*pData, uint32_t cbData)189 DECLVBGL(int) VbglHGCMCallTimed (VBGLHGCMHANDLE handle, 190 VBoxGuestHGCMCallInfoTimed *pData, uint32_t cbData) 191 191 { 192 192 int rc = VINF_SUCCESS; 193 193 194 VBGL_HGCM_ASSERTMsg(cbData >= sizeof (VBoxGuestHGCMCallInfoTimeout) + pData->info.cParms * sizeof (HGCMFunctionParameter), 195 ("cbData = %d, cParms = %d (calculated size %d)\n", cbData, pData->info.cParms, sizeof (VBoxGuestHGCMCallInfoTimeout) + pData->info.cParms * sizeof (VBoxGuestHGCMCallInfo))); 196 197 if (pData->u32Timeout == RT_INDEFINITE_WAIT) 198 { 199 uint32_t cbDataNew = cbData - RT_OFFSETOF(VBoxGuestHGCMCallInfoTimeout, info); 200 rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL(cbDataNew), &pData->info, 201 cbDataNew); 202 } 203 else 204 rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(cbData), pData, cbData); 194 uint32_t cbExpected = sizeof (VBoxGuestHGCMCallInfoTimed) 195 + pData->info.cParms * sizeof (HGCMFunctionParameter); 196 VBGL_HGCM_ASSERTMsg(cbData >= cbExpected, 197 ("cbData = %d, cParms = %d (calculated size %d)\n", 198 cbData, pData->info.cParms, cbExpected)); 199 200 rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL_TIMED(cbData), 201 pData, cbData); 205 202 206 203 return rc; -
trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp
r14214 r14352 846 846 Msg.size.SetUInt32(0); 847 847 848 int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL_TIME OUT(sizeof(Msg)), &Msg, sizeof(Msg));848 int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(sizeof(Msg)), &Msg, sizeof(Msg)); 849 849 if (RT_SUCCESS(rc)) 850 850 rc = Msg.hdr.info.result;
Note:
See TracChangeset
for help on using the changeset viewer.