Changeset 2883 for trunk/src


Ignore:
Timestamp:
Sep 6, 2016, 4:35:38 AM (9 years ago)
Author:
bird
Message:

kWorker: Another exception thing, this time C++.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/kWorker.c

    r2881 r2883  
    173173    /** The windows module handle. */
    174174    HMODULE             hOurMod;
     175    /** The of the loaded image bits. */
     176    KSIZE               cbImage;
    175177
    176178    union
     
    179181        struct
    180182        {
    181             /** The of the loaded image bits. */
    182             KSIZE               cbImage;
    183183            /** Where we load the image. */
    184184            void               *pvLoad;
     
    12251225        if (!pMod->fNative)
    12261226        {
    1227             kHlpPageFree(pMod->u.Manual.pvCopy, pMod->u.Manual.cbImage);
    1228             kHlpPageFree(pMod->u.Manual.pvLoad, pMod->u.Manual.cbImage);
     1227            kHlpPageFree(pMod->u.Manual.pvCopy, pMod->cbImage);
     1228            kHlpPageFree(pMod->u.Manual.pvLoad, pMod->cbImage);
    12291229        }
    12301230
     
    14351435        pMod->pLdrMod       = pLdrMod;
    14361436        pMod->hOurMod       = (HMODULE)(KUPTR)pLdrMod->aSegments[0].MapAddress;
     1437        pMod->cbImage       = (KSIZE)kLdrModSize(pLdrMod);
    14371438
    14381439        if (fDoReplacements)
     
    15591560                          || pLdrMod->enmType == KLDRTYPE_SHARED_LIBRARY_FIXED;
    15601561                    pMod->u.Manual.pvLoad = fFixed ? (void *)(KUPTR)pLdrMod->aSegments[0].LinkAddress : NULL;
    1561                     pMod->u.Manual.cbImage = (KSIZE)kLdrModSize(pLdrMod);
     1562                    pMod->cbImage = (KSIZE)kLdrModSize(pLdrMod);
    15621563                    if (   !fFixed
    15631564                        || pLdrMod->enmType != KLDRTYPE_EXECUTABLE_FIXED /* only allow fixed executables */
    15641565                        || (KUPTR)pMod->u.Manual.pvLoad - (KUPTR)g_abDefLdBuf >= sizeof(g_abDefLdBuf)
    1565                         || sizeof(g_abDefLdBuf) - (KUPTR)pMod->u.Manual.pvLoad - (KUPTR)g_abDefLdBuf < pMod->u.Manual.cbImage)
    1566                         rc = kHlpPageAlloc(&pMod->u.Manual.pvLoad, pMod->u.Manual.cbImage, KPROT_EXECUTE_READWRITE, fFixed);
     1566                        || sizeof(g_abDefLdBuf) - (KUPTR)pMod->u.Manual.pvLoad - (KUPTR)g_abDefLdBuf < pMod->cbImage)
     1567                        rc = kHlpPageAlloc(&pMod->u.Manual.pvLoad, pMod->cbImage, KPROT_EXECUTE_READWRITE, fFixed);
    15671568                    else
    15681569                        pMod->u.Manual.fUseLdBuf = K_TRUE;
    15691570                    if (rc == 0)
    15701571                    {
    1571                         rc = kHlpPageAlloc(&pMod->u.Manual.pvCopy, pMod->u.Manual.cbImage, KPROT_READWRITE, K_FALSE);
     1572                        rc = kHlpPageAlloc(&pMod->u.Manual.pvCopy, pMod->cbImage, KPROT_READWRITE, K_FALSE);
    15721573                        if (rc == 0)
    15731574                        {
     
    15821583                                kwLdrModuleLink(pMod);
    15831584                            KW_LOG(("New module: %p LB %#010x %s (kLdr)\n",
    1584                                     pMod->u.Manual.pvLoad, pMod->u.Manual.cbImage, pMod->pszPath));
     1585                                    pMod->u.Manual.pvLoad, pMod->cbImage, pMod->pszPath));
    15851586                            kwDebuggerPrintf("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pvLoad);
    15861587
     
    16451646                        }
    16461647
    1647                         kHlpPageFree(pMod->u.Manual.pvLoad, pMod->u.Manual.cbImage);
    1648                         kwErrPrintf("Failed to allocate %#x bytes\n", pMod->u.Manual.cbImage);
     1648                        kHlpPageFree(pMod->u.Manual.pvLoad, pMod->cbImage);
     1649                        kwErrPrintf("Failed to allocate %#x bytes\n", pMod->cbImage);
    16491650                    }
    16501651                    else if (fFixed)
    16511652                        kwErrPrintf("Failed to allocate %#x bytes at %p\n",
    1652                                     pMod->u.Manual.cbImage, (void *)(KUPTR)pLdrMod->aSegments[0].LinkAddress);
     1653                                    pMod->cbImage, (void *)(KUPTR)pLdrMod->aSegments[0].LinkAddress);
    16531654                    else
    1654                         kwErrPrintf("Failed to allocate %#x bytes\n", pMod->u.Manual.cbImage);
     1655                        kwErrPrintf("Failed to allocate %#x bytes\n", pMod->cbImage);
    16551656                }
    16561657            }
     
    19631964            }
    19641965
    1965             kHlpMemCopy(pMod->u.Manual.pvLoad, pMod->u.Manual.pvCopy, pMod->u.Manual.cbImage);
     1966            kHlpMemCopy(pMod->u.Manual.pvLoad, pMod->u.Manual.pvCopy, pMod->cbImage);
    19661967            pMod->u.Manual.enmState = KWMODSTATE_NEEDS_INIT;
    19671968        }
     
    38113812}
    38123813
     3814
     3815/** NtDll - RtlPcToFileHeader
     3816 * This is necessary for msvcr100.dll!CxxThrowException.  */
     3817static PVOID WINAPI kwSandbox_ntdll_RtlPcToFileHeader(PVOID pvPC, PVOID *ppvImageBase)
     3818{
     3819    PVOID pvRet;
     3820
     3821    /*
     3822     * Do a binary lookup of the module table for the current tool.
     3823     * This will give us a
     3824     */
     3825    if (g_Sandbox.fRunning)
     3826    {
     3827        KUPTR const     uPC     = (KUPTR)pvPC;
     3828        PKWMODULE      *papMods = g_Sandbox.pTool->u.Sandboxed.papModules;
     3829        KU32            iEnd    = g_Sandbox.pTool->u.Sandboxed.cModules;
     3830        KU32            i;
     3831        if (iEnd)
     3832        {
     3833            KU32        iStart  = 0;
     3834            i = iEnd / 2;
     3835            for (;;)
     3836            {
     3837                KUPTR const uHModThis = (KUPTR)papMods[i]->hOurMod;
     3838                if (uPC < uHModThis)
     3839                {
     3840                    iEnd = i;
     3841                    if (iStart < i)
     3842                    { }
     3843                    else
     3844                        break;
     3845                }
     3846                else if (uPC != uHModThis)
     3847                {
     3848                    iStart = ++i;
     3849                    if (i < iEnd)
     3850                    { }
     3851                    else
     3852                        break;
     3853                }
     3854                else
     3855                {
     3856                    /* This isn't supposed to happen. */
     3857                    break;
     3858                }
     3859
     3860                i = iStart + (iEnd - iStart) / 2;
     3861            }
     3862
     3863            /* For reasons of simplicity (= copy & paste), we end up with the
     3864               module after the one we're interested in here.  */
     3865            i--;
     3866            if (i < g_Sandbox.pTool->u.Sandboxed.cModules
     3867                && papMods[i]->pLdrMod)
     3868            {
     3869                KSIZE uRvaPC = uPC - (KUPTR)papMods[i]->hOurMod;
     3870                if (uRvaPC < papMods[i]->cbImage)
     3871                {
     3872                    *ppvImageBase = papMods[i]->hOurMod;
     3873                    pvRet = papMods[i]->hOurMod;
     3874                    KW_LOG(("RtlPcToFileHeader(PC=%p) -> %p, *ppvImageBase=%p [our]\n", pvPC, pvRet, *ppvImageBase));
     3875                    return pvRet;
     3876                }
     3877            }
     3878        }
     3879        else
     3880            i = 0;
     3881    }
     3882
     3883    /*
     3884     * Call the regular API.
     3885     */
     3886    pvRet = RtlPcToFileHeader(pvPC, ppvImageBase);
     3887    KW_LOG(("RtlPcToFileHeader(PC=%p) -> %p, *ppvImageBase=%p \n", pvPC, pvRet, *ppvImageBase));
     3888    return pvRet;
     3889}
    38133890
    38143891
     
    46454722                    if (cbActually > cbToRead)
    46464723                        cbActually = cbToRead;
    4647                     else if (cbActually < cbToRead)
    4648                         ((KU8 *)pvBuffer)[cbActually] = '\0'; // hack hack hack
     4724                    else if (cbActually < cbToRead)                                            // debug debug debug
     4725                        kHlpMemSet((KU8 *)pvBuffer + cbActually, '\0', cbToRead - cbActually); // debug debug debug
    46494726
    46504727#ifdef WITH_HASH_MD5_CACHE
     
    59476024    { TUPLE("GetModuleFileNameA"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetModuleFileNameA },
    59486025    { TUPLE("GetModuleFileNameW"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetModuleFileNameW },
     6026    { TUPLE("RtlPcToFileHeader"),           NULL,       (KUPTR)kwSandbox_ntdll_RtlPcToFileHeader },
    59496027
    59506028    { TUPLE("GetCommandLineA"),             NULL,       (KUPTR)kwSandbox_Kernel32_GetCommandLineA },
     
    61036181    { TUPLE("CryptDestroyHash"),            NULL,       (KUPTR)kwSandbox_Advapi32_CryptDestroyHash },
    61046182#endif
     6183
     6184    { TUPLE("RtlPcToFileHeader"),           NULL,       (KUPTR)kwSandbox_ntdll_RtlPcToFileHeader },
    61056185
    61066186    /*
     
    65496629        PKWHASHMD5 pNext = pHash->pNext;
    65506630        KWCRYPT_LOG(("Freeing leaked hash instance %#p\n", pHash));
    6551         kHlpFree(pNext);
     6631        kHlpFree(pHash);
    65526632        pHash = pNext;
    65536633    }
     
    65776657static void kwSandboxCleanup(PKWSANDBOX pSandbox)
    65786658{
     6659    /*
     6660     * Restore the parent command line string.
     6661     */
    65796662    PPEB pPeb = kwSandboxGetProcessEnvironmentBlock();
    65806663    pPeb->ProcessParameters->CommandLine = pSandbox->SavedCommandLine;
     6664
     6665    /*
     6666     * Kill all open handles.
     6667     */
     6668    if (pSandbox->cActiveHandles > 0)
     6669    {
     6670        KU32 i = pSandbox->cHandles;
     6671        while (i-- > 0)
     6672            if (pSandbox->papHandles[i] == NULL)
     6673            { /* likely */ }
     6674            else
     6675            {
     6676                PKWHANDLE pHandle = pSandbox->papHandles[i];
     6677                pSandbox->papHandles[i] = NULL;
     6678                switch (pHandle->enmType)
     6679                {
     6680                    case KWHANDLETYPE_FSOBJ_READ_CACHE:
     6681                        break;
     6682                    case KWHANDLETYPE_TEMP_FILE:
     6683                    case KWHANDLETYPE_TEMP_FILE_MAPPING:
     6684                        pHandle->u.pTempFile->cActiveHandles--;
     6685                        break;
     6686                    default:
     6687                        kHlpAssertFailed();
     6688                }
     6689                kHlpFree(pHandle);
     6690                if (--pSandbox->cActiveHandles == 0)
     6691                    break;
     6692            }
     6693    }
    65816694}
    65826695
     
    72747387//     run 4:  32.67 /1024 = 0x0 (0.031904296875)  [loader tweaking]
    72757388//     run 5:  29.144/1024 = 0x0 (0.0284609375)    [with temp files in memory]
     7389//    r2881 building src/VBox/Runtime:
     7390//     without: 2m01.016388s = 120.016388 s
     7391//     with:    1m15.165069s = 75.165069 s => 120.016388s - 75.165069s = 44.851319s => 44.85/120.02 = 37% speed up.
     7392//
    72767393// Dell (W7/amd64, infected by mcafee):
    72777394//     kmk 1: 285.278/1024 = 0x0 (0.278591796875)
Note: See TracChangeset for help on using the changeset viewer.