Changeset 17196 in vbox for trunk/src/VBox/Additions
- Timestamp:
- Feb 27, 2009 11:57:04 AM (16 years ago)
- Location:
- trunk/src/VBox/Additions/common
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r14462 r17196 1112 1112 1113 1113 1114 #ifdef RT_ARCH_AMD64 1115 /** The 32-bit version HGCM call for 64-bit driver. */ 1116 static int VBoxGuestCommonIOCtl_HGCMCall32(PVBOXGUESTDEVEXT pDevExt, 1117 PVBOXGUESTSESSION pSession, 1118 VBoxGuestHGCMCallInfo *pInfo, 1119 uint32_t cMillies, bool fInterruptible, 1120 size_t cbExtra, size_t cbData, size_t *pcbDataReturned) 1121 { 1122 /* 1123 * Some more validations. 1124 */ 1125 if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */ 1126 { 1127 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms)); 1128 return VERR_INVALID_PARAMETER; 1129 } 1130 const size_t cbActual = cbExtra + sizeof(*pInfo) + pInfo->cParms * sizeof(HGCMFunctionParameter32); 1131 if (cbData < cbActual) 1132 { 1133 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n", 1134 cbData, cbActual)); 1135 return VERR_INVALID_PARAMETER; 1136 } 1137 1138 /* 1139 * Validate the client id. 1140 */ 1141 const uint32_t u32ClientId = pInfo->u32ClientID; 1142 unsigned i; 1143 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1144 RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp); 1145 for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++) 1146 if (pSession->aHGCMClientIds[i] == u32ClientId) 1147 break; 1148 RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock, &Tmp); 1149 if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds))) 1150 { 1151 static unsigned s_cErrors = 0; 1152 if (s_cErrors++ > 32) 1153 LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId)); 1154 return VERR_INVALID_HANDLE; 1155 } 1156 1157 /* 1158 * The VbglHGCMCall call will invoke the callback if the HGCM 1159 * call is performed in an ASYNC fashion. This function can 1160 * deal with cancelled requests, so we let user more requests 1161 * be interruptible (should add a flag for this later I guess). 1162 */ 1163 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID)); 1164 int rc; 1165 if (fInterruptible) 1166 rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt, cMillies); 1167 else 1168 rc = VbglHGCMCall32(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, cMillies); 1169 if (RT_SUCCESS(rc)) 1170 { 1171 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: result=%Rrc\n", pInfo->result)); 1172 if (pcbDataReturned) 1173 *pcbDataReturned = cbActual; 1174 } 1175 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: Failed. rc=%Rrc.\n", rc)); 1176 return rc; 1177 } 1178 #endif 1179 1180 1114 1181 /** 1115 1182 * @returns VBox status code. Unlike the other HGCM IOCtls this will combine … … 1273 1340 RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned); 1274 1341 } 1342 # ifdef RT_ARCH_AMD64 1343 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_32(0))) 1344 { 1345 CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo)); 1346 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS; 1347 rc = VBoxGuestCommonIOCtl_HGCMCall32(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT, 1348 fInterruptible, 1349 0, cbData, pcbDataReturned); 1350 } 1351 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(0))) 1352 { 1353 CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed)); 1354 VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData; 1355 rc = VBoxGuestCommonIOCtl_HGCMCall32(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout, 1356 !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS, 1357 RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned); 1358 } 1359 # endif 1275 1360 #endif /* VBOX_WITH_HGCM */ 1276 1361 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_LOG(0))) … … 1302 1387 #ifdef VBOX_WITH_HGCM 1303 1388 case VBOXGUEST_IOCTL_HGCM_CONNECT: 1389 # ifdef RT_ARCH_AMD64 1390 case VBOXGUEST_IOCTL_HGCM_CONNECT_32: 1391 # endif 1304 1392 CHECKRET_MIN_SIZE("HGCM_CONNECT", sizeof(VBoxGuestHGCMConnectInfo)); 1305 1393 rc = VBoxGuestCommonIOCtl_HGCMConnect(pDevExt, pSession, (VBoxGuestHGCMConnectInfo *)pvData, pcbDataReturned); … … 1307 1395 1308 1396 case VBOXGUEST_IOCTL_HGCM_DISCONNECT: 1397 # ifdef RT_ARCH_AMD64 1398 case VBOXGUEST_IOCTL_HGCM_DISCONNECT_32: 1399 # endif 1309 1400 CHECKRET_MIN_SIZE("HGCM_DISCONNECT", sizeof(VBoxGuestHGCMDisconnectInfo)); 1310 1401 rc = VBoxGuestCommonIOCtl_HGCMDisconnect(pDevExt, pSession, (VBoxGuestHGCMDisconnectInfo *)pvData, pcbDataReturned); … … 1315 1406 rc = VBoxGuestCommonIOCtl_HGCMClipboardReConnect(pDevExt, (uint32_t *)pvData, pcbDataReturned); 1316 1407 break; 1408 1317 1409 #endif /* VBOX_WITH_HGCM */ 1318 1410 -
trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp
r14217 r17196 337 337 Hdr.cbData = cbData; 338 338 Hdr.pvDataR3 = pvData; 339 # if HC_ARCH_BITS == 32 340 Hdr.u32Padding = 0; 341 # endif 339 342 340 343 /** @todo test status code passing! */
Note:
See TracChangeset
for help on using the changeset viewer.