VirtualBox

Changeset 75282 in vbox for trunk


Ignore:
Timestamp:
Nov 6, 2018 12:57:54 PM (6 years ago)
Author:
vboxsync
Message:

SUPDrv: Adding supdrvOSLdrQuerySymbol so we don't have to save a copy of the symbol table for native modules. bugref:9232

Location:
trunk/src/VBox/HostDrivers/Support
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.cpp

    r75053 r75282  
    138138static int                  supdrvIOCtl_LdrFree(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRFREE pReq);
    139139static int                  supdrvIOCtl_LdrLockDown(PSUPDRVDEVEXT pDevExt);
    140 static int                  supdrvIOCtl_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq);
     140static int                  supdrvIOCtl_LdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq);
    141141static int                  supdrvIDC_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVIDCREQGETSYM pReq);
    142142static int                  supdrvLdrSetVMMR0EPs(PSUPDRVDEVEXT pDevExt, void *pvVMMR0, void *pvVMMR0EntryFast, void *pvVMMR0EntryEx);
     
    18031803
    18041804            /* execute */
    1805             pReq->Hdr.rc = supdrvIOCtl_LdrGetSymbol(pDevExt, pSession, pReq);
     1805            pReq->Hdr.rc = supdrvIOCtl_LdrQuerySymbol(pDevExt, pSession, pReq);
    18061806            return 0;
    18071807        }
     
    51525152
    51535153    /*
    5154      * Allocate and copy the tables.
     5154     * Allocate and copy the tables if non-native.
    51555155     * (No need to do try/except as this is a buffered request.)
    51565156     */
    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        }
    51785181    }
    51795182
     
    54015404
    54025405/**
    5403  * Gets the address of a symbol in an open image.
     5406 * Queries the address of a symbol in an open image.
    54045407 *
    54055408 * @returns IPRT status code.
     
    54085411 * @param   pReq        The request buffer.
    54095412 */
    5410 static int supdrvIOCtl_LdrGetSymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq)
     5413static int supdrvIOCtl_LdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPLDRGETSYMBOL pReq)
    54115414{
    54125415    PSUPDRVLDRIMAGE pImage;
     
    54185421    void           *pvSymbol = NULL;
    54195422    int             rc = VERR_SYMBOL_NOT_FOUND;
    5420     Log3(("supdrvIOCtl_LdrGetSymbol: 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));
    54215424
    54225425    /*
     
    54435446
    54445447    /*
    5445      * Search the symbol strings.
     5448     * Search the image exports / symbol strings.
    54465449     *
    54475450     * Note! The int32_t is for native loading on solaris where the data
    54485451     *       and text segments are in very different places.
    54495452     */
    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            }
    54605468        }
    54615469    }
     
    55295537        {
    55305538            /*
    5531              * Search the symbol strings.
     5539             * Search the image exports / symbol strings.
    55325540             */
    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++)
    55395553                {
    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                    }
    55465564                }
    55475565            }
  • trunk/src/VBox/HostDrivers/Support/SUPDrvInternal.h

    r75053 r75282  
    946946int  VBOXCALL   supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, PSUPLDRLOAD pReq);
    947947
    948 
    949948/**
    950949 * Unload the image (only called if supdrvOSLdrOpen returned success).
     
    965964 */
    966965void 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 */
     977int  VBOXCALL   supdrvOSLdrQuerySymbol(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage,
     978                                       const char *pszSymbol, size_t cchSymbol, void **ppvSymbol);
    967979
    968980
  • trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp

    r75189 r75282  
    15371537
    15381538
     1539int  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
    15391563int  VBOXCALL   supdrvOSLdrLoad(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, const uint8_t *pbImageBits, PSUPLDRLOAD pReq)
    15401564{
  • trunk/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c

    r75003 r75282  
    592592
    593593
     594int  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
    594602#ifdef SUPDRV_WITH_MSR_PROBER
    595603
  • trunk/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c

    r75003 r75282  
    12181218
    12191219
     1220int  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
    12201231#ifdef SUPDRV_WITH_MSR_PROBER
    12211232
  • trunk/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp

    r75003 r75282  
    465465
    466466
     467int  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
    467475#ifdef SUPDRV_WITH_MSR_PROBER
    468476
  • trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c

    r75003 r75282  
    12411241
    12421242
     1243int  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
    12431251#ifdef SUPDRV_WITH_MSR_PROBER
    12441252
  • trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp

    r75049 r75282  
    20832083}
    20842084
     2085
    20852086void VBOXCALL   supdrvOSLdrNotifyUnloaded(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage)
    20862087{
     
    20882089}
    20892090
    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 */
     2097static int supdrvOSLdrValidatePointerOrQuerySymbol(PSUPDRVLDRIMAGE pImage, void *pv, const char *pszSymbol,
     2098                                                   size_t cchSymbol, void **ppvSymbol)
     2099{
    20982100    AssertReturn(pImage->pvNtSectionObj, VERR_INVALID_STATE);
     2101    Assert(pszSymbol || !ppvSymbol);
    20992102
    21002103    /*
     
    21042107    uint32_t const  cbMapping      = pImage->cbImageBits;
    21052108    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);
    21072110
    21082111    uint32_t const  offNtHdrs = *(uint16_t *)pbMapping == IMAGE_DOS_SIGNATURE
     
    21282131    {
    21292132        SUPR0Printf("SUPDrv: No exports in %s!\n", pImage->szName);
    2130         return VERR_NOT_FOUND;
     2133        return ppvSymbol ? VERR_SYMBOL_NOT_FOUND : VERR_NOT_FOUND;
    21312134    }
    21322135    AssertReturn(   ExpDir.Size >= sizeof(IMAGE_EXPORT_DIRECTORY)
     
    21432146    {
    21442147        SUPR0Printf("SUPDrv: No exports in %s!\n", pImage->szName);
    2145         return VERR_NOT_FOUND;
     2148        return ppvSymbol ? VERR_SYMBOL_NOT_FOUND : VERR_NOT_FOUND;
    21462149    }
    21472150
     
    21702173     */
    21712174    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    {
    21902196        for (uint32_t i = 0; i < cNamedExports; i++)
    21912197        {
     
    21932199            AssertReturn(offName < cbMapping, VERR_BAD_EXE_FORMAT);
    21942200            uint32_t const     cchMaxName = cbMapping - offName;
    2195             const char * const pszName    = (const char *)&pbImageBits[offName];
     2201            const char * const pszName    = (const char *)&pbMapping[offName];
    21962202            const char * const pszEnd     = (const char *)memchr(pszName, '\0', cchMaxName);
    21972203            AssertReturn(pszEnd, VERR_BAD_EXE_FORMAT);
     
    22002206                && memcmp(pszName, pszSymbol, cchSymbol) == 0)
    22012207            {
    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)
    22032219                    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);
    22062223                return VERR_LDR_BAD_FIXUP;
    22072224            }
    22082225        }
    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);
    22102228        return VERR_SYMBOL_NOT_FOUND;
    22112229    }
    22122230    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
     2234int  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
     2242int  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);
    22182249}
    22192250
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette