Changeset 2883
- Timestamp:
- Sep 6, 2016, 4:35:38 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kWorker/kWorker.c
r2881 r2883 173 173 /** The windows module handle. */ 174 174 HMODULE hOurMod; 175 /** The of the loaded image bits. */ 176 KSIZE cbImage; 175 177 176 178 union … … 179 181 struct 180 182 { 181 /** The of the loaded image bits. */182 KSIZE cbImage;183 183 /** Where we load the image. */ 184 184 void *pvLoad; … … 1225 1225 if (!pMod->fNative) 1226 1226 { 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); 1229 1229 } 1230 1230 … … 1435 1435 pMod->pLdrMod = pLdrMod; 1436 1436 pMod->hOurMod = (HMODULE)(KUPTR)pLdrMod->aSegments[0].MapAddress; 1437 pMod->cbImage = (KSIZE)kLdrModSize(pLdrMod); 1437 1438 1438 1439 if (fDoReplacements) … … 1559 1560 || pLdrMod->enmType == KLDRTYPE_SHARED_LIBRARY_FIXED; 1560 1561 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); 1562 1563 if ( !fFixed 1563 1564 || pLdrMod->enmType != KLDRTYPE_EXECUTABLE_FIXED /* only allow fixed executables */ 1564 1565 || (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); 1567 1568 else 1568 1569 pMod->u.Manual.fUseLdBuf = K_TRUE; 1569 1570 if (rc == 0) 1570 1571 { 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); 1572 1573 if (rc == 0) 1573 1574 { … … 1582 1583 kwLdrModuleLink(pMod); 1583 1584 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)); 1585 1586 kwDebuggerPrintf("TODO: .reload /f %s=%p\n", pMod->pszPath, pMod->u.Manual.pvLoad); 1586 1587 … … 1645 1646 } 1646 1647 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); 1649 1650 } 1650 1651 else if (fFixed) 1651 1652 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); 1653 1654 else 1654 kwErrPrintf("Failed to allocate %#x bytes\n", pMod-> u.Manual.cbImage);1655 kwErrPrintf("Failed to allocate %#x bytes\n", pMod->cbImage); 1655 1656 } 1656 1657 } … … 1963 1964 } 1964 1965 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); 1966 1967 pMod->u.Manual.enmState = KWMODSTATE_NEEDS_INIT; 1967 1968 } … … 3811 3812 } 3812 3813 3814 3815 /** NtDll - RtlPcToFileHeader 3816 * This is necessary for msvcr100.dll!CxxThrowException. */ 3817 static 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 } 3813 3890 3814 3891 … … 4645 4722 if (cbActually > cbToRead) 4646 4723 cbActually = cbToRead; 4647 else if (cbActually < cbToRead) 4648 ((KU8 *)pvBuffer)[cbActually] = '\0'; // hack hack hack4724 else if (cbActually < cbToRead) // debug debug debug 4725 kHlpMemSet((KU8 *)pvBuffer + cbActually, '\0', cbToRead - cbActually); // debug debug debug 4649 4726 4650 4727 #ifdef WITH_HASH_MD5_CACHE … … 5947 6024 { TUPLE("GetModuleFileNameA"), NULL, (KUPTR)kwSandbox_Kernel32_GetModuleFileNameA }, 5948 6025 { TUPLE("GetModuleFileNameW"), NULL, (KUPTR)kwSandbox_Kernel32_GetModuleFileNameW }, 6026 { TUPLE("RtlPcToFileHeader"), NULL, (KUPTR)kwSandbox_ntdll_RtlPcToFileHeader }, 5949 6027 5950 6028 { TUPLE("GetCommandLineA"), NULL, (KUPTR)kwSandbox_Kernel32_GetCommandLineA }, … … 6103 6181 { TUPLE("CryptDestroyHash"), NULL, (KUPTR)kwSandbox_Advapi32_CryptDestroyHash }, 6104 6182 #endif 6183 6184 { TUPLE("RtlPcToFileHeader"), NULL, (KUPTR)kwSandbox_ntdll_RtlPcToFileHeader }, 6105 6185 6106 6186 /* … … 6549 6629 PKWHASHMD5 pNext = pHash->pNext; 6550 6630 KWCRYPT_LOG(("Freeing leaked hash instance %#p\n", pHash)); 6551 kHlpFree(p Next);6631 kHlpFree(pHash); 6552 6632 pHash = pNext; 6553 6633 } … … 6577 6657 static void kwSandboxCleanup(PKWSANDBOX pSandbox) 6578 6658 { 6659 /* 6660 * Restore the parent command line string. 6661 */ 6579 6662 PPEB pPeb = kwSandboxGetProcessEnvironmentBlock(); 6580 6663 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 } 6581 6694 } 6582 6695 … … 7274 7387 // run 4: 32.67 /1024 = 0x0 (0.031904296875) [loader tweaking] 7275 7388 // 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 // 7276 7393 // Dell (W7/amd64, infected by mcafee): 7277 7394 // kmk 1: 285.278/1024 = 0x0 (0.278591796875)
Note:
See TracChangeset
for help on using the changeset viewer.