- Timestamp:
- Sep 9, 2016, 7:15:22 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kWorker/kWorker.c
r2900 r2902 443 443 444 444 445 /** Pointer to a heap (HeapCreate) tracker entry. */ 446 typedef struct KWHEAP *PKWHEAP; 447 /** 448 * Tracking an heap (HeapCreate) 449 */ 450 typedef struct KWHEAP 451 { 452 PKWHEAP pNext; 453 HANDLE hHeap; 454 } KWHEAP; 455 456 445 457 /** Pointer to a FlsAlloc/TlsAlloc tracker entry. */ 446 458 typedef struct KWLOCALSTORAGE *PKWLOCALSTORAGE; … … 453 465 KU32 idx; 454 466 } KWLOCALSTORAGE; 467 468 469 /** Pointer to an at exit callback record */ 470 typedef struct KWEXITCALLACK *PKWEXITCALLACK; 471 /** 472 * At exit callback record. 473 */ 474 typedef struct KWEXITCALLACK 475 { 476 PKWEXITCALLACK pNext; 477 _onexit_t pfnCallback; 478 /** At exit doesn't have an exit code. */ 479 KBOOL fAtExit; 480 } KWEXITCALLACK; 455 481 456 482 … … 469 495 KWTOOLHINT_NONE, 470 496 KWTOOLHINT_VISUAL_CPP_CL, 497 KWTOOLHINT_VISUAL_CPP_LINK, 471 498 KWTOOLHINT_END 472 499 } KWTOOLHINT; … … 577 604 /** Head of the virtual alloc allocations. */ 578 605 PKWVIRTALLOC pVirtualAllocHead; 606 /** Head of the heap list (HeapCreate). 607 * This is only done from images we forcibly restore. */ 608 PKWHEAP pHeapHead; 579 609 /** Head of the FlsAlloc indexes. */ 580 610 PKWLOCALSTORAGE pFlsAllocHead; 581 611 /** Head of the TlsAlloc indexes. */ 582 612 PKWLOCALSTORAGE pTlsAllocHead; 613 614 /** The at exit callback head. 615 * This is only done from images we forcibly restore. */ 616 PKWEXITCALLACK pExitCallbackHead; 583 617 584 618 UNICODE_STRING SavedCommandLine; … … 627 661 /** The replacement function or data address. */ 628 662 KUPTR pfnReplacement; 663 /** Only replace in the executable. 664 * @todo fix the reinitialization of non-native DLLs! */ 665 KBOOL fOnlyExe; 629 666 } KWREPLACEMENTFUNCTION; 630 667 typedef KWREPLACEMENTFUNCTION const *PCKWREPLACEMENTFUNCTION; … … 1759 1796 || kHlpStrICompAscii(g_aSandboxReplacements[i].pszModule, &pImpMod->pszPath[pImpMod->offFilename]) == 0) 1760 1797 { 1761 KW_LOG(("replacing %s!%s\n", &pImpMod->pszPath[pImpMod->offFilename], g_aSandboxReplacements[i].pszFunction)); 1762 *puValue = g_aSandboxReplacements[i].pfnReplacement; 1798 if ( pCurMod->fExe 1799 || !g_aSandboxReplacements[i].fOnlyExe) 1800 { 1801 KW_LOG(("replacing %s!%s\n",&pImpMod->pszPath[pImpMod->offFilename], g_aSandboxReplacements[i].pszFunction)); 1802 *puValue = g_aSandboxReplacements[i].pfnReplacement; 1803 } 1763 1804 break; 1764 1805 } … … 2292 2333 if (kHlpStrICompAscii(pToolFsObj->pszName, "cl.exe") == 0) 2293 2334 pTool->u.Sandboxed.enmHint = KWTOOLHINT_VISUAL_CPP_CL; 2335 else if (kHlpStrICompAscii(pToolFsObj->pszName, "link.exe") == 0) 2336 pTool->u.Sandboxed.enmHint = KWTOOLHINT_VISUAL_CPP_LINK; 2294 2337 else 2295 2338 pTool->u.Sandboxed.enmHint = KWTOOLHINT_NONE; … … 2592 2635 2593 2636 2637 /** CRT - _onexit */ 2638 static _onexit_t __cdecl kwSandbox_msvcrt__onexit(_onexit_t pfnFunc) 2639 { 2640 PKWEXITCALLACK pCallback; 2641 KW_LOG(("_onexit(%p)\n", pfnFunc)); 2642 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2643 2644 pCallback = kHlpAlloc(sizeof(*pCallback)); 2645 if (pCallback) 2646 { 2647 pCallback->pfnCallback = pfnFunc; 2648 pCallback->fAtExit = K_FALSE; 2649 pCallback->pNext = g_Sandbox.pExitCallbackHead; 2650 g_Sandbox.pExitCallbackHead = pCallback; 2651 return pfnFunc; 2652 } 2653 2654 return NULL; 2655 } 2656 2657 2658 /** CRT - atexit */ 2659 static int __cdecl kwSandbox_msvcrt_atexit(int (__cdecl *pfnFunc)(void)) 2660 { 2661 PKWEXITCALLACK pCallback; 2662 KW_LOG(("_onexit(%p)\n", pfnFunc)); 2663 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2664 2665 pCallback = kHlpAlloc(sizeof(*pCallback)); 2666 if (pCallback) 2667 { 2668 pCallback->pfnCallback = (_onexit_t)pfnFunc; 2669 pCallback->fAtExit = K_TRUE; 2670 pCallback->pNext = g_Sandbox.pExitCallbackHead; 2671 g_Sandbox.pExitCallbackHead = pCallback; 2672 return 0; 2673 } 2674 2675 return -1; 2676 } 2677 2678 2594 2679 /** Kernel32 - SetConsoleCtrlHandler(). */ 2595 2680 static BOOL WINAPI kwSandbox_Kernel32_SetConsoleCtrlHandler(PHANDLER_ROUTINE pfnHandler, BOOL fAdd) … … 2604 2689 int dowildcard, int const *piNewMode) 2605 2690 { 2691 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2606 2692 *pargc = g_Sandbox.cArgs; 2607 2693 *pargv = g_Sandbox.papszArgs; … … 2617 2703 int dowildcard, int const *piNewMode) 2618 2704 { 2705 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2619 2706 *pargc = g_Sandbox.cArgs; 2620 2707 *pargv = g_Sandbox.papwszArgs; … … 2630 2717 static LPCSTR /*LPSTR*/ WINAPI kwSandbox_Kernel32_GetCommandLineA(VOID) 2631 2718 { 2719 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2632 2720 return g_Sandbox.pszCmdLine; 2633 2721 } … … 2637 2725 static LPCWSTR /*LPWSTR*/ WINAPI kwSandbox_Kernel32_GetCommandLineW(VOID) 2638 2726 { 2727 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2639 2728 return g_Sandbox.pwszCmdLine; 2640 2729 } … … 2668 2757 static int * __cdecl kwSandbox_msvcrt___p___argc(void) 2669 2758 { 2759 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2670 2760 return &g_Sandbox.cArgs; 2671 2761 } … … 2675 2765 static char *** __cdecl kwSandbox_msvcrt___p___argv(void) 2676 2766 { 2767 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2677 2768 return &g_Sandbox.papszArgs; 2678 2769 } … … 2682 2773 static wchar_t *** __cdecl kwSandbox_msvcrt___p___wargv(void) 2683 2774 { 2775 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2684 2776 return &g_Sandbox.papwszArgs; 2685 2777 } … … 2689 2781 static char ** __cdecl kwSandbox_msvcrt___p__acmdln(void) 2690 2782 { 2783 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2691 2784 return (char **)&g_Sandbox.pszCmdLine; 2692 2785 } … … 2696 2789 static wchar_t ** __cdecl kwSandbox_msvcrt___p__wcmdln(void) 2697 2790 { 2791 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2698 2792 return &g_Sandbox.pwszCmdLine; 2699 2793 } … … 2703 2797 static char ** __cdecl kwSandbox_msvcrt___p__pgmptr(void) 2704 2798 { 2799 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2705 2800 return &g_Sandbox.pgmptr; 2706 2801 } … … 2710 2805 static wchar_t ** __cdecl kwSandbox_msvcrt___p__wpgmptr(void) 2711 2806 { 2807 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2712 2808 return &g_Sandbox.wpgmptr; 2713 2809 } … … 2717 2813 static errno_t __cdecl kwSandbox_msvcrt__get_pgmptr(char **ppszValue) 2718 2814 { 2815 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2719 2816 *ppszValue = g_Sandbox.pgmptr; 2720 2817 return 0; … … 2725 2822 static errno_t __cdecl kwSandbox_msvcrt__get_wpgmptr(wchar_t **ppwszValue) 2726 2823 { 2824 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2727 2825 *ppwszValue = g_Sandbox.wpgmptr; 2728 2826 return 0; … … 2732 2830 static void kwSandbox_msvcrt__wincmdln(void) 2733 2831 { 2832 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2734 2833 KWFS_TODO(); 2735 2834 } … … 2739 2838 static void kwSandbox_msvcrt__wwincmdln(void) 2740 2839 { 2840 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2741 2841 KWFS_TODO(); 2742 2842 } … … 2747 2847 DWORD fFlags, PDWORD pidThread) 2748 2848 { 2749 KWFS_TODO(); 2750 return NULL; 2849 HANDLE hThread = NULL; 2850 KW_LOG(("CreateThread: pSecAttr=%p (inh=%d) cbStack=%#x pfnThreadProc=%p pvUser=%p fFlags=%#x pidThread=%p\n", 2851 pSecAttr, pSecAttr ? pSecAttr->bInheritHandle : 0, cbStack, pfnThreadProc, pvUser, fFlags, pidThread)); 2852 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2853 if (g_Sandbox.pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_LINK) 2854 { 2855 /* Allow link::DbgThread. */ 2856 hThread = CreateThread(pSecAttr, cbStack, pfnThreadProc, pvUser, fFlags, pidThread); 2857 KW_LOG(("CreateThread -> %p, *pidThread=%#x\n", hThread, pidThread ? *pidThread : 0)); 2858 } 2859 else 2860 KWFS_TODO(); 2861 return hThread; 2751 2862 } 2752 2863 … … 2755 2866 static uintptr_t __cdecl kwSandbox_msvcrt__beginthread(void (__cdecl *pfnThreadProc)(void *), unsigned cbStack, void *pvUser) 2756 2867 { 2868 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2757 2869 KWFS_TODO(); 2758 2870 return 0; … … 2765 2877 unsigned fCreate, unsigned *pidThread) 2766 2878 { 2879 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2767 2880 KWFS_TODO(); 2768 2881 return 0; … … 2782 2895 { 2783 2896 char *pszzEnv; 2784 2785 /* Figure how space much we need first. */2786 2897 char *pszCur; 2787 2898 KSIZE cbNeeded = 1; 2788 2899 KSIZE iVar = 0; 2900 2901 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2902 2903 /* Figure how space much we need first. */ 2789 2904 while ((pszCur = g_Sandbox.papszEnvVars[iVar++]) != NULL) 2790 2905 cbNeeded += kHlpStrLen(pszCur) + 1; … … 2837 2952 { 2838 2953 wchar_t *pwszzEnv; 2839 2840 /* Figure how space much we need first. */2841 2954 wchar_t *pwszCur; 2842 2955 KSIZE cwcNeeded = 1; 2843 2956 KSIZE iVar = 0; 2957 2958 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2959 2960 /* Figure how space much we need first. */ 2844 2961 while ((pwszCur = g_Sandbox.papwszEnvVars[iVar++]) != NULL) 2845 2962 cwcNeeded += kwUtf16Len(pwszCur) + 1; … … 2870 2987 { 2871 2988 KW_LOG(("FreeEnvironmentStringsA: %p -> TRUE\n", pszzEnv)); 2989 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2872 2990 kHlpFree(pszzEnv); 2873 2991 return TRUE; … … 2879 2997 { 2880 2998 KW_LOG(("FreeEnvironmentStringsW: %p -> TRUE\n", pwszzEnv)); 2999 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 2881 3000 kHlpFree(pwszzEnv); 2882 3001 return TRUE; … … 3206 3325 static DWORD WINAPI kwSandbox_Kernel32_GetEnvironmentVariableA(LPCSTR pszVar, LPSTR pszValue, DWORD cbValue) 3207 3326 { 3208 char *pszFoundValue = kwSandboxDoGetEnvA(&g_Sandbox, pszVar, kHlpStrLen(pszVar)); 3327 char *pszFoundValue; 3328 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3329 3330 pszFoundValue = kwSandboxDoGetEnvA(&g_Sandbox, pszVar, kHlpStrLen(pszVar)); 3209 3331 if (pszFoundValue) 3210 3332 { … … 3222 3344 static DWORD WINAPI kwSandbox_Kernel32_GetEnvironmentVariableW(LPCWSTR pwszVar, LPWSTR pwszValue, DWORD cwcValue) 3223 3345 { 3224 wchar_t *pwszFoundValue = kwSandboxDoGetEnvW(&g_Sandbox, pwszVar, kwUtf16Len(pwszVar)); 3346 wchar_t *pwszFoundValue; 3347 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3348 3349 pwszFoundValue = kwSandboxDoGetEnvW(&g_Sandbox, pwszVar, kwUtf16Len(pwszVar)); 3225 3350 if (pwszFoundValue) 3226 3351 { … … 3239 3364 { 3240 3365 int rc; 3366 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3367 3241 3368 if (pszValue) 3242 3369 rc = kwSandboxDoSetEnvA(&g_Sandbox, pszVar, kHlpStrLen(pszVar), pszValue); … … 3261 3388 { 3262 3389 int rc; 3390 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3391 3263 3392 if (pwszValue) 3264 3393 rc = kwSandboxDoSetEnvW(&g_Sandbox, pwszVar, kwUtf16Len(pwszVar), pwszValue); … … 3282 3411 static DWORD WINAPI kwSandbox_Kernel32_ExpandEnvironmentStringsA(LPCSTR pszSrc, LPSTR pwszDst, DWORD cbDst) 3283 3412 { 3413 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3284 3414 KWFS_TODO(); 3285 3415 return 0; … … 3290 3420 static DWORD WINAPI kwSandbox_Kernel32_ExpandEnvironmentStringsW(LPCWSTR pwszSrc, LPWSTR pwszDst, DWORD cbDst) 3291 3421 { 3422 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3292 3423 KWFS_TODO(); 3293 3424 return 0; … … 3299 3430 { 3300 3431 int rc; 3301 char const *pszEqual = kHlpStrChr(pszVarEqualValue, '='); 3432 char const *pszEqual; 3433 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3434 3435 pszEqual = kHlpStrChr(pszVarEqualValue, '='); 3302 3436 if (pszEqual) 3303 3437 { … … 3322 3456 { 3323 3457 int rc; 3324 wchar_t const *pwszEqual = wcschr(pwszVarEqualValue, '='); 3458 wchar_t const *pwszEqual; 3459 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3460 3461 pwszEqual = wcschr(pwszVarEqualValue, '='); 3325 3462 if (pwszEqual) 3326 3463 { … … 3344 3481 static errno_t __cdecl kwSandbox_msvcrt__putenv_s(const char *pszVar, const char *pszValue) 3345 3482 { 3346 char const *pszEqual = kHlpStrChr(pszVar, '='); 3483 char const *pszEqual; 3484 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3485 3486 pszEqual = kHlpStrChr(pszVar, '='); 3347 3487 if (pszEqual == NULL) 3348 3488 { … … 3373 3513 static errno_t __cdecl kwSandbox_msvcrt__wputenv_s(const wchar_t *pwszVar, const wchar_t *pwszValue) 3374 3514 { 3375 wchar_t const *pwszEqual = wcschr(pwszVar, '='); 3515 wchar_t const *pwszEqual; 3516 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3517 3518 pwszEqual = wcschr(pwszVar, '='); 3376 3519 if (pwszEqual == NULL) 3377 3520 { … … 3403 3546 { 3404 3547 KW_LOG(("__p___initenv\n")); 3548 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3405 3549 KWFS_TODO(); 3406 3550 return &g_Sandbox.initenv; … … 3412 3556 { 3413 3557 KW_LOG(("__p___winitenv\n")); 3558 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3414 3559 KWFS_TODO(); 3415 3560 return &g_Sandbox.winitenv; … … 3421 3566 { 3422 3567 KW_LOG(("__p__environ\n")); 3568 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3423 3569 return &g_Sandbox.environ; 3424 3570 } … … 3429 3575 { 3430 3576 KW_LOG(("__p__wenviron\n")); 3577 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3431 3578 return &g_Sandbox.wenviron; 3432 3579 } … … 3438 3585 { 3439 3586 KWFS_TODO(); /** @todo check the callers expectations! */ 3587 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3440 3588 *ppapszEnviron = g_Sandbox.environ; 3441 3589 return 0; … … 3448 3596 { 3449 3597 KWFS_TODO(); /** @todo check the callers expectations! */ 3598 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3450 3599 *ppapwszEnviron = g_Sandbox.wenviron; 3451 3600 return 0; … … 3585 3734 PKWMODULE pMod; 3586 3735 int rc; 3736 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3587 3737 3588 3738 /* … … 3732 3882 { 3733 3883 /* Ignored, we like to keep everything loaded. */ 3884 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3734 3885 return TRUE; 3735 3886 } … … 3741 3892 KSIZE i; 3742 3893 KSIZE cchModule; 3894 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3743 3895 3744 3896 /* … … 3771 3923 KSIZE i; 3772 3924 KSIZE cwcModule; 3925 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3773 3926 3774 3927 /* … … 3799 3952 static UINT WINAPI kwSandbox_BreakIntoDebugger(void *pv1, void *pv2, void *pv3, void *pv4) 3800 3953 { 3954 #ifdef _MSC_VER 3955 __debugbreak(); 3956 #else 3801 3957 KWFS_TODO(); 3958 #endif 3802 3959 return -1; 3803 3960 } … … 3808 3965 { 3809 3966 KSIZE i; 3967 PKWMODULE pMod; 3968 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 3810 3969 3811 3970 /* 3812 3971 * Try locate the module. 3813 3972 */ 3814 PKWMODULEpMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod);3973 pMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod); 3815 3974 if (pMod) 3816 3975 { … … 3858 4017 static DWORD WINAPI kwSandbox_Kernel32_GetModuleFileNameA(HMODULE hmod, LPSTR pszFilename, DWORD cbFilename) 3859 4018 { 3860 PKWMODULE pMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod); 4019 PKWMODULE pMod; 4020 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4021 4022 pMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod); 3861 4023 if (pMod != NULL) 3862 4024 { … … 3873 4035 static DWORD WINAPI kwSandbox_Kernel32_GetModuleFileNameW(HMODULE hmod, LPWSTR pwszFilename, DWORD cbFilename) 3874 4036 { 3875 PKWMODULE pMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod); 4037 PKWMODULE pMod; 4038 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4039 4040 pMod = kwToolLocateModuleByHandle(g_Sandbox.pTool, hmod); 3876 4041 if (pMod) 3877 4042 { … … 4366 4531 MY_UNICODE_STRING UniStr; 4367 4532 MY_NTSTATUS rcNt; 4533 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4368 4534 4369 4535 /* … … 4538 4704 { 4539 4705 KFSLOOKUPERROR enmError; 4540 PKFSOBJ pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError); 4706 PKFSOBJ pFsObj; 4707 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4708 4709 pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError); 4541 4710 if (pFsObj) 4542 4711 { … … 4617 4786 if (kwFsIsCachablePathExtensionW(pwszFilename, K_FALSE /*fAttrQuery*/)) 4618 4787 { 4619 /** @todo rewrite topure UTF-16. */4788 /** @todo rewrite in pure UTF-16. */ 4620 4789 char szTmp[2048]; 4621 4790 KSIZE cch = kwUtf16ToStr(pwszFilename, szTmp, sizeof(szTmp)); … … 4648 4817 { 4649 4818 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 4819 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4650 4820 if (idxHandle < g_Sandbox.cHandles) 4651 4821 { … … 4728 4898 { 4729 4899 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 4900 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4730 4901 if (idxHandle < g_Sandbox.cHandles) 4731 4902 { … … 4807 4978 { 4808 4979 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 4980 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4809 4981 if (idxHandle < g_Sandbox.cHandles) 4810 4982 { … … 4922 5094 { 4923 5095 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5096 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 4924 5097 if (idxHandle < g_Sandbox.cHandles) 4925 5098 { … … 4998 5171 { 4999 5172 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5173 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5000 5174 if (idxHandle < g_Sandbox.cHandles) 5001 5175 { … … 5103 5277 { 5104 5278 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5279 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5105 5280 if (idxHandle < g_Sandbox.cHandles) 5106 5281 { … … 5121 5296 { 5122 5297 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5298 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5123 5299 if (idxHandle < g_Sandbox.cHandles) 5124 5300 { … … 5167 5343 { 5168 5344 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5345 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5169 5346 if (idxHandle < g_Sandbox.cHandles) 5170 5347 { … … 5194 5371 { 5195 5372 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5373 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5196 5374 if (idxHandle < g_Sandbox.cHandles) 5197 5375 { … … 5229 5407 { 5230 5408 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5409 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5231 5410 if (idxHandle < g_Sandbox.cHandles) 5232 5411 { … … 5265 5444 { 5266 5445 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hFile); 5446 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5267 5447 if (idxHandle < g_Sandbox.cHandles) 5268 5448 { … … 5304 5484 { 5305 5485 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hSection); 5486 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5306 5487 if (idxHandle < g_Sandbox.cHandles) 5307 5488 { … … 5389 5570 /* Is this one of our temporary mappings? */ 5390 5571 PKWFSTEMPFILE pCur = g_Sandbox.pTempFileHead; 5572 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5391 5573 while (pCur) 5392 5574 { … … 5415 5597 BOOL fRet; 5416 5598 KUPTR const idxHandle = KW_HANDLE_TO_INDEX(hObject); 5599 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5417 5600 if ( idxHandle < g_Sandbox.cHandles 5418 5601 && g_Sandbox.papHandles[idxHandle] != NULL) … … 5454 5637 { 5455 5638 KFSLOOKUPERROR enmError; 5456 PKFSOBJ pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError); 5639 PKFSOBJ pFsObj; 5640 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5641 5642 pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError); 5457 5643 if (pFsObj) 5458 5644 { … … 5484 5670 { 5485 5671 KFSLOOKUPERROR enmError; 5486 PKFSOBJ pFsObj = kFsCacheLookupNoMissingW(g_pFsCache, pwszFilename, &enmError); 5672 PKFSOBJ pFsObj; 5673 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5674 5675 pFsObj = kFsCacheLookupNoMissingW(g_pFsCache, pwszFilename, &enmError); 5487 5676 if (pFsObj) 5488 5677 { … … 5516 5705 { 5517 5706 KFSLOOKUPERROR enmError; 5518 PKFSOBJ pObj = kFsCacheLookupW(g_pFsCache, pwszLongPath, &enmError); 5707 PKFSOBJ pObj; 5708 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5709 5710 pObj = kFsCacheLookupW(g_pFsCache, pwszLongPath, &enmError); 5519 5711 if (pObj) 5520 5712 { … … 5568 5760 && kwFsIsClTempFileW(pwszFilename)) 5569 5761 { 5762 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5570 5763 KWFS_LOG(("DeleteFileW(%s) -> TRUE [temp]\n", pwszFilename)); 5571 5764 fRc = TRUE; … … 5978 6171 BOOL fRc; 5979 6172 PKWCONSOLEOUTPUTLINE pLineBuf; 6173 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 5980 6174 5981 6175 if (hConOutput == g_Sandbox.StdErr.hOutput) … … 6009 6203 BOOL fRc; 6010 6204 PKWCONSOLEOUTPUTLINE pLineBuf; 6205 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6011 6206 6012 6207 if (hConOutput == g_Sandbox.StdErr.hOutput) … … 6054 6249 && pvMem) 6055 6250 { 6056 PKWVIRTALLOC pTracker = g_Sandbox.pVirtualAllocHead; 6251 PKWVIRTALLOC pTracker; 6252 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6253 6254 pTracker = g_Sandbox.pVirtualAllocHead; 6057 6255 while ( pTracker 6058 6256 && (KUPTR)pvMem - (KUPTR)pTracker->pvAlloc >= pTracker->cbAlloc) … … 6083 6281 if (g_Sandbox.pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL) 6084 6282 { 6283 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6085 6284 if (dwFreeType & MEM_RELEASE) 6086 6285 { … … 6112 6311 6113 6312 6313 /** Kernel32 - HeapCreate / NtDll - RTlCreateHeap */ 6314 HANDLE WINAPI kwSandbox_Kernel32_HeapCreate(DWORD fOptions, SIZE_T cbInitial, SIZE_T cbMax) 6315 { 6316 HANDLE hHeap; 6317 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6318 6319 hHeap = HeapCreate(fOptions, cbInitial, cbMax); 6320 if (hHeap != NULL) 6321 { 6322 DWORD dwErr = GetLastError(); 6323 PKWHEAP pTracker = (PKWHEAP)kHlpAlloc(sizeof(*pTracker)); 6324 if (pTracker) 6325 { 6326 pTracker->hHeap = hHeap; 6327 pTracker->pNext = g_Sandbox.pHeapHead; 6328 g_Sandbox.pHeapHead = pTracker; 6329 } 6330 6331 SetLastError(dwErr); 6332 } 6333 return hHeap; 6334 6335 } 6336 6337 6338 /** Kernel32 - HeapDestroy / NtDll - RTlDestroyHeap */ 6339 BOOL WINAPI kwSandbox_Kernel32_HeapDestroy(HANDLE hHeap) 6340 { 6341 BOOL fRc = HeapDestroy(hHeap); 6342 KW_LOG(("HeapDestroy: hHeap=%p -> %d\n", hHeap, fRc)); 6343 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6344 if (fRc) 6345 { 6346 PKWHEAP pTracker = g_Sandbox.pHeapHead; 6347 if (pTracker) 6348 { 6349 if (pTracker->hHeap == hHeap) 6350 g_Sandbox.pHeapHead = pTracker->pNext; 6351 else 6352 { 6353 PKWHEAP pPrev; 6354 do 6355 { 6356 pPrev = pTracker; 6357 pTracker = pTracker->pNext; 6358 } while (pTracker && pTracker->hHeap == hHeap); 6359 if (pTracker) 6360 pPrev->pNext = pTracker->pNext; 6361 } 6362 if (pTracker) 6363 kHlpFree(pTracker); 6364 else 6365 KW_LOG(("HeapDestroy: pvAddr=%p not found!\n", hHeap)); 6366 } 6367 } 6368 6369 return fRc; 6370 } 6371 6372 6114 6373 6115 6374 /* … … 6136 6395 if (pTracker) 6137 6396 { 6397 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6138 6398 pTracker->idx = idxFls; 6139 6399 pTracker->pNext = g_Sandbox.pFlsAllocHead; … … 6152 6412 if (fRc) 6153 6413 { 6154 PKWLOCALSTORAGE pTracker = g_Sandbox.pFlsAllocHead; 6414 PKWLOCALSTORAGE pTracker; 6415 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6416 6417 pTracker = g_Sandbox.pFlsAllocHead; 6155 6418 if (pTracker) 6156 6419 { … … 6215 6478 if (pHash) 6216 6479 { 6480 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6217 6481 pHash->uMagic = KWHASHMD5_MAGIC; 6218 6482 pHash->cbHashed = 0; … … 6258 6522 BOOL fRc; 6259 6523 PKWHASHMD5 pHash = g_Sandbox.pHashHead; 6524 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6260 6525 while (pHash && (KUPTR)pHash != hHash) 6261 6526 pHash = pHash->pNext; … … 6373 6638 BOOL fRc; 6374 6639 PKWHASHMD5 pHash = g_Sandbox.pHashHead; 6640 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6375 6641 while (pHash && (KUPTR)pHash != hHash) 6376 6642 pHash = pHash->pNext; … … 6530 6796 PKWHASHMD5 pPrev = NULL; 6531 6797 PKWHASHMD5 pHash = g_Sandbox.pHashHead; 6798 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 6532 6799 while (pHash && (KUPTR)pHash != hHash) 6533 6800 { … … 6668 6935 { TUPLE("VirtualFree"), NULL, (KUPTR)kwSandbox_Kernel32_VirtualFree }, 6669 6936 6937 { TUPLE("HeapCreate"), NULL, (KUPTR)kwSandbox_Kernel32_HeapCreate, K_TRUE /*fOnlyExe*/ }, 6938 { TUPLE("HeapDestroy"), NULL, (KUPTR)kwSandbox_Kernel32_HeapDestroy, K_TRUE /*fOnlyExe*/ }, 6939 6670 6940 { TUPLE("FlsAlloc"), NULL, (KUPTR)kwSandbox_Kernel32_FlsAlloc }, 6671 6941 { TUPLE("FlsFree"), NULL, (KUPTR)kwSandbox_Kernel32_FlsFree }, … … 6689 6959 { TUPLE("_amsg_exit"), NULL, (KUPTR)kwSandbox_msvcrt__amsg_exit }, 6690 6960 { TUPLE("terminate"), NULL, (KUPTR)kwSandbox_msvcrt_terminate }, 6961 6962 { TUPLE("onexit"), NULL, (KUPTR)kwSandbox_msvcrt__onexit, K_TRUE /*fOnlyExe*/ }, 6963 { TUPLE("_onexit"), NULL, (KUPTR)kwSandbox_msvcrt__onexit, K_TRUE /*fOnlyExe*/ }, 6964 { TUPLE("atexit"), NULL, (KUPTR)kwSandbox_msvcrt_atexit, K_TRUE /*fOnlyExe*/ }, 6691 6965 6692 6966 { TUPLE("_beginthread"), NULL, (KUPTR)kwSandbox_msvcrt__beginthread }, … … 7200 7474 PROCESS_MEMORY_COUNTERS MemInfo; 7201 7475 PKWVIRTALLOC pTracker; 7476 PKWHEAP pHeap; 7202 7477 PKWLOCALSTORAGE pLocalStorage; 7203 7478 #ifdef WITH_HASH_MD5_CACHE … … 7206 7481 #ifdef WITH_TEMP_MEMORY_FILES 7207 7482 PKWFSTEMPFILE pTempFile; 7208 7483 #endif 7484 PKWEXITCALLACK pExitCallback; 7485 7486 /* Do exit callback first. */ 7487 pExitCallback = g_Sandbox.pExitCallbackHead; 7488 g_Sandbox.pExitCallbackHead = NULL; 7489 while (pExitCallback) 7490 { 7491 PKWEXITCALLACK pNext = pExitCallback->pNext; 7492 KW_LOG(("kwSandboxCleanupLate: calling %p %sexit handler\n", 7493 pExitCallback->pfnCallback, pExitCallback->fAtExit ? "at" : "_on")); 7494 __try 7495 { 7496 pExitCallback->pfnCallback(); 7497 } 7498 __except (EXCEPTION_EXECUTE_HANDLER) 7499 { 7500 KW_LOG(("kwSandboxCleanupLate: %sexit handler %p threw an exception!\n", 7501 pExitCallback->fAtExit ? "at" : "_on", pExitCallback->pfnCallback)); 7502 kHlpAssertFailed(); 7503 } 7504 kHlpFree(pExitCallback); 7505 pExitCallback = pNext; 7506 } 7507 7508 7509 #ifdef WITH_TEMP_MEMORY_FILES 7209 7510 /* The temporary files aren't externally visible, they're all in memory. */ 7210 7511 pTempFile = pSandbox->pTempFileHead; … … 7234 7535 kHlpFree(pTracker); 7235 7536 pTracker = pNext; 7537 } 7538 7539 /* Free left behind HeapCreate leaks. */ 7540 pHeap = g_Sandbox.pHeapHead; 7541 g_Sandbox.pHeapHead = NULL; 7542 while (pHeap != NULL) 7543 { 7544 PKWHEAP pNext = pHeap->pNext; 7545 KW_LOG(("Freeing HeapCreate leak %p\n", pHeap->hHeap)); 7546 HeapDestroy(pHeap->hHeap); 7547 pHeap = pNext; 7236 7548 } 7237 7549
Note:
See TracChangeset
for help on using the changeset viewer.