Changeset 40904 in vbox for trunk/src/VBox/HostDrivers/Support
- Timestamp:
- Apr 13, 2012 2:47:07 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77453
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r40899 r40904 1059 1059 1060 1060 1061 /** 1062 * I/O Control worker. 1061 1062 /** 1063 * I/O Control inner worker (tracing reasons). 1063 1064 * 1064 1065 * @returns IPRT status code. … … 1070 1071 * @param pReqHdr The request header. 1071 1072 */ 1072 int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr) 1073 { 1074 VBOXDRV_IOCTL_ENTRY(pSession, uIOCtl, pReqHdr); 1075 1076 /* 1077 * Validate the request. 1078 */ 1079 /* this first check could probably be omitted as its also done by the OS specific code... */ 1080 if (RT_UNLIKELY( (pReqHdr->fFlags & SUPREQHDR_FLAGS_MAGIC_MASK) != SUPREQHDR_FLAGS_MAGIC 1081 || pReqHdr->cbIn < sizeof(*pReqHdr) 1082 || pReqHdr->cbOut < sizeof(*pReqHdr))) 1083 { 1084 OSDBGPRINT(("vboxdrv: Bad ioctl request header; cbIn=%#lx cbOut=%#lx fFlags=%#lx\n", 1085 (long)pReqHdr->cbIn, (long)pReqHdr->cbOut, (long)pReqHdr->fFlags)); 1086 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1087 return VERR_INVALID_PARAMETER; 1088 } 1089 if (RT_UNLIKELY(!RT_VALID_PTR(pSession))) 1090 { 1091 OSDBGPRINT(("vboxdrv: Invalid pSession valud %p (ioctl=%p)\n", pSession, (void *)uIOCtl)); 1092 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1093 return VERR_INVALID_PARAMETER; 1094 } 1095 if (RT_UNLIKELY(uIOCtl == SUP_IOCTL_COOKIE)) 1096 { 1097 if (pReqHdr->u32Cookie != SUPCOOKIE_INITIAL_COOKIE) 1098 { 1099 OSDBGPRINT(("SUP_IOCTL_COOKIE: bad cookie %#lx\n", (long)pReqHdr->u32Cookie)); 1100 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1101 return VERR_INVALID_PARAMETER; 1102 } 1103 } 1104 else if (RT_UNLIKELY( pReqHdr->u32Cookie != pDevExt->u32Cookie 1105 || pReqHdr->u32SessionCookie != pSession->u32Cookie)) 1106 { 1107 OSDBGPRINT(("vboxdrv: bad cookie %#lx / %#lx.\n", (long)pReqHdr->u32Cookie, (long)pReqHdr->u32SessionCookie)); 1108 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1109 return VERR_INVALID_PARAMETER; 1110 } 1111 1112 /* 1113 * Validation macros 1114 */ 1073 static int supdrvIOCtlInner(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr) 1074 { 1075 /* 1076 * Validation macros 1077 */ 1115 1078 #define REQ_CHECK_SIZES_EX(Name, cbInExpect, cbOutExpect) \ 1116 1079 do { \ … … 1119 1082 OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld. cbOut=%ld expected %ld.\n", \ 1120 1083 (long)pReqHdr->cbIn, (long)(cbInExpect), (long)pReqHdr->cbOut, (long)(cbOutExpect))); \ 1121 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \1122 1084 return pReqHdr->rc = VERR_INVALID_PARAMETER; \ 1123 1085 } \ … … 1132 1094 OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld.\n", \ 1133 1095 (long)pReqHdr->cbIn, (long)(cbInExpect))); \ 1134 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \1135 1096 return pReqHdr->rc = VERR_INVALID_PARAMETER; \ 1136 1097 } \ … … 1143 1104 OSDBGPRINT(( #Name ": Invalid input/output sizes. cbOut=%ld expected %ld.\n", \ 1144 1105 (long)pReqHdr->cbOut, (long)(cbOutExpect))); \ 1145 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \1146 1106 return pReqHdr->rc = VERR_INVALID_PARAMETER; \ 1147 1107 } \ … … 1153 1113 { \ 1154 1114 OSDBGPRINT(( #Name ": %s\n", #expr)); \ 1155 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \1156 1115 return pReqHdr->rc = VERR_INVALID_PARAMETER; \ 1157 1116 } \ … … 1163 1122 { \ 1164 1123 OSDBGPRINT( fmt ); \ 1165 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \1166 1124 return pReqHdr->rc = VERR_INVALID_PARAMETER; \ 1167 1125 } \ … … 1181 1139 OSDBGPRINT(("SUP_IOCTL_COOKIE: invalid magic %.16s\n", pReq->u.In.szMagic)); 1182 1140 pReq->Hdr.rc = VERR_INVALID_MAGIC; 1183 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, VERR_INVALID_MAGIC);1184 1141 return 0; 1185 1142 } … … 1199 1156 pReq->u.Out.cFunctions = 0; 1200 1157 pReq->Hdr.rc = VERR_PERMISSION_DENIED; 1201 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, VERR_PERMISSION_DENIED);1202 1158 return 0; 1203 1159 } … … 1220 1176 pReq->u.Out.cFunctions = 0; 1221 1177 pReq->Hdr.rc = VERR_VERSION_MISMATCH; 1222 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1223 1178 return 0; 1224 1179 } … … 1237 1192 pReq->u.Out.cFunctions = sizeof(g_aFunctions) / sizeof(g_aFunctions[0]); 1238 1193 pReq->Hdr.rc = VINF_SUCCESS; 1239 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1240 1194 return 0; 1241 1195 } … … 1251 1205 memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions)); 1252 1206 pReq->Hdr.rc = VINF_SUCCESS; 1253 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1254 1207 return 0; 1255 1208 } … … 1268 1221 if (RT_FAILURE(pReq->Hdr.rc)) 1269 1222 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1270 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1271 1223 return 0; 1272 1224 } … … 1280 1232 /* execute */ 1281 1233 pReq->Hdr.rc = SUPR0UnlockMem(pSession, pReq->u.In.pvR3); 1282 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1283 1234 return 0; 1284 1235 } … … 1294 1245 if (RT_FAILURE(pReq->Hdr.rc)) 1295 1246 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1296 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1297 1247 return 0; 1298 1248 } … … 1306 1256 /* execute */ 1307 1257 pReq->Hdr.rc = SUPR0ContFree(pSession, (RTHCUINTPTR)pReq->u.In.pvR3); 1308 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1309 1258 return 0; 1310 1259 } … … 1327 1276 /* execute */ 1328 1277 pReq->Hdr.rc = supdrvIOCtl_LdrOpen(pDevExt, pSession, pReq); 1329 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1330 1278 return 0; 1331 1279 } … … 1368 1316 /* execute */ 1369 1317 pReq->Hdr.rc = supdrvIOCtl_LdrLoad(pDevExt, pSession, pReq); 1370 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1371 1318 return 0; 1372 1319 } … … 1380 1327 /* execute */ 1381 1328 pReq->Hdr.rc = supdrvIOCtl_LdrFree(pDevExt, pSession, pReq); 1382 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1383 1329 return 0; 1384 1330 } … … 1393 1339 /* execute */ 1394 1340 pReq->Hdr.rc = supdrvIOCtl_LdrGetSymbol(pDevExt, pSession, pReq); 1395 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1396 1341 return 0; 1397 1342 } … … 1437 1382 Log4(("SUP_IOCTL_CALL_VMMR0: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n", 1438 1383 pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf())); 1439 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1440 1384 return 0; 1441 1385 } … … 1469 1413 Log4(("SUP_IOCTL_CALL_VMMR0_BIG: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n", 1470 1414 pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf())); 1471 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1472 1415 return 0; 1473 1416 } … … 1482 1425 pReq->Hdr.rc = VINF_SUCCESS; 1483 1426 pReq->u.Out.enmMode = SUPR0GetPagingMode(); 1484 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1485 1427 return 0; 1486 1428 } … … 1497 1439 if (RT_FAILURE(pReq->Hdr.rc)) 1498 1440 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1499 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1500 1441 return 0; 1501 1442 } … … 1509 1450 /* execute */ 1510 1451 pReq->Hdr.rc = SUPR0LowFree(pSession, (RTHCUINTPTR)pReq->u.In.pvR3); 1511 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1512 1452 return 0; 1513 1453 } … … 1523 1463 if (RT_SUCCESS(pReq->Hdr.rc)) 1524 1464 pReq->u.Out.pGipR0 = pDevExt->pGip; 1525 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1526 1465 return 0; 1527 1466 } … … 1535 1474 /* execute */ 1536 1475 pReq->Hdr.rc = SUPR0GipUnmap(pSession); 1537 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1538 1476 return 0; 1539 1477 } … … 1551 1489 pSession->pVM = pReq->u.In.pVMR0; 1552 1490 pReq->Hdr.rc = VINF_SUCCESS; 1553 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1554 1491 return 0; 1555 1492 } … … 1575 1512 if (RT_FAILURE(pReq->Hdr.rc)) 1576 1513 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1577 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1578 1514 return 0; 1579 1515 } … … 1594 1530 if (RT_FAILURE(pReq->Hdr.rc)) 1595 1531 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1596 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1597 1532 return 0; 1598 1533 } … … 1611 1546 /* execute */ 1612 1547 pReq->Hdr.rc = SUPR0PageProtect(pSession, pReq->u.In.pvR3, pReq->u.In.pvR0, pReq->u.In.offSub, pReq->u.In.cbSub, pReq->u.In.fProt); 1613 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1614 1548 return 0; 1615 1549 } … … 1623 1557 /* execute */ 1624 1558 pReq->Hdr.rc = SUPR0PageFree(pSession, pReq->u.In.pvR3); 1625 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1626 1559 return 0; 1627 1560 } … … 1648 1581 /* execute */ 1649 1582 pReq->Hdr.rc = supdrvIOCtl_CallServiceModule(pDevExt, pSession, pReq); 1650 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1651 1583 return 0; 1652 1584 } … … 1671 1603 /* execute */ 1672 1604 pReq->Hdr.rc = supdrvIOCtl_LoggerSettings(pDevExt, pSession, pReq); 1673 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1674 1605 return 0; 1675 1606 } … … 1823 1754 if (RT_FAILURE(pReq->Hdr.rc)) 1824 1755 pReq->Hdr.cbOut = sizeof(pReq->Hdr); 1825 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1826 1756 return 0; 1827 1757 } … … 1835 1765 /* execute */ 1836 1766 pReq->Hdr.rc = supdrvIOCtl_TracerOpen(pDevExt, pSession, pReq->u.In.uCookie, pReq->u.In.uArg); 1837 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);1838 1767 return 0; 1839 1768 } … … 1846 1775 /* execute */ 1847 1776 pReqHdr->rc = supdrvIOCtl_TracerClose(pDevExt, pSession); 1848 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);1849 1777 return 0; 1850 1778 } … … 1858 1786 /* execute */ 1859 1787 pReqHdr->rc = supdrvIOCtl_TracerIOCtl(pDevExt, pSession, pReq->u.In.uCmd, pReq->u.In.uArg, &pReq->u.Out.iRetVal); 1860 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);1861 1788 return 0; 1862 1789 } … … 1866 1793 break; 1867 1794 } 1868 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_GENERAL_FAILURE, VERR_GENERAL_FAILURE);1869 1795 return VERR_GENERAL_FAILURE; 1796 } 1797 1798 1799 /** 1800 * I/O Control worker. 1801 * 1802 * @returns IPRT status code. 1803 * @retval VERR_INVALID_PARAMETER if the request is invalid. 1804 * 1805 * @param uIOCtl Function number. 1806 * @param pDevExt Device extention. 1807 * @param pSession Session data. 1808 * @param pReqHdr The request header. 1809 */ 1810 int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr) 1811 { 1812 int rc; 1813 VBOXDRV_IOCTL_ENTRY(pSession, uIOCtl, pReqHdr); 1814 1815 /* 1816 * Validate the request. 1817 */ 1818 /* this first check could probably be omitted as its also done by the OS specific code... */ 1819 if (RT_UNLIKELY( (pReqHdr->fFlags & SUPREQHDR_FLAGS_MAGIC_MASK) != SUPREQHDR_FLAGS_MAGIC 1820 || pReqHdr->cbIn < sizeof(*pReqHdr) 1821 || pReqHdr->cbOut < sizeof(*pReqHdr))) 1822 { 1823 OSDBGPRINT(("vboxdrv: Bad ioctl request header; cbIn=%#lx cbOut=%#lx fFlags=%#lx\n", 1824 (long)pReqHdr->cbIn, (long)pReqHdr->cbOut, (long)pReqHdr->fFlags)); 1825 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1826 return VERR_INVALID_PARAMETER; 1827 } 1828 if (RT_UNLIKELY(!RT_VALID_PTR(pSession))) 1829 { 1830 OSDBGPRINT(("vboxdrv: Invalid pSession valud %p (ioctl=%p)\n", pSession, (void *)uIOCtl)); 1831 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1832 return VERR_INVALID_PARAMETER; 1833 } 1834 if (RT_UNLIKELY(uIOCtl == SUP_IOCTL_COOKIE)) 1835 { 1836 if (pReqHdr->u32Cookie != SUPCOOKIE_INITIAL_COOKIE) 1837 { 1838 OSDBGPRINT(("SUP_IOCTL_COOKIE: bad cookie %#lx\n", (long)pReqHdr->u32Cookie)); 1839 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1840 return VERR_INVALID_PARAMETER; 1841 } 1842 } 1843 else if (RT_UNLIKELY( pReqHdr->u32Cookie != pDevExt->u32Cookie 1844 || pReqHdr->u32SessionCookie != pSession->u32Cookie)) 1845 { 1846 OSDBGPRINT(("vboxdrv: bad cookie %#lx / %#lx.\n", (long)pReqHdr->u32Cookie, (long)pReqHdr->u32SessionCookie)); 1847 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS); 1848 return VERR_INVALID_PARAMETER; 1849 } 1850 1851 /* 1852 * Hand it to an inner function to avoid lots of unnecessary return tracepoints 1853 */ 1854 rc = supdrvIOCtlInner(uIOCtl, pDevExt, pSession, pReqHdr); 1855 1856 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, pReqHdr->rc, rc); 1857 return rc; 1870 1858 } 1871 1859
Note:
See TracChangeset
for help on using the changeset viewer.