VirtualBox

Changeset 46070 in vbox


Ignore:
Timestamp:
May 14, 2013 3:21:57 PM (12 years ago)
Author:
vboxsync
Message:

RTDbgCfg,++: Compressed server files and other fixes.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/http.h

    r46050 r46070  
    9797
    9898/**
     99 * Tells the HTTP interface to use the system proxy configuration.
     100 *
     101 * @returns iprt status code.
     102 * @param   hHttp           HTTP interface handle.
     103 */
     104RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp);
     105
     106/**
    99107 * Specify proxy settings.
    100108 *
  • trunk/include/iprt/mangling.h

    r46050 r46070  
    599599# define RTHeapSimpleSize                               RT_MANGLER(RTHeapSimpleSize)
    600600# define RTHttpGetFile                                  RT_MANGLER(RTHttpGetFile)
     601# define RTHttpUseSystemProxySettings                   RT_MANGLER(RTHttpUseSystemProxySettings)
    601602# define RTIsoFsClose                                   RT_MANGLER(RTIsoFsClose)
    602603# define RTIsoFsExtractFile                             RT_MANGLER(RTIsoFsExtractFile)
  • trunk/src/VBox/Runtime/common/dbg/dbgcfg.cpp

    r46053 r46070  
    4848#include <iprt/mem.h>
    4949#include <iprt/path.h>
     50#include <iprt/process.h>
    5051#include <iprt/semaphore.h>
    5152#include <iprt/string.h>
     
    147148/** The operative system mask.  The values are RT_OPSYS_XXX. */
    148149#define RTDBGCFG_O_OPSYS_MASK           UINT32_C(0x000000ff)
     150/** The files may be compressed MS styled. */
     151#define RTDBGCFG_O_MAYBE_COMPRESSED_MS  RT_BIT_32(26)
    149152/** Whether to make a recursive search. */
    150153#define RTDBGCFG_O_RECURSIVE            RT_BIT_32(27)
     
    284287
    285288    /*
     289     * Try some simple case folding games.
     290     */
     291    RTStrToLower(&pszPath[offLastComp]);
     292    if (RTFileExists(pszPath))
     293        return true;
     294
     295    RTStrToUpper(&pszPath[offLastComp]);
     296    if (RTFileExists(pszPath))
     297        return true;
     298
     299    /*
    286300     * Open the directory and check each entry in it.
    287301     */
     
    289303    PRTDIR pDir;
    290304    int rc = RTDirOpen(&pDir, pszPath);
    291     if (RT_SUCCESS(rc))
     305    if (RT_FAILURE(rc))
    292306        return false;
    293307
     
    371385    if (fCaseInsensitive)
    372386        return rtDbgCfgIsXxxxAndFixCaseWorker(pszPath, cchPath, pszSubDir, RTDIRENTRYTYPE_DIRECTORY);
     387
     388    pszPath[cchPath] = '\0';
    373389    return false;
    374390}
     
    387403 * @param   pszFilename         The file name to append.
    388404 * @param   fCaseInsensitive    Whether case insensitive searching is required.
     405 * @param   fMsCompressed       Whether to look for the MS compressed file name
     406 *                              variant.
     407 * @param   pfProbablyCompressed    This is set to true if a MS compressed
     408 *                                  filename variant is returned.  Optional.
    389409 */
    390 static bool rtDbgCfgIsFileAndFixCase(char *pszPath, const char *pszFilename, bool fCaseInsensitive)
     410static bool rtDbgCfgIsFileAndFixCase(char *pszPath, const char *pszFilename, bool fCaseInsensitive,
     411                                     bool fMsCompressed, bool *pfProbablyCompressed)
    391412{
    392413    /* Save the length of the input path so we can restore it in the case
    393414       insensitive branch further down. */
    394415    size_t cchPath = strlen(pszPath);
     416    if (pfProbablyCompressed)
     417        *pfProbablyCompressed = false;
    395418
    396419    /*
     
    405428
    406429    /*
    407      * Do case insensitive lookup if requested.
     430     * Do case insensitive file lookup if requested.
    408431     */
    409432    if (fCaseInsensitive)
    410         return rtDbgCfgIsXxxxAndFixCaseWorker(pszPath, cchPath, pszFilename, RTDIRENTRYTYPE_FILE);
     433    {
     434        if (rtDbgCfgIsXxxxAndFixCaseWorker(pszPath, cchPath, pszFilename, RTDIRENTRYTYPE_FILE))
     435            return true;
     436    }
     437
     438    /*
     439     * Look for MS compressed file if requested.
     440     */
     441    if (   fMsCompressed
     442        && (unsigned char)pszFilename[strlen(pszFilename) - 1] < 0x7f)
     443    {
     444        pszPath[cchPath] = '\0';
     445        rc = RTPathAppend(pszPath, RTPATH_MAX, pszFilename);
     446        AssertRCReturn(rc, rc);
     447        pszPath[strlen(pszPath) - 1] = '_';
     448
     449        if (pfProbablyCompressed)
     450            *pfProbablyCompressed = true;
     451
     452        if (RTFileExists(pszPath))
     453            return true;
     454
     455        if (fCaseInsensitive)
     456        {
     457            /* Note! Ugly hack here, the pszName parameter points into pszPath! */
     458            if (rtDbgCfgIsXxxxAndFixCaseWorker(pszPath, cchPath, RTPathFilename(pszPath), RTDIRENTRYTYPE_FILE))
     459                return true;
     460        }
     461
     462        if (pfProbablyCompressed)
     463            *pfProbablyCompressed = false;
     464    }
     465
     466    pszPath[cchPath] = '\0';
    411467    return false;
    412468}
     
    434490             that way. */
    435491    bool const fCaseInsensitive = (fFlags & RTDBGCFG_O_CASE_INSENSITIVE)
    436                                && rtDbgCfgIsFsCaseInsensitive(pszPath);
     492                               && !rtDbgCfgIsFsCaseInsensitive(pszPath);
    437493
    438494    size_t const cchPath = strlen(pszPath);
     
    452508        if (RT_SUCCESS(rc2))
    453509        {
    454             if (rtDbgCfgIsFileAndFixCase(pszPath, pSplitFn->apszComps[pSplitFn->cComps - 1], fCaseInsensitive))
     510            if (rtDbgCfgIsFileAndFixCase(pszPath, pSplitFn->apszComps[pSplitFn->cComps - 1], fCaseInsensitive, false, NULL))
    455511            {
    456512                rtDbgCfgLog1(pThis, "Trying '%s'...\n", pszPath);
     
    459515                {
    460516                    if (rc2 == VINF_CALLBACK_RETURN)
    461                         rtDbgCfgLog1(pThis, "Found '%s'.", pszPath);
     517                        rtDbgCfgLog1(pThis, "Found '%s'.\n", pszPath);
    462518                    else
    463519                        rtDbgCfgLog1(pThis, "Error opening '%s'.\n", pszPath);
     
    483539}
    484540
     541static int rtDbgCfgUnpackMsCacheFile(PRTDBGCFGINT pThis, char *pszPath, const char *pszFilename)
     542{
     543    rtDbgCfgLog2(pThis, "Unpacking '%s'...\n", pszPath);
     544
     545    /*
     546     * Duplicate the source file path, just for simplicity and restore the
     547     * final character in the orignal.  We cheerfully ignorining any
     548     * possibility of multibyte UTF-8 sequences just like the caller did when
     549     * setting it to '_'.
     550     */
     551    char *pszSrcArchive = RTStrDup(pszPath);
     552    if (!pszSrcArchive)
     553        return VERR_NO_STR_MEMORY;
     554
     555    pszPath[strlen(pszPath) - 1] = RT_C_TO_LOWER(pszFilename[strlen(pszFilename) - 1]);
     556
     557
     558    /*
     559     * Figuring out the argument list for the platform specific unpack util.
     560     */
     561#ifdef RT_OS_WINDOWS
     562    const char *papszArgs[] =
     563    {
     564        "expand.exe",
     565        pszSrcArchive,
     566        pszPath,
     567        NULL
     568    };
     569
     570#else
     571    char szExtractDir[RTPATH_MAX];
     572    strcpy(szExtractDir, pszPath);
     573    RTPathStripFilename(szExtractDir);
     574
     575    const char *papszArgs[] =
     576    {
     577        "cabextract",
     578        "-L",                   /* Lower case extracted files. */
     579        "-d", szExtractDir,     /* Extraction path */
     580        pszSrcArchive,
     581        NULL
     582    };
     583#endif
     584
     585    /*
     586     * Do the unpacking.
     587     */
     588    RTPROCESS hChild;
     589    int rc = RTProcCreate(papszArgs[0], papszArgs, RTENV_DEFAULT,
     590#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
     591                          RTPROC_FLAGS_NO_WINDOW | RTPROC_FLAGS_HIDDEN | RTPROC_FLAGS_SEARCH_PATH,
     592#else
     593                          RTPROC_FLAGS_SEARCH_PATH,
     594#endif
     595                          &hChild);
     596    if (RT_SUCCESS(rc))
     597    {
     598        RTPROCSTATUS ProcStatus;
     599        rc = RTProcWait(hChild, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus);
     600        if (RT_SUCCESS(rc))
     601        {
     602            if (   ProcStatus.enmReason == RTPROCEXITREASON_NORMAL
     603                && ProcStatus.iStatus   == 0)
     604            {
     605                if (RTPathExists(pszPath))
     606                {
     607                    rtDbgCfgLog1(pThis, "Successfully unpacked '%s' to '%s'.\n", pszSrcArchive, pszPath);
     608                    rc = VINF_SUCCESS;
     609                }
     610                else
     611                {
     612                    rtDbgCfgLog1(pThis, "Successfully ran unpacker on '%s', but '%s' is missing!\n", pszSrcArchive, pszPath);
     613                    rc = VERR_ZIP_ERROR;
     614                }
     615            }
     616            else
     617            {
     618                rtDbgCfgLog2(pThis, "Unpacking '%s' failed: iStatus=%d enmReason=%d\n",
     619                             pszSrcArchive, ProcStatus.iStatus, ProcStatus.enmReason);
     620                rc = VERR_ZIP_CORRUPTED;
     621            }
     622        }
     623        else
     624            rtDbgCfgLog1(pThis, "Error waiting for process: %Rrc\n", rc);
     625
     626    }
     627    else
     628        rtDbgCfgLog1(pThis, "Error starting unpack process '%s': %Rrc\n", papszArgs[0], rc);
     629
     630    return rc;
     631}
    485632
    486633static int rtDbgCfgTryDownloadAndOpen(PRTDBGCFGINT pThis, const char *pszServer,
     
    495642     * Create the path.
    496643     */
     644    size_t cchTmp = strlen(pszPath);
     645
     646    int rc = RTDirCreateFullPath(pszPath, 0766);
     647    if (!RTDirExists(pszPath))
     648    {
     649        Log(("Error creating cache dir '%s': %Rrc\n", pszPath, rc));
     650        return rc;
     651    }
     652
    497653    const char *pszFilename = pSplitFn->apszComps[pSplitFn->cComps - 1];
    498     int rc = RTPathAppend(pszPath, RTPATH_MAX, pszFilename);
     654    rc = RTPathAppend(pszPath, RTPATH_MAX, pszFilename);
    499655    if (RT_FAILURE(rc))
    500656        return rc;
     657    RTStrToLower(&pszPath[cchTmp]);
    501658    if (!RTDirExists(pszPath))
    502659    {
     
    521678
    522679    /* Prepare the destination file name while we're here. */
     680    cchTmp = strlen(pszPath);
     681    RTStrToLower(&pszPath[cchTmp]);
    523682    rc = RTPathAppend(pszPath, RTPATH_MAX, pszFilename);
    524683    if (RT_FAILURE(rc))
     
    532691    if (RT_FAILURE(rc))
    533692        return rc;
     693    RTHttpUseSystemProxySettings(hHttp);
    534694
    535695    static const char * const s_apszHeaders[] =
    536696    {
    537697        "User-Agent: Microsoft-Symbol-Server/6.6.0999.9",
    538         "Cache-Control: no-cache",
     698        "Pragma: no-cache",
    539699    };
    540700
     
    545705        RTStrPrintf(szUrl, sizeof(szUrl), "%s/%s/%s/%s", pszServer, pszFilename, pszCacheSubDir, pszFilename);
    546706
    547         /** @todo Use some temporary file name and rename it after the operation. */
     707        /** @todo Use some temporary file name and rename it after the operation
     708         *        since not all systems support read-deny file sharing
     709         *        settings. */
     710        rtDbgCfgLog2(pThis, "Downloading '%s' to '%s'...\n", szUrl, pszPath);
    548711        rc = RTHttpGetFile(hHttp, szUrl, pszPath);
    549712        if (RT_FAILURE(rc))
     713        {
    550714            RTFileDelete(pszPath);
     715            rtDbgCfgLog1(pThis, "%Rrc on URL '%s'\n", rc, pszPath);
     716        }
     717        if (rc == VERR_HTTP_NOT_FOUND)
     718        {
     719            /* Try the compressed version of the file. */
     720            pszPath[strlen(pszPath) - 1] = '_';
     721            szUrl[strlen(szUrl)     - 1] = '_';
     722            rtDbgCfgLog2(pThis, "Downloading '%s' to '%s'...\n", szUrl, pszPath);
     723            rc = RTHttpGetFile(hHttp, szUrl, pszPath);
     724            if (RT_SUCCESS(rc))
     725                rc = rtDbgCfgUnpackMsCacheFile(pThis, pszPath, pszFilename);
     726            else
     727            {
     728                rtDbgCfgLog1(pThis, "%Rrc on URL '%s'\n", rc, pszPath);
     729                RTFileDelete(pszPath);
     730            }
     731        }
    551732    }
    552733
    553734    RTHttpDestroy(hHttp);
     735
     736    /*
     737     * If we succeeded, give it a try.
     738     */
     739    if (RT_SUCCESS(rc))
     740    {
     741        Assert(RTFileExists(pszPath));
     742        rtDbgCfgLog1(pThis, "Trying '%s'...\n", pszPath);
     743        rc = pfnCallback(pThis, pszPath, pvUser1, pvUser2);
     744        if (rc == VINF_CALLBACK_RETURN)
     745            rtDbgCfgLog1(pThis, "Found '%s'.\n", pszPath);
     746        else if (rc == VERR_CALLBACK_RETURN)
     747            rtDbgCfgLog1(pThis, "Error opening '%s'.\n", pszPath);
     748        else
     749            rtDbgCfgLog1(pThis, "Error %Rrc opening '%s'.\n", rc, pszPath);
     750    }
     751
    554752    return rc;
    555753
     
    588786     */
    589787    bool const fCaseInsensitive = (fFlags & RTDBGCFG_O_CASE_INSENSITIVE)
    590                                && rtDbgCfgIsFsCaseInsensitive(pszPath);
    591 
    592     if (!rtDbgCfgIsDirAndFixCase(pszPath, pSplitFn->apszComps[pSplitFn->cComps - 1], fCaseInsensitive))
     788                               && !rtDbgCfgIsFsCaseInsensitive(pszPath);
     789    const char *pszFilename = pSplitFn->apszComps[pSplitFn->cComps - 1];
     790
     791    if (!rtDbgCfgIsDirAndFixCase(pszPath, pszFilename, fCaseInsensitive))
    593792        return VWRN_NOT_FOUND;
    594793
     
    596795        return VWRN_NOT_FOUND;
    597796
    598     if (!rtDbgCfgIsFileAndFixCase(pszPath, pSplitFn->apszComps[pSplitFn->cComps - 1], fCaseInsensitive))
     797    bool fProbablyCompressed = false;
     798    if (!rtDbgCfgIsFileAndFixCase(pszPath, pszFilename, fCaseInsensitive,
     799                                  RT_BOOL(fFlags & RTDBGCFG_O_MAYBE_COMPRESSED_MS), &fProbablyCompressed))
    599800        return VWRN_NOT_FOUND;
     801    if (fProbablyCompressed)
     802    {
     803        int rc = rtDbgCfgUnpackMsCacheFile(pThis, pszPath, pszFilename);
     804        if (RT_FAILURE(rc))
     805            return VWRN_NOT_FOUND;
     806    }
    600807
    601808    rtDbgCfgLog1(pThis, "Trying '%s'...\n", pszPath);
    602809    int rc2 = pfnCallback(pThis, pszPath, pvUser1, pvUser2);
    603810    if (rc2 == VINF_CALLBACK_RETURN)
    604         rtDbgCfgLog1(pThis, "Found '%s'.", pszPath);
     811        rtDbgCfgLog1(pThis, "Found '%s'.\n", pszPath);
    605812    else if (rc2 == VERR_CALLBACK_RETURN)
    606813        rtDbgCfgLog1(pThis, "Error opening '%s'.\n", pszPath);
     
    619826    const char *pchCache = NULL;
    620827    size_t      cchCache = 0;
     828    int         rcCache  = VWRN_NOT_FOUND;
    621829
    622830    PRTDBGCFGSTR pCur;
     
    668876                memcpy(pszPath, pchCache, cchCache);
    669877                pszPath[cchCache] = '\0';
    670                 rc2 = rtDbgCfgTryOpenCache(pThis, pszPath, pszCacheSubDir, pSplitFn, fFlags,
    671                                            pfnCallback, pvUser1, pvUser2);
     878                rcCache = rc2 = rtDbgCfgTryOpenCache(pThis, pszPath, pszCacheSubDir, pSplitFn, fFlags,
     879                                                     pfnCallback, pvUser1, pvUser2);
    672880                if (rc2 == VINF_CALLBACK_RETURN || rc2 == VERR_CALLBACK_RETURN)
    673881                    return rc2;
     
    675883
    676884            /* Try downloading the file. */
    677             memcpy(pszPath, pchCache, cchCache);
    678             pszPath[cchCache] = '\0';
    679             rc2 = rtDbgCfgTryDownloadAndOpen(pThis, pszServer, pszPath, pszCacheSubDir, pSplitFn, fFlags,
    680                                              pfnCallback, pvUser1, pvUser2);
    681             if (rc2 == VINF_CALLBACK_RETURN || rc2 == VERR_CALLBACK_RETURN)
    682                 return rc2;
     885            if (rcCache == VWRN_NOT_FOUND)
     886            {
     887                memcpy(pszPath, pchCache, cchCache);
     888                pszPath[cchCache] = '\0';
     889                rc2 = rtDbgCfgTryDownloadAndOpen(pThis, pszServer, pszPath, pszCacheSubDir, pSplitFn, fFlags,
     890                                                 pfnCallback, pvUser1, pvUser2);
     891                if (rc2 == VINF_CALLBACK_RETURN || rc2 == VERR_CALLBACK_RETURN)
     892                    return rc2;
     893            }
    683894        }
    684895        else if (!strncmp(pszDir, RT_STR_TUPLE("cache*")))
     
    696907            memcpy(pszPath, pchCache, cchCache);
    697908            pszPath[cchCache] = '\0';
    698             rc2 = rtDbgCfgTryOpenCache(pThis, pszPath, pszCacheSubDir, pSplitFn, fFlags,
    699                                        pfnCallback, pvUser1, pvUser2);
     909            rcCache = rc2 = rtDbgCfgTryOpenCache(pThis, pszPath, pszCacheSubDir, pSplitFn, fFlags,
     910                                                 pfnCallback, pvUser1, pvUser2);
    700911            if (rc2 == VINF_CALLBACK_RETURN || rc2 == VERR_CALLBACK_RETURN)
    701912                return rc2;
     
    734945            }
    735946        }
     947
     948        /* Propagate errors. */
     949        if (RT_FAILURE(rc2) && RT_SUCCESS_NP(rcRet))
     950            rcRet = rc2;
    736951    }
    737952
     
    7861001        fFlags |= RTDBGCFG_O_CASE_INSENSITIVE;
    7871002
    788     rtDbgCfgLog2(pThis, "Looking for '%s' w/ cache subdir '%s' and %#x flags\n", pszFilename, pszCacheSubDir, fFlags);
     1003    rtDbgCfgLog2(pThis, "Looking for '%s' w/ cache subdir '%s' and %#x flags...\n", pszFilename, pszCacheSubDir, fFlags);
    7891004
    7901005    PRTPATHSPLIT pSplitFn;
     
    8751090{
    8761091    char szSubDir[32];
    877     RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%X", uTimestamp, cbImage);
     1092    RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%x", uTimestamp, cbImage);
    8781093    return rtDbgCfgOpenWithSubDir(hDbgCfg, pszFilename, szSubDir,
    8791094                                  RT_OPSYS_WINDOWS /* approx */ | RTDBGCFG_O_SYMSRV | RTDBGCFG_O_CASE_INSENSITIVE
    880                                   | RTDBGCFG_O_EXECUTABLE_IMAGE,
     1095                                  | RTDBGCFG_O_MAYBE_COMPRESSED_MS | RTDBGCFG_O_EXECUTABLE_IMAGE,
    8811096                                  pfnCallback, pvUser1, pvUser2);
    8821097}
     
    9001115        while ((ch = *pszSrc++))
    9011116            if (ch != '-')
    902                 *pszDst++ = ch;
    903             else if (RT_C_IS_LOWER(ch))
    9041117                *pszDst++ = RT_C_TO_UPPER(ch);
    9051118
     
    9091122    return rtDbgCfgOpenWithSubDir(hDbgCfg, pszFilename, szSubDir,
    9101123                                  RT_OPSYS_WINDOWS /* approx */ | RTDBGCFG_O_SYMSRV | RTDBGCFG_O_CASE_INSENSITIVE
    911                                   | RTDBGCFG_O_EXT_DEBUG_FILE,
     1124                                  | RTDBGCFG_O_MAYBE_COMPRESSED_MS | RTDBGCFG_O_EXT_DEBUG_FILE,
    9121125                                  pfnCallback, pvUser1, pvUser2);
    9131126}
     
    9191132    /** @todo test this! */
    9201133    char szSubDir[32];
    921     RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%X", uTimestamp, uAge);
     1134    RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%x", uTimestamp, uAge);
    9221135    return rtDbgCfgOpenWithSubDir(hDbgCfg, pszFilename, szSubDir,
    9231136                                  RT_OPSYS_WINDOWS /* approx */ | RTDBGCFG_O_SYMSRV | RTDBGCFG_O_CASE_INSENSITIVE
    924                                   | RTDBGCFG_O_EXT_DEBUG_FILE,
     1137                                  | RTDBGCFG_O_MAYBE_COMPRESSED_MS | RTDBGCFG_O_EXT_DEBUG_FILE,
    9251138                                  pfnCallback, pvUser1, pvUser2);
    9261139}
     
    9311144{
    9321145    char szSubDir[32];
    933     RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%X", uTimestamp, cbImage);
     1146    RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%x", uTimestamp, cbImage);
    9341147    return rtDbgCfgOpenWithSubDir(hDbgCfg, pszFilename, szSubDir,
    9351148                                  RT_OPSYS_WINDOWS /* approx */ | RTDBGCFG_O_SYMSRV | RTDBGCFG_O_CASE_INSENSITIVE
    936                                   | RTDBGCFG_O_EXT_DEBUG_FILE,
     1149                                  | RTDBGCFG_O_MAYBE_COMPRESSED_MS | RTDBGCFG_O_EXT_DEBUG_FILE,
    9371150                                  pfnCallback, pvUser1, pvUser2);
    9381151}
  • trunk/src/VBox/Runtime/common/dbg/dbgmod.cpp

    r46048 r46070  
    785785
    786786    /*
     787     * Replace the image file name while probing it.
     788     */
     789    const char *pszNewImgFile = RTStrCacheEnter(g_hDbgModStrCache, pszFilename);
     790    if (!pszNewImgFile)
     791        return VERR_NO_STR_MEMORY;
     792    const char *pszOldImgFile = pDbgMod->pszImgFile;
     793    pDbgMod->pszImgFile = pszNewImgFile;
     794
     795    /*
    787796     * Find an image reader which groks the file.
    788797     */
     
    802811            Assert(pDbgMod->pvImgPriv == NULL);
    803812        }
    804     }
    805     RTSemRWReleaseRead(g_hDbgModRWSem);
    806     if (RT_FAILURE(rc))
    807     {
    808         LogFlow(("rtDbgModFromPeImageOpenCallback: Failed %Rrc - %s\n", rc, pszFilename));
    809         return rc;
    810     }
    811 
    812     /*
    813      * Check the deferred info.
    814      */
    815     RTUINTPTR cbImage = pDbgMod->pImgVt->pfnImageSize(pDbgMod);
    816     if (   pDeferred->cbImage == 0
    817         || pDeferred->cbImage == cbImage)
    818     {
    819         uint32_t uTimestamp = pDeferred->u.PeImage.uTimestamp; /** @todo add method for getting the timestamp. */
    820         if (   pDeferred->u.PeImage.uTimestamp == 0
    821             || pDeferred->u.PeImage.uTimestamp == uTimestamp)
     813        RTSemRWReleaseRead(g_hDbgModRWSem);
     814        if (RT_SUCCESS(rc))
    822815        {
    823             Log(("RTDbgMod: Found matching PE image '%s'\n", pszFilename));
    824 
    825816            /*
    826              * We found the executable image we need, now go find any debug
    827              * info associated with it.  For PE images, this is generally
    828              * found in an external file, so we do a sweep for that first.
     817             * Check the deferred info.
    829818             */
    830             rc = rtDbgModOpenDebugInfoExternalToImage(pDbgMod, pDeferred->hDbgCfg);
    831             if (RT_SUCCESS(rc))
    832                 return VINF_CALLBACK_RETURN;
    833 
    834             /*
    835              * Try open debug info inside the module, falling back on exports.
    836              */
    837             rc = rtDbgModOpenDebugInfoInsideImage(pDbgMod);
    838             if (RT_SUCCESS(rc))
    839                 return VINF_CALLBACK_RETURN;
    840             /** @todo search for external files that could contain more useful info, like
    841              *        .map files?? No? */
    842             rc = rtDbgModCreateForExports(pDbgMod);
    843             if (RT_SUCCESS(rc))
    844                 return VINF_CALLBACK_RETURN;
    845 
    846             /* Something bad happened, just give up. */
    847             Log(("rtDbgModFromPeImageOpenCallback: rtDbgModCreateForExports failed: %Rrc\n", rc));
     819            RTUINTPTR cbImage = pDbgMod->pImgVt->pfnImageSize(pDbgMod);
     820            if (   pDeferred->cbImage == 0
     821                || pDeferred->cbImage == cbImage)
     822            {
     823                uint32_t uTimestamp = pDeferred->u.PeImage.uTimestamp; /** @todo add method for getting the timestamp. */
     824                if (   pDeferred->u.PeImage.uTimestamp == 0
     825                    || pDeferred->u.PeImage.uTimestamp == uTimestamp)
     826                {
     827                    Log(("RTDbgMod: Found matching PE image '%s'\n", pszFilename));
     828
     829                    /*
     830                     * We found the executable image we need, now go find any
     831                     * debug info associated with it.  For PE images, this is
     832                     * generally found in an external file, so we do a sweep
     833                     * for that first.
     834                     *
     835                     * Then try open debug inside the module, and finally
     836                     * falling back on exports.
     837                     */
     838                    rc = rtDbgModOpenDebugInfoExternalToImage(pDbgMod, pDeferred->hDbgCfg);
     839                    if (RT_FAILURE(rc))
     840                        rc = rtDbgModOpenDebugInfoInsideImage(pDbgMod);
     841                    if (RT_FAILURE(rc))
     842                        rc = rtDbgModCreateForExports(pDbgMod);
     843                    if (RT_SUCCESS(rc))
     844                    {
     845                        RTStrCacheRelease(g_hDbgModStrCache, pszOldImgFile);
     846                        return VINF_CALLBACK_RETURN;
     847                    }
     848
     849                    /* Something bad happened, just give up. */
     850                    Log(("rtDbgModFromPeImageOpenCallback: rtDbgModCreateForExports failed: %Rrc\n", rc));
     851                }
     852                else
     853                {
     854                    LogFlow(("rtDbgModFromPeImageOpenCallback: uTimestamp mismatch (found %#x, expected %#x) - %s\n",
     855                             uTimestamp, pDeferred->u.PeImage.uTimestamp, pszFilename));
     856                    rc = VERR_DBG_FILE_MISMATCH;
     857                }
     858            }
     859            else
     860            {
     861                LogFlow(("rtDbgModFromPeImageOpenCallback: cbImage mismatch (found %#x, expected %#x) - %s\n",
     862                         cbImage, pDeferred->cbImage, pszFilename));
     863                rc = VERR_DBG_FILE_MISMATCH;
     864            }
     865
     866            pDbgMod->pImgVt->pfnClose(pDbgMod);
     867            pDbgMod->pImgVt    = NULL;
     868            pDbgMod->pvImgPriv = NULL;
    848869        }
    849870        else
    850         {
    851             LogFlow(("rtDbgModFromPeImageOpenCallback: uTimestamp mismatch (found %#x, expected %#x) - %s\n",
    852                      uTimestamp, pDeferred->u.PeImage.uTimestamp, pszFilename));
    853             rc = VERR_DBG_FILE_MISMATCH;
    854         }
     871            LogFlow(("rtDbgModFromPeImageOpenCallback: Failed %Rrc - %s\n", rc, pszFilename));
    855872    }
    856     else
    857     {
    858         LogFlow(("rtDbgModFromPeImageOpenCallback: cbImage mismatch (found %#x, expected %#x) - %s\n",
    859                  cbImage, pDeferred->cbImage, pszFilename));
    860         rc = VERR_DBG_FILE_MISMATCH;
    861     }
    862 
    863     pDbgMod->pImgVt->pfnClose(pDbgMod);
    864     pDbgMod->pImgVt    = NULL;
    865     pDbgMod->pvImgPriv = NULL;
    866 
     873
     874    /* Restore image name. */
     875    pDbgMod->pszImgFile = pszOldImgFile;
     876    RTStrCacheRelease(g_hDbgModStrCache, pszNewImgFile);
    867877    return rc;
    868878}
  • trunk/src/VBox/Runtime/common/misc/http.cpp

    r46050 r46070  
    3030*******************************************************************************/
    3131#include <iprt/http.h>
     32#include "internal/iprt.h"
     33
    3234#include <iprt/assert.h>
     35#include <iprt/env.h>
    3336#include <iprt/err.h>
    3437#include <iprt/mem.h>
     
    170173
    171174    return VINF_SUCCESS;
     175}
     176
     177RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp)
     178{
     179    PRTHTTPINTERNAL pHttpInt = hHttp;
     180    RTHTTP_VALID_RETURN(pHttpInt);
     181
     182    /*
     183     * Very limited right now, just enought to make it work for ourselves.
     184     */
     185    char szProxy[_1K];
     186    int rc = RTEnvGetEx(RTENV_DEFAULT, "http_proxy", szProxy, sizeof(szProxy), NULL);
     187    if (RT_SUCCESS(rc))
     188    {
     189        int rcCurl;
     190        if (!strncmp(szProxy, RT_STR_TUPLE("http://")))
     191        {
     192            rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROXY, &szProxy[sizeof("http://") - 1]);
     193            if (CURL_FAILED(rcCurl))
     194                return VERR_INVALID_PARAMETER;
     195            rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROXYPORT, 80);
     196            if (CURL_FAILED(rcCurl))
     197                return VERR_INVALID_PARAMETER;
     198        }
     199        else
     200        {
     201            rcCurl = curl_easy_setopt(pHttpInt->pCurl, CURLOPT_PROXY, &szProxy[sizeof("http://") - 1]);
     202            if (CURL_FAILED(rcCurl))
     203                return VERR_INVALID_PARAMETER;
     204        }
     205    }
     206    else if (rc == VERR_ENV_VAR_NOT_FOUND)
     207        rc = VINF_SUCCESS;
     208
     209    return rc;
    172210}
    173211
  • trunk/src/VBox/Runtime/tools/RTLdrFlt.cpp

    r46050 r46070  
    145145    {
    146146        { "--input",        'i', RTGETOPT_REQ_STRING },
     147        { "--local-file",   'l', RTGETOPT_REQ_NOTHING },
     148        { "--cache-file",   'c', RTGETOPT_REQ_NOTHING },
    147149        { "--pe-image",     'p', RTGETOPT_REQ_NOTHING },
    148150        { "--verbose",      'v', RTGETOPT_REQ_NOTHING },
     
    156158        kOpenMethod_FromPeImage
    157159    }               enmOpenMethod   = kOpenMethod_FromImage;
     160    bool            fCacheFile      = false;
    158161
    159162    RTGETOPTUNION   ValueUnion;
     
    168171                if (RT_FAILURE(rc))
    169172                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to open '%s' for reading: %Rrc", ValueUnion.psz, rc);
     173                break;
     174
     175            case 'c':
     176                fCacheFile = true;
     177                break;
     178
     179            case 'l':
     180                fCacheFile = false;
    170181                break;
    171182
     
    209220                uint64_t u64Address = ValueUnion.u64;
    210221
     222                uint32_t cbImage    = 0;
     223                uint32_t uTimestamp = 0;
     224                if (fCacheFile)
     225                {
     226                    rc = RTGetOptFetchValue(&GetState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX);
     227                    if (RT_FAILURE(rc))
     228                        return RTGetOptPrintError(rc, &ValueUnion);
     229                    cbImage = ValueUnion.u32;
     230
     231                    rc = RTGetOptFetchValue(&GetState, &ValueUnion, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_HEX);
     232                    if (RT_FAILURE(rc))
     233                        return RTGetOptPrintError(rc, &ValueUnion);
     234                    uTimestamp = ValueUnion.u32;
     235                }
     236
    211237                RTDBGMOD hMod;
    212238                if (enmOpenMethod == kOpenMethod_FromImage)
    213239                    rc = RTDbgModCreateFromImage(&hMod, pszModule, NULL, hDbgCfg);
    214240                else
    215                     rc = RTDbgModCreateFromPeImage(&hMod, pszModule, NULL, 0, 0, hDbgCfg);
     241                    rc = RTDbgModCreateFromPeImage(&hMod, pszModule, NULL, cbImage, uTimestamp, hDbgCfg);
    216242                if (RT_FAILURE(rc))
    217243                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTDbgModCreateFromImage(,%s,,) -> %Rrc", pszModule, rc);
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