Changeset 17196 in vbox
- Timestamp:
- Feb 27, 2009 11:57:04 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 43488
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/include/VBox/VBoxGuest.h ¶
r15810 r17196 36 36 # include <iprt/stdarg.h> 37 37 #endif 38 #include <iprt/assert.h> 38 39 #include <VBox/err.h> 39 40 #include <VBox/ostypes.h> … … 238 239 uint32_t reserved2; 239 240 } VMMDevRequestHeader; 241 AssertCompileSize(VMMDevRequestHeader, 24); 240 242 241 243 /** mouse status request structure */ … … 640 642 int32_t result; 641 643 } VMMDevHGCMRequestHeader; 644 AssertCompileSize(VMMDevHGCMRequestHeader, 24+8); 642 645 643 646 /** HGCM service location types. */ … … 1227 1230 /** The user address of the data buffer. */ 1228 1231 RTR3PTR pvDataR3; 1232 #if HC_ARCH_BITS == 32 1233 uint32_t u32Padding; 1234 #endif 1229 1235 } VBGLBIGREQ; 1230 1236 /** Pointer to a request wrapper for solaris guests. */ … … 1287 1293 #endif /* RT_ARCH_AMD64 */ 1288 1294 1289 /** IOCTL to VBoxGuest to query the VMMDev IO port region start. */ 1295 /** IOCTL to VBoxGuest to query the VMMDev IO port region start. 1296 * @remarks Ring-0 only. */ 1290 1297 #define VBOXGUEST_IOCTL_GETVMMDEVPORT VBOXGUEST_IOCTL_CODE(1, sizeof(VBoxGuestPortInfo)) 1291 1298 … … 1298 1305 1299 1306 /** IOCTL to VBoxGuest to wait for a VMMDev host notification */ 1300 #define VBOXGUEST_IOCTL_WAITEVENT VBOXGUEST_IOCTL_CODE (2, sizeof(VBoxGuestWaitEventInfo))1307 #define VBOXGUEST_IOCTL_WAITEVENT VBOXGUEST_IOCTL_CODE_(2, sizeof(VBoxGuestWaitEventInfo)) 1301 1308 1302 1309 /** IOCTL to VBoxGuest to interrupt (cancel) any pending WAITEVENTs and return. 1303 1310 * Handled inside the guest additions and not seen by the host at all. 1304 1311 * @see VBOXGUEST_IOCTL_WAITEVENT */ 1305 #define VBOXGUEST_IOCTL_CANCEL_ALL_WAITEVENTS VBOXGUEST_IOCTL_CODE (5, 0)1312 #define VBOXGUEST_IOCTL_CANCEL_ALL_WAITEVENTS VBOXGUEST_IOCTL_CODE_(5, 0) 1306 1313 1307 1314 /** @name Result codes for VBoxGuestWaitEventInfo::u32Result … … 1330 1337 uint32_t u32EventFlagsOut; 1331 1338 } VBoxGuestWaitEventInfo; 1339 AssertCompileSize(VBoxGuestWaitEventInfo, 16); 1332 1340 1333 1341 /** IOCTL to VBoxGuest to perform a VMM request 1334 1342 * @remark The data buffer for this IOCtl has an variable size, keep this in mind 1335 1343 * on systems where this matters. */ 1336 #define VBOXGUEST_IOCTL_VMMREQUEST(Size) VBOXGUEST_IOCTL_CODE (3, (Size))1344 #define VBOXGUEST_IOCTL_VMMREQUEST(Size) VBOXGUEST_IOCTL_CODE_(3, (Size)) 1337 1345 1338 1346 /** Input and output buffer layout of the IOCTL_VBOXGUEST_CTL_FILTER_MASK. */ … … 1342 1350 uint32_t u32NotMask; 1343 1351 } VBoxGuestFilterMaskInfo; 1352 AssertCompileSize(VBoxGuestFilterMaskInfo, 8); 1344 1353 #pragma pack() 1345 1354 1346 1355 /** IOCTL to VBoxGuest to control event filter mask. */ 1347 #define VBOXGUEST_IOCTL_CTL_FILTER_MASK VBOXGUEST_IOCTL_CODE (4, sizeof(VBoxGuestFilterMaskInfo))1356 #define VBOXGUEST_IOCTL_CTL_FILTER_MASK VBOXGUEST_IOCTL_CODE_(4, sizeof(VBoxGuestFilterMaskInfo)) 1348 1357 1349 1358 /** IOCTL to VBoxGuest to check memory ballooning. */ 1350 #define VBOXGUEST_IOCTL_CTL_CHECK_BALLOON_MASK VBOXGUEST_IOCTL_CODE (7, 100)1359 #define VBOXGUEST_IOCTL_CTL_CHECK_BALLOON_MASK VBOXGUEST_IOCTL_CODE_(7, 100) 1351 1360 1352 1361 /** IOCTL to VBoxGuest to perform backdoor logging. */ 1353 #define VBOXGUEST_IOCTL_LOG(Size) VBOXGUEST_IOCTL_CODE (6, (Size))1362 #define VBOXGUEST_IOCTL_LOG(Size) VBOXGUEST_IOCTL_CODE_(6, (Size)) 1354 1363 1355 1364 … … 1365 1374 uint32_t u32ClientID; /**< OUT */ 1366 1375 } VBoxGuestHGCMConnectInfo; 1376 AssertCompileSize(VBoxGuestHGCMConnectInfo, 4+4+128+4); 1367 1377 1368 1378 typedef struct _VBoxGuestHGCMDisconnectInfo … … 1371 1381 uint32_t u32ClientID; /**< IN */ 1372 1382 } VBoxGuestHGCMDisconnectInfo; 1383 AssertCompileSize(VBoxGuestHGCMDisconnectInfo, 8); 1373 1384 1374 1385 typedef struct _VBoxGuestHGCMCallInfo … … 1380 1391 /* Parameters follow in form HGCMFunctionParameter aParms[cParms] */ 1381 1392 } VBoxGuestHGCMCallInfo; 1393 AssertCompileSize(VBoxGuestHGCMCallInfo, 16); 1382 1394 1383 1395 typedef struct _VBoxGuestHGCMCallInfoTimed … … 1389 1401 /* Parameters follow in form HGCMFunctionParameter aParms[cParms] */ 1390 1402 } VBoxGuestHGCMCallInfoTimed; 1403 AssertCompileSize(VBoxGuestHGCMCallInfoTimed, 8+16); 1391 1404 # pragma pack() 1392 1405 … … 1395 1408 # define VBOXGUEST_IOCTL_HGCM_CALL(Size) VBOXGUEST_IOCTL_CODE(18, (Size)) 1396 1409 # define VBOXGUEST_IOCTL_HGCM_CALL_TIMED(Size) VBOXGUEST_IOCTL_CODE(20, (Size)) 1397 # define VBOXGUEST_IOCTL_CLIPBOARD_CONNECT VBOXGUEST_IOCTL_CODE (19, sizeof(uint32_t))1398 # ifdef RT_ARCH_AMD641410 # define VBOXGUEST_IOCTL_CLIPBOARD_CONNECT VBOXGUEST_IOCTL_CODE_(19, sizeof(uint32_t)) 1411 # ifdef RT_ARCH_AMD64 1399 1412 /* Following HGCM IOCtls can be used by a 32 bit application on a 64 bit guest (Windows OpenGL guest driver). */ 1400 # define VBOXGUEST_IOCTL_HGCM_CONNECT_32 VBOXGUEST_IOCTL_CODE_32(16, sizeof(VBoxGuestHGCMConnectInfo)) 1401 # define VBOXGUEST_IOCTL_HGCM_DISCONNECT_32 VBOXGUEST_IOCTL_CODE_32(17, sizeof(VBoxGuestHGCMDisconnectInfo)) 1402 # define VBOXGUEST_IOCTL_HGCM_CALL_32(Size) VBOXGUEST_IOCTL_CODE_32(18, (Size)) 1403 #endif /* RT_ARCH_AMD64 */ 1413 # define VBOXGUEST_IOCTL_HGCM_CONNECT_32 VBOXGUEST_IOCTL_CODE_32(16, sizeof(VBoxGuestHGCMConnectInfo)) 1414 # define VBOXGUEST_IOCTL_HGCM_DISCONNECT_32 VBOXGUEST_IOCTL_CODE_32(17, sizeof(VBoxGuestHGCMDisconnectInfo)) 1415 # define VBOXGUEST_IOCTL_HGCM_CALL_32(Size) VBOXGUEST_IOCTL_CODE_32(18, (Size)) 1416 # define VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(Size) VBOXGUEST_IOCTL_CODE_32(20, (Size)) 1417 # endif /* RT_ARCH_AMD64 */ 1404 1418 1405 1419 # define VBOXGUEST_HGCM_CALL_PARMS(a) ((HGCMFunctionParameter *)((uint8_t *)(a) + sizeof (VBoxGuestHGCMCallInfo))) -
TabularUnified 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 -
TabularUnified 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.