- Timestamp:
- Nov 6, 2018 12:57:54 PM (6 years ago)
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp
r75053 r75282 138 138 static int supdrvIOCtl_LdrFree(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRFREE pReq); 139 139 static int supdrvIOCtl_LdrLockDown(PSUPDRVDEVEXT pDevExt); 140 static int supdrvIOCtl_Ldr GetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq);140 static int supdrvIOCtl_LdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq); 141 141 static int supdrvIDC_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQGETSYM pReq); 142 142 static int supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx); … … 1803 1803 1804 1804 /* execute */ 1805 pReq->Hdr.rc = supdrvIOCtl_Ldr GetSymbol(pDevExt, pSession, pReq);1805 pReq->Hdr.rc = supdrvIOCtl_LdrQuerySymbol(pDevExt, pSession, pReq); 1806 1806 return 0; 1807 1807 } … … 5152 5152 5153 5153 /* 5154 * Allocate and copy the tables .5154 * Allocate and copy the tables if non-native. 5155 5155 * (No need to do try/except as this is a buffered request.) 5156 5156 */ 5157 pImage->cbStrTab = pReq->u.In.cbStrTab; 5158 if (pImage->cbStrTab) 5159 { 5160 pImage->pachStrTab = (char *)RTMemAlloc(pImage->cbStrTab); 5161 if (pImage->pachStrTab) 5162 memcpy(pImage->pachStrTab, &pReq->u.In.abImage[pReq->u.In.offStrTab], pImage->cbStrTab); 5163 else 5164 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for string table: %#x", pImage->cbStrTab); 5165 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 5166 } 5167 5168 pImage->cSymbols = pReq->u.In.cSymbols; 5169 if (RT_SUCCESS(rc) && pImage->cSymbols) 5170 { 5171 size_t cbSymbols = pImage->cSymbols * sizeof(SUPLDRSYM); 5172 pImage->paSymbols = (PSUPLDRSYM)RTMemAlloc(cbSymbols); 5173 if (pImage->paSymbols) 5174 memcpy(pImage->paSymbols, &pReq->u.In.abImage[pReq->u.In.offSymbols], cbSymbols); 5175 else 5176 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for symbol table: %#x", cbSymbols); 5177 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 5157 if (pImage->fNative) 5158 { 5159 pImage->cbStrTab = pReq->u.In.cbStrTab; 5160 if (pImage->cbStrTab) 5161 { 5162 pImage->pachStrTab = (char *)RTMemAlloc(pImage->cbStrTab); 5163 if (pImage->pachStrTab) 5164 memcpy(pImage->pachStrTab, &pReq->u.In.abImage[pReq->u.In.offStrTab], pImage->cbStrTab); 5165 else 5166 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for string table: %#x", pImage->cbStrTab); 5167 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 5168 } 5169 5170 pImage->cSymbols = pReq->u.In.cSymbols; 5171 if (RT_SUCCESS(rc) && pImage->cSymbols) 5172 { 5173 size_t cbSymbols = pImage->cSymbols * sizeof(SUPLDRSYM); 5174 pImage->paSymbols = (PSUPLDRSYM)RTMemAlloc(cbSymbols); 5175 if (pImage->paSymbols) 5176 memcpy(pImage->paSymbols, &pReq->u.In.abImage[pReq->u.In.offSymbols], cbSymbols); 5177 else 5178 rc = supdrvLdrLoadError(VERR_NO_MEMORY, pReq, "Out of memory for symbol table: %#x", cbSymbols); 5179 SUPDRV_CHECK_SMAP_CHECK(pDevExt, RT_NOTHING); 5180 } 5178 5181 } 5179 5182 … … 5401 5404 5402 5405 /** 5403 * Gets the address of a symbol in an open image.5406 * Queries the address of a symbol in an open image. 5404 5407 * 5405 5408 * @returns IPRT status code. … … 5408 5411 * @param pReq The request buffer. 5409 5412 */ 5410 static int supdrvIOCtl_Ldr GetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq)5413 static int supdrvIOCtl_LdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq) 5411 5414 { 5412 5415 PSUPDRVLDRIMAGE pImage; … … 5418 5421 void *pvSymbol = NULL; 5419 5422 int rc = VERR_SYMBOL_NOT_FOUND; 5420 Log3(("supdrvIOCtl_Ldr GetSymbol: pvImageBase=%p szSymbol=\"%s\"\n", pReq->u.In.pvImageBase, pReq->u.In.szSymbol));5423 Log3(("supdrvIOCtl_LdrQuerySymbol: pvImageBase=%p szSymbol=\"%s\"\n", pReq->u.In.pvImageBase, pReq->u.In.szSymbol)); 5421 5424 5422 5425 /* … … 5443 5446 5444 5447 /* 5445 * Search the symbol strings.5448 * Search the image exports / symbol strings. 5446 5449 * 5447 5450 * Note! The int32_t is for native loading on solaris where the data 5448 5451 * and text segments are in very different places. 5449 5452 */ 5450 pchStrings = pImage->pachStrTab; 5451 paSyms = pImage->paSymbols; 5452 for (i = 0; i < pImage->cSymbols; i++) 5453 { 5454 if ( paSyms[i].offName + cbSymbol <= pImage->cbStrTab 5455 && !memcmp(pchStrings + paSyms[i].offName, pReq->u.In.szSymbol, cbSymbol)) 5456 { 5457 pvSymbol = (uint8_t *)pImage->pvImage + (int32_t)paSyms[i].offSymbol; 5458 rc = VINF_SUCCESS; 5459 break; 5453 if (pImage->fNative) 5454 rc = supdrvOSLdrQuerySymbol(pDevExt, pImage, pReq->u.In.szSymbol, cbSymbol - 1, &pvSymbol); 5455 else 5456 { 5457 pchStrings = pImage->pachStrTab; 5458 paSyms = pImage->paSymbols; 5459 for (i = 0; i < pImage->cSymbols; i++) 5460 { 5461 if ( paSyms[i].offName + cbSymbol <= pImage->cbStrTab 5462 && !memcmp(pchStrings + paSyms[i].offName, pReq->u.In.szSymbol, cbSymbol)) 5463 { 5464 pvSymbol = (uint8_t *)pImage->pvImage + (int32_t)paSyms[i].offSymbol; 5465 rc = VINF_SUCCESS; 5466 break; 5467 } 5460 5468 } 5461 5469 } … … 5529 5537 { 5530 5538 /* 5531 * Search the symbol strings.5539 * Search the image exports / symbol strings. 5532 5540 */ 5533 const char *pchStrings = pImage->pachStrTab; 5534 PCSUPLDRSYM paSyms = pImage->paSymbols; 5535 for (i = 0; i < pImage->cSymbols; i++) 5536 { 5537 if ( paSyms[i].offName + cbSymbol <= pImage->cbStrTab 5538 && !memcmp(pchStrings + paSyms[i].offName, pszSymbol, cbSymbol)) 5541 if (pImage->fNative) 5542 { 5543 rc = supdrvOSLdrQuerySymbol(pDevExt, pImage, pszSymbol, cbSymbol - 1, (void **)&pReq->u.Out.pfnSymbol); 5544 if (RT_SUCCESS(rc)) 5545 rc = supdrvLdrAddUsage(pSession, pImage); 5546 } 5547 else 5548 { 5549 const char *pchStrings = pImage->pachStrTab; 5550 PCSUPLDRSYM paSyms = pImage->paSymbols; 5551 rc = VERR_SYMBOL_NOT_FOUND; 5552 for (i = 0; i < pImage->cSymbols; i++) 5539 5553 { 5540 /* 5541 * Found it! Calc the symbol address and add a reference to the module. 5542 */ 5543 pReq->u.Out.pfnSymbol = (PFNRT)((uintptr_t)pImage->pvImage + (int32_t)paSyms[i].offSymbol); 5544 rc = supdrvLdrAddUsage(pSession, pImage); 5545 break; 5554 if ( paSyms[i].offName + cbSymbol <= pImage->cbStrTab 5555 && !memcmp(pchStrings + paSyms[i].offName, pszSymbol, cbSymbol)) 5556 { 5557 /* 5558 * Found it! Calc the symbol address and add a reference to the module. 5559 */ 5560 pReq->u.Out.pfnSymbol = (PFNRT)((uintptr_t)pImage->pvImage + (int32_t)paSyms[i].offSymbol); 5561 rc = supdrvLdrAddUsage(pSession, pImage); 5562 break; 5563 } 5546 5564 } 5547 5565 } -
trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h
r75053 r75282 946 946 int VBOXCALL supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, PSUPLDRLOAD pReq); 947 947 948 949 948 /** 950 949 * Unload the image (only called if supdrvOSLdrOpen returned success). … … 965 964 */ 966 965 void VBOXCALL supdrvOSLdrNotifyUnloaded(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage); 966 967 /** 968 * Queries a symbol address is a native module. 969 * 970 * @returns IPRT status code. 971 * @param pDevExt The device globals. 972 * @param pImage The image to search. 973 * @param pszSymbol The symbol to search for. 974 * @param cchSymbol The length of the symbol. 975 * @param ppvSymbol Where to return the symbol address if found. 976 */ 977 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 978 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol); 967 979 968 980 -
trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
r75189 r75282 1537 1537 1538 1538 1539 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 1540 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 1541 { 1542 #ifdef VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION 1543 /* 1544 * Just hand the problem to RTLdrGetSymbolEx. 1545 */ 1546 RTLDRADDR uValueFound; 1547 int rc = RTLdrGetSymbolEx(pImage->hLdrMod, pImage->pvImage, (uintptr_t)pImage->pvImage, UINT32_MAX, pszSymbol, &uValueFound); 1548 if (RT_SUCCESS(rc)) 1549 { 1550 *ppvSymbol = (void *)(uintptr_t)uValueFound; 1551 return VINF_SUCCESS; 1552 } 1553 RT_NOREF(pDevExt, cchSymbol); 1554 return rc; 1555 1556 #else 1557 RT_NOREF(pDevExt, pImage, pszSymbol, cchSymbol, ppvSymbol); 1558 return VERR_WRONG_ORDER; 1559 #endif 1560 } 1561 1562 1539 1563 int VBOXCALL supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, PSUPLDRLOAD pReq) 1540 1564 { -
trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
r75003 r75282 592 592 593 593 594 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 595 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 596 { 597 RT_NOREF(pDevExt, pImage, pszSymbol, cchSymbol, ppvSymbol); 598 return VERR_WRONG_ORDER; 599 } 600 601 594 602 #ifdef SUPDRV_WITH_MSR_PROBER 595 603 -
trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
r75003 r75282 1218 1218 1219 1219 1220 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 1221 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 1222 { 1223 #ifdef VBOX_WITH_NON_PROD_HACK_FOR_PERF_STACKS 1224 # error "implement me!" 1225 #endif 1226 RT_NOREF(pDevExt, pImage, pszSymbol, cchSymbol, ppvSymbol); 1227 return VERR_WRONG_ORDER; 1228 } 1229 1230 1220 1231 #ifdef SUPDRV_WITH_MSR_PROBER 1221 1232 -
trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
r75003 r75282 465 465 466 466 467 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 468 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 469 { 470 RT_NOREF(pDevExt, pImage, pszSymbol, cchSymbol, ppvSymbol); 471 return VERR_WRONG_ORDER; 472 } 473 474 467 475 #ifdef SUPDRV_WITH_MSR_PROBER 468 476 -
trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
r75003 r75282 1241 1241 1242 1242 1243 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 1244 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 1245 { 1246 RT_NOREF(pDevExt, pImage, pszSymbol, cchSymbol, ppvSymbol); 1247 return VERR_WRONG_ORDER; 1248 } 1249 1250 1243 1251 #ifdef SUPDRV_WITH_MSR_PROBER 1244 1252 -
trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
r75049 r75282 2083 2083 } 2084 2084 2085 2085 2086 void VBOXCALL supdrvOSLdrNotifyUnloaded(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage) 2086 2087 { … … 2088 2089 } 2089 2090 2090 /* 2091 * Note! Similar code in rtR0DbgKrnlNtParseModule. 2092 */ 2093 int VBOXCALL supdrvOSLdrValidatePointer(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, void *pv, 2094 const uint8_t *pbImageBits, const char *pszSymbol) 2095 { 2096 #if 1 2097 RT_NOREF(pDevExt, pbImageBits); 2091 2092 /** 2093 * Common worker for supdrvOSLdrQuerySymbol and supdrvOSLdrValidatePointer. 2094 * 2095 * @note Similar code in rtR0DbgKrnlNtParseModule. 2096 */ 2097 static int supdrvOSLdrValidatePointerOrQuerySymbol(PSUPDRVLDRIMAGE pImage, void *pv, const char *pszSymbol, 2098 size_t cchSymbol, void **ppvSymbol) 2099 { 2098 2100 AssertReturn(pImage->pvNtSectionObj, VERR_INVALID_STATE); 2101 Assert(pszSymbol || !ppvSymbol); 2099 2102 2100 2103 /* … … 2104 2107 uint32_t const cbMapping = pImage->cbImageBits; 2105 2108 uint32_t const uRvaToValidate = (uint32_t)((uintptr_t)pv - (uintptr_t)pbMapping); 2106 AssertReturn(uRvaToValidate < cbMapping , VERR_INTERNAL_ERROR_3);2109 AssertReturn(uRvaToValidate < cbMapping || ppvSymbol, VERR_INTERNAL_ERROR_3); 2107 2110 2108 2111 uint32_t const offNtHdrs = *(uint16_t *)pbMapping == IMAGE_DOS_SIGNATURE … … 2128 2131 { 2129 2132 SUPR0Printf("SUPDrv: No exports in %s!\n", pImage->szName); 2130 return VERR_NOT_FOUND;2133 return ppvSymbol ? VERR_SYMBOL_NOT_FOUND : VERR_NOT_FOUND; 2131 2134 } 2132 2135 AssertReturn( ExpDir.Size >= sizeof(IMAGE_EXPORT_DIRECTORY) … … 2143 2146 { 2144 2147 SUPR0Printf("SUPDrv: No exports in %s!\n", pImage->szName); 2145 return VERR_NOT_FOUND;2148 return ppvSymbol ? VERR_SYMBOL_NOT_FOUND : VERR_NOT_FOUND; 2146 2149 } 2147 2150 … … 2170 2173 */ 2171 2174 uint32_t iExportOrdinal = UINT32_MAX; 2172 for (uint32_t i = 0; i < cExports; i++) 2173 if (paoffExports[i] == uRvaToValidate) 2174 { 2175 iExportOrdinal = i; 2176 break; 2177 } 2178 if (iExportOrdinal == UINT32_MAX) 2179 { 2180 SUPR0Printf("SUPDrv: No export with rva %#x (%s) in %s!\n", uRvaToValidate, pszSymbol, pImage->szName); 2181 return VERR_NOT_FOUND; 2182 } 2183 2184 /* 2185 * Can we validate the symbol name too? If so, just do a linear search. 2186 */ 2187 if (pszSymbol && RT_C_IS_UPPER(*pszSymbol)) 2188 { 2189 size_t const cchSymbol = strlen(pszSymbol); 2175 if (!ppvSymbol) 2176 { 2177 for (uint32_t i = 0; i < cExports; i++) 2178 if (paoffExports[i] == uRvaToValidate) 2179 { 2180 iExportOrdinal = i; 2181 break; 2182 } 2183 if (iExportOrdinal == UINT32_MAX) 2184 { 2185 SUPR0Printf("SUPDrv: No export with rva %#x (%s) in %s!\n", uRvaToValidate, pszSymbol, pImage->szName); 2186 return VERR_NOT_FOUND; 2187 } 2188 } 2189 2190 /* 2191 * Can we validate the symbol name too or should we find a name? 2192 * If so, just do a linear search. 2193 */ 2194 if (pszSymbol && (RT_C_IS_UPPER(*pszSymbol) || ppvSymbol)) 2195 { 2190 2196 for (uint32_t i = 0; i < cNamedExports; i++) 2191 2197 { … … 2193 2199 AssertReturn(offName < cbMapping, VERR_BAD_EXE_FORMAT); 2194 2200 uint32_t const cchMaxName = cbMapping - offName; 2195 const char * const pszName = (const char *)&pb ImageBits[offName];2201 const char * const pszName = (const char *)&pbMapping[offName]; 2196 2202 const char * const pszEnd = (const char *)memchr(pszName, '\0', cchMaxName); 2197 2203 AssertReturn(pszEnd, VERR_BAD_EXE_FORMAT); … … 2200 2206 && memcmp(pszName, pszSymbol, cchSymbol) == 0) 2201 2207 { 2202 if (pau16NameOrdinals[i] == iExportOrdinal) 2208 if (ppvSymbol) 2209 { 2210 iExportOrdinal = pau16NameOrdinals[i]; 2211 if ( iExportOrdinal < cExports 2212 && paoffExports[iExportOrdinal] < cbMapping) 2213 { 2214 *ppvSymbol = (void *)(paoffExports[iExportOrdinal] + pbMapping); 2215 return VINF_SUCCESS; 2216 } 2217 } 2218 else if (pau16NameOrdinals[i] == iExportOrdinal) 2203 2219 return VINF_SUCCESS; 2204 SUPR0Printf("SUPDrv: Different exports found for %s and rva %#x in %s: %#x vs %#x\n", 2205 pszSymbol, uRvaToValidate, pImage->szName, pau16NameOrdinals[i], iExportOrdinal); 2220 else 2221 SUPR0Printf("SUPDrv: Different exports found for %s and rva %#x in %s: %#x vs %#x\n", 2222 pszSymbol, uRvaToValidate, pImage->szName, pau16NameOrdinals[i], iExportOrdinal); 2206 2223 return VERR_LDR_BAD_FIXUP; 2207 2224 } 2208 2225 } 2209 SUPR0Printf("SUPDrv: No export named %s (%#x) in %s!\n", pszSymbol, uRvaToValidate, pImage->szName); 2226 if (!ppvSymbol) 2227 SUPR0Printf("SUPDrv: No export named %s (%#x) in %s!\n", pszSymbol, uRvaToValidate, pImage->szName); 2210 2228 return VERR_SYMBOL_NOT_FOUND; 2211 2229 } 2212 2230 return VINF_SUCCESS; 2213 2214 #else 2215 NOREF(pDevExt); NOREF(pImage); NOREF(pv); NOREF(pbImageBits); NOREF(pszSymbol); 2216 return VERR_NOT_SUPPORTED; 2217 #endif 2231 } 2232 2233 2234 int VBOXCALL supdrvOSLdrValidatePointer(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, void *pv, 2235 const uint8_t *pbImageBits, const char *pszSymbol) 2236 { 2237 RT_NOREF(pDevExt, pbImageBits); 2238 return supdrvOSLdrValidatePointerOrQuerySymbol(pImage, pv, pszSymbol, pszSymbol ? strlen(pszSymbol) : 0, NULL); 2239 } 2240 2241 2242 int VBOXCALL supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, 2243 const char *pszSymbol, size_t cchSymbol, void **ppvSymbol) 2244 { 2245 RT_NOREF(pDevExt); 2246 AssertReturn(ppvSymbol, VERR_INVALID_PARAMETER); 2247 AssertReturn(pszSymbol, VERR_INVALID_PARAMETER); 2248 return supdrvOSLdrValidatePointerOrQuerySymbol(pImage, NULL, pszSymbol, cchSymbol, ppvSymbol); 2218 2249 } 2219 2250
Note:
See TracChangeset
for help on using the changeset viewer.