VirtualBox

Changeset 34959 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Dec 10, 2010 3:17:31 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
68779
Message:

Added RTLdrLoadEx for exposing dlerror info.

Location:
trunk/src/VBox/Runtime
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • 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
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