VirtualBox

儲存庫 vbox 的更動 34959


忽略:
時間撮記:
2010-12-10 下午03:17:31 (14 年 以前)
作者:
vboxsync
svn:sync-xref-src-repo-rev:
68779
訊息:

Added RTLdrLoadEx for exposing dlerror info.

位置:
trunk
檔案:
修改 14 筆資料

圖例:

未更動
新增
刪除
  • trunk/include/VBox/sup.h

    r34241 r34959  
    10361036 *
    10371037 * @returns iprt status code.
    1038  * @param   pszFilename Image filename. This must have a path.
    1039  * @param   phLdrMod    Where to store the handle to the loaded module.
    1040  */
    1041 SUPR3DECL(int) SUPR3HardenedLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod);
     1038 * @param   pszFilename     Image filename. This must have a path.
     1039 * @param   phLdrMod        Where to store the handle to the loaded module.
     1040 * @param   pszError        Where to return error message on failure.
     1041 * @param   cbError         The size of the error buffer.
     1042 */
     1043SUPR3DECL(int) SUPR3HardenedLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError);
    10421044
    10431045/**
     
    10511053 * @param   pszFilename Image filename.
    10521054 * @param   phLdrMod    Where to store the handle to the loaded module.
    1053  */
    1054 SUPR3DECL(int) SUPR3HardenedLdrLoadAppPriv(const char *pszFilename, PRTLDRMOD phLdrMod);
     1055 * @param   pszError        Where to return error message on failure.
     1056 * @param   cbError         The size of the error buffer.
     1057 */
     1058SUPR3DECL(int) SUPR3HardenedLdrLoadAppPriv(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError);
    10551059
    10561060/**
  • trunk/include/iprt/ldr.h

    r33540 r34959  
    7373 */
    7474RTDECL(int) RTLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod);
     75
     76/**
     77 * Loads a dynamic load library (/shared object) image file using native
     78 * OS facilities.
     79 *
     80 * The filename will be appended the default DLL/SO extension of
     81 * the platform if it have been omitted. This means that it's not
     82 * possible to load DLLs/SOs with no extension using this interface,
     83 * but that's not a bad tradeoff.
     84 *
     85 * If no path is specified in the filename, the OS will usually search it's library
     86 * path to find the image file.
     87 *
     88 * @returns iprt status code.
     89 * @param   pszFilename Image filename.
     90 * @param   phLdrMod    Where to store the handle to the loader module.
     91 * @param   pszError    Where to store an error message on failure. Optional.
     92 * @param   cbError     The size of the buffer pointed to by @a pszError.
     93 */
     94RTDECL(int) RTLdrLoadEx(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError);
    7595
    7696/**
  • trunk/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp

    r34839 r34959  
    831831        if (fFFMPEG)
    832832        {
    833             int rrc = VINF_SUCCESS, rcc = S_OK;
     833            HRESULT rcc = S_OK;
     834            int     rrc = VINF_SUCCESS;
     835            char    szErr[8192];
    834836
    835837            Log2(("VBoxHeadless: loading VBoxFFmpegFB shared library\n"));
    836             rrc = SUPR3HardenedLdrLoadAppPriv("VBoxFFmpegFB", &hLdrFFmpegFB);
     838            rrc = SUPR3HardenedLdrLoadAppPriv("VBoxFFmpegFB", &hLdrFFmpegFB, szErr, sizeof(szErr));
    837839
    838840            if (RT_SUCCESS(rrc))
     
    845847            }
    846848            else
    847                 LogError("Failed to load the video capture extension\n", rrc);
     849                LogError("Failed to load the video capture extension\n", rrc); /** @todo stupid function, no formatting options. */
    848850            if (RT_SUCCESS(rrc))
    849851            {
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp

    r34947 r34959  
    50945094    if (mDbgEnabled)
    50955095    {
    5096         int vrc = SUPR3HardenedLdrLoadAppPriv("VBoxDbg", &mhVBoxDbg);
     5096        char szErr[8192];
     5097        szErr[0] = '\0';
     5098        int vrc = SUPR3HardenedLdrLoadAppPriv("VBoxDbg", &mhVBoxDbg, szErr, sizeof(szErr));
    50975099        if (RT_FAILURE(vrc))
    50985100        {
    50995101            mhVBoxDbg = NIL_RTLDRMOD;
    51005102            mDbgAutoShow =  mDbgAutoShowCommandLine = mDbgAutoShowStatistics = false;
    5101             LogRel(("Failed to load VBoxDbg, rc=%Rrc\n", vrc));
     5103            LogRel(("Failed to load VBoxDbg, rc=%Rrc - %s\n", vrc, szErr));
    51025104        }
    51035105    }
  • trunk/src/VBox/HostDrivers/Support/SUPLib.cpp

    r34241 r34959  
    20832083 * @param   pszFilename     The full file name.
    20842084 * @param   phLdrMod        Where to store the handle to the loaded module.
     2085 * @param   pszError        Where to return the loader error. Optional.
     2086 * @param   cbError         The size of the buffer pointed to by @a pszError.
    20852087 */
    2086 static int supR3HardenedLdrLoadIt(const char *pszFilename, PRTLDRMOD phLdrMod)
     2088static int supR3HardenedLdrLoadIt(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError)
    20872089{
    20882090#ifdef VBOX_WITH_HARDENING
     
    21012103     * Try load it.
    21022104     */
    2103     return RTLdrLoad(pszFilename, phLdrMod);
    2104 }
    2105 
    2106 
    2107 SUPR3DECL(int) SUPR3HardenedLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod)
     2105    return RTLdrLoadEx(pszFilename, phLdrMod, pszError, cbError);
     2106}
     2107
     2108
     2109SUPR3DECL(int) SUPR3HardenedLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError)
    21082110{
    21092111    /*
    21102112     * Validate input.
    21112113     */
    2112     AssertPtrReturn(pszFilename, VERR_INVALID_PARAMETER);
    2113     AssertPtrReturn(phLdrMod, VERR_INVALID_PARAMETER);
     2114    if (!pszError)
     2115        AssertReturn(!cbError, VERR_INVALID_PARAMETER);
     2116    else
     2117    {
     2118        AssertPtrReturn(pszError, VERR_INVALID_POINTER);
     2119        if (cbError)
     2120            *pszError = '\0';
     2121        else
     2122            pszError = NULL;
     2123    }
     2124    AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
     2125    AssertPtrReturn(phLdrMod, VERR_INVALID_POINTER);
    21142126    *phLdrMod = NIL_RTLDRMOD;
    21152127    AssertReturn(RTPathHavePath(pszFilename), VERR_INVALID_PARAMETER);
     
    21332145     * Pass it on to the common library loader.
    21342146     */
    2135     return supR3HardenedLdrLoadIt(pszFilename, phLdrMod);
    2136 }
    2137 
    2138 
    2139 SUPR3DECL(int) SUPR3HardenedLdrLoadAppPriv(const char *pszFilename, PRTLDRMOD phLdrMod)
    2140 {
    2141     LogFlow(("SUPR3HardenedLdrLoadAppPriv: pszFilename=%p:{%s} phLdrMod=%p\n", pszFilename, pszFilename, phLdrMod));
     2147    return supR3HardenedLdrLoadIt(pszFilename, phLdrMod, pszError, cbError);
     2148}
     2149
     2150
     2151SUPR3DECL(int) SUPR3HardenedLdrLoadAppPriv(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError)
     2152{
     2153    LogFlow(("SUPR3HardenedLdrLoadAppPriv: pszFilename=%p:{%s} phLdrMod=%p pszError=%p cbError=%zu\n", pszFilename, pszFilename, phLdrMod, pszError, cbError));
    21422154
    21432155    /*
    21442156     * Validate input.
    21452157     */
     2158    if (!pszError)
     2159        AssertReturn(!cbError, VERR_INVALID_PARAMETER);
     2160    else
     2161    {
     2162        AssertPtrReturn(pszError, VERR_INVALID_POINTER);
     2163        if (cbError)
     2164            *pszError = '\0';
     2165        else
     2166            pszError = NULL;
     2167    }
    21462168    AssertPtrReturn(phLdrMod, VERR_INVALID_PARAMETER);
    21472169    *phLdrMod = NIL_RTLDRMOD;
     
    21852207     * Pass it on to SUPR3HardenedLdrLoad.
    21862208     */
    2187     rc = SUPR3HardenedLdrLoad(szPath, phLdrMod);
     2209    rc = SUPR3HardenedLdrLoad(szPath, phLdrMod, pszError, cbError);
    21882210
    21892211    LogFlow(("SUPR3HardenedLdrLoadAppPriv: returns %Rrc\n", rc));
     
    22222244     * Try load it.
    22232245     */
    2224     rc = RTLdrLoad(pszFilename, phLdrMod);
    2225     if (RT_FAILURE(rc))
    2226         RTStrPrintf(pszErr, cbErr, "RTLdrLoad returned %Rrc", rc);
    2227     return rc;
     2246    return RTLdrLoadEx(pszFilename, phLdrMod, pszErr, cbErr);
    22282247}
    22292248
  • trunk/src/VBox/Main/ConsoleVRDPServer.cpp

    r34940 r34959  
    16631663                const char *pszName;
    16641664                void **ppvAddress;
    1665                
     1665
    16661666            } AuthEntryInfo;
    16671667            AuthEntryInfo entries[] =
     
    23232323            rc = SUPR3HardenedLdrLoadPlugIn(pszLibraryName, &mVRDPLibrary, szErr, sizeof(szErr));
    23242324        else
    2325             rc = SUPR3HardenedLdrLoadAppPriv(pszLibraryName, &mVRDPLibrary);
     2325            rc = SUPR3HardenedLdrLoadAppPriv(pszLibraryName, &mVRDPLibrary, szErr, sizeof(szErr));
    23262326        if (RT_SUCCESS(rc))
    23272327        {
  • trunk/src/VBox/Main/ExtPackManagerImpl.cpp

    r34954 r34959  
    11631163    if (fIsNative)
    11641164    {
    1165         vrc = RTLdrLoad(m->strMainModPath.c_str(), &m->hMainMod);
     1165        char szError[8192];
     1166        vrc = RTLdrLoadEx(m->strMainModPath.c_str(), &m->hMainMod, szError, sizeof(szError));
    11661167        if (RT_FAILURE(vrc))
    11671168        {
    11681169            m->hMainMod = NIL_RTLDRMOD;
    1169             m->strWhyUnusable.printf(tr("Failed to locate load the main module ('%s'): %Rrc"),
    1170                                            m->strMainModPath.c_str(), vrc);
     1170            m->strWhyUnusable.printf(tr("Failed to locate load the main module ('%s'): %Rrc - %s"),
     1171                                           m->strMainModPath.c_str(), vrc, szError);
    11711172            return;
    11721173        }
  • trunk/src/VBox/Main/hgcm/HGCM.cpp

    r33540 r34959  
    262262    }
    263263
    264     int rc = SUPR3HardenedLdrLoadAppPriv (m_pszSvcLibrary, &m_hLdrMod);
     264    char szErr[8192];
     265    szErr[0] = '\0';
     266    int rc = SUPR3HardenedLdrLoadAppPriv (m_pszSvcLibrary, &m_hLdrMod, szErr, sizeof(szErr));
    265267
    266268    if (RT_SUCCESS(rc))
     
    317319    else
    318320    {
    319         LogRel(("HGCM: Failed to load the service library: [%s], rc = %Rrc. The service will be not available.\n", m_pszSvcLibrary, rc));
     321        LogRel(("HGCM: Failed to load the service library: [%s], rc = %Rrc - %s. The service will be not available.\n",
     322                m_pszSvcLibrary, rc, szErr));
    320323        m_hLdrMod = NIL_RTLDRMOD;
    321324    }
  • trunk/src/VBox/Runtime/common/ldr/ldrNative.cpp

    r28800 r34959  
    9696RTDECL(int) RTLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod)
    9797{
    98     LogFlow(("RTLdrLoad: pszFilename=%p:{%s} phLdrMod=%p\n", pszFilename, pszFilename, phLdrMod));
    99 
    100     /*
    101      * validate input.
    102      */
    103     AssertMsgReturn(VALID_PTR(pszFilename), ("pszFilename=%p\n", pszFilename), VERR_INVALID_PARAMETER);
    104     AssertMsgReturn(VALID_PTR(phLdrMod), ("phLdrMod=%p\n", phLdrMod), VERR_INVALID_PARAMETER);
     98    return RTLdrLoadEx(pszFilename, phLdrMod, NULL, 0);
     99}
     100RT_EXPORT_SYMBOL(RTLdrLoad);
     101
     102
     103RTDECL(int) RTLdrLoadEx(const char *pszFilename, PRTLDRMOD phLdrMod, char *pszError, size_t cbError)
     104{
     105    LogFlow(("RTLdrLoadEx: pszFilename=%p:{%s} phLdrMod=%p pszError=%p cbError=%zu\n", pszFilename, pszFilename, phLdrMod, pszError, cbError));
     106
     107    /*
     108     * Validate and massage the input.
     109     */
     110    if (!pszError)
     111        AssertReturn(!cbError, VERR_INVALID_PARAMETER);
     112    else
     113    {
     114        AssertPtrReturn(pszError, VERR_INVALID_POINTER);
     115        if (cbError)
     116            *pszError = '\0';
     117        else
     118            pszError = NULL;
     119    }
     120    AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
     121    AssertPtrReturn(phLdrMod, VERR_INVALID_POINTER);
    105122
    106123    /*
     
    119136         * Attempt to open the module.
    120137         */
    121         rc = rtldrNativeLoad(pszFilename, &pMod->hNative);
     138        rc = rtldrNativeLoad(pszFilename, &pMod->hNative, pszError, cbError);
    122139        if (RT_SUCCESS(rc))
    123140        {
     
    126143            return rc;
    127144        }
     145
    128146        RTMemFree(pMod);
    129147    }
     148    else if (cbError)
     149        RTStrPrintf(pszError, cbError, "Failed to allocate %zu bytes for the module handle", sizeof(*pMod));
    130150    *phLdrMod = NIL_RTLDRMOD;
    131151    LogFlow(("RTLdrLoad: returns %Rrc\n", rc));
    132152    return rc;
    133153}
    134 RT_EXPORT_SYMBOL(RTLdrLoad);
     154RT_EXPORT_SYMBOL(RTLdrLoadEx);
    135155
    136156
  • trunk/src/VBox/Runtime/include/internal/ldr.h

    r28800 r34959  
    365365 * @param   pszFilename     The image filename.
    366366 * @param   phHandle        Where to store the module handle on success.
    367  */
    368 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle);
     367 * @param   pszError        Where to store the error message. Optional.
     368 * @param   cbError         The size of the error message buffer.
     369 */
     370int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, char *pszError, size_t cbError);
    369371
    370372int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod);
  • trunk/src/VBox/Runtime/r3/posix/ldrNative-posix.cpp

    r28800 r34959  
    4141
    4242
    43 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle)
     43int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, char *pszError, size_t cbError)
    4444{
    4545    /*
     
    6969     * Attempt load.
    7070     */
    71 
    7271    void *pvMod = dlopen(pszFilename, RTLD_NOW | RTLD_LOCAL);
    7372    if (pvMod)
     
    7675        return VINF_SUCCESS;
    7776    }
    78     LogRel(("rtldrNativeLoad: dlopen('%s', RTLD_NOW | RTLD_LOCAL) failed: %s\n", pszFilename, dlerror()));
     77
     78    const char *pszDlError = dlerror();
     79    if (pszError)
     80        RTStrCopy(pszError, cbError, pszDlError);
     81    LogRel(("rtldrNativeLoad: dlopen('%s', RTLD_NOW | RTLD_LOCAL) failed: %s\n", pszFilename, pszDlError));
    7982    return VERR_FILE_NOT_FOUND;
    8083}
  • trunk/src/VBox/Runtime/r3/win/ldrNative-win.cpp

    r28800 r34959  
    3939
    4040
    41 int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle)
     41int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, char *pszError, size_t cbError)
    4242{
    4343    Assert(sizeof(*phHandle) >= sizeof(HMODULE));
     
    6767    }
    6868
    69     return RTErrConvertFromWin32(GetLastError());
     69    /*
     70     * Try figure why it failed to load.
     71     */
     72    DWORD dwErr = GetLastError(dwErr);
     73    int   rc    = RTErrConvertFromWin32(dwErr);
     74    if (cbError)
     75        RTStrPrintf(pszError, cbError, "GetLastError=%u", dwErr);
     76    return rc;
    7077}
    7178
  • trunk/src/VBox/Storage/VD.cpp

    r34509 r34959  
    21292129        }
    21302130
    2131         rc = SUPR3HardenedLdrLoad(pszPluginPath, &hPlugin);
     2131        rc = SUPR3HardenedLdrLoad(pszPluginPath, &hPlugin, NULL, 0);
    21322132        if (RT_SUCCESS(rc))
    21332133        {
     
    22532253        }
    22542254
    2255         rc = SUPR3HardenedLdrLoad(pszPluginPath, &hPlugin);
     2255        rc = SUPR3HardenedLdrLoad(pszPluginPath, &hPlugin, NULL, 0);
    22562256        if (RT_SUCCESS(rc))
    22572257        {
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r33540 r34959  
    19831983    if (g_ModVMM != NIL_RTLDRMOD)
    19841984    {
    1985         rc = SUPR3HardenedLdrLoadAppPriv("VBoxVMM", &g_ModVMM);
     1985        rc = SUPR3HardenedLdrLoadAppPriv("VBoxVMM", &g_ModVMM, NULL, 0);
    19861986        AssertRCReturn(rc, rc);
    19871987        for (size_t i = 0; i < RT_ELEMENTS(g_aVMMImports); i++)
     
    20972097    if (g_ModVMM == NIL_RTLDRMOD)
    20982098    {
    2099         rc = SUPR3HardenedLdrLoadAppPriv("VBoxVMM", &g_ModVMM);
     2099        rc = SUPR3HardenedLdrLoadAppPriv("VBoxVMM", &g_ModVMM, NULL, 0);
    21002100        AssertRCReturn(rc, false);
    21012101    }
     
    21332133     */
    21342134    const char *pszModule = remIs64bitEnabled(pVM) ? "VBoxREM64" : "VBoxREM32";
    2135     int rc = SUPR3HardenedLdrLoadAppPriv(pszModule, &g_ModREM2);
     2135    int rc = SUPR3HardenedLdrLoadAppPriv(pszModule, &g_ModREM2, NULL, 0);
    21362136    if (RT_SUCCESS(rc))
    21372137    {
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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