VirtualBox

Changeset 52941 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 3, 2014 7:58:01 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
96381
Message:

Use our own heap in the hope that we can use it before ntdll is really initialized. Fixed RtlExitProcess issue. More early import work.

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h

    r52795 r52941  
    313313{
    314314    SUPR3HARDENEDMAINSTATE_NOT_YET_CALLED = 0,
     315    SUPR3HARDENEDMAINSTATE_WIN_EP_CALLED,
     316    SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED,
     317    SUPR3HARDENEDMAINSTATE_WIN_VERSION_INITIALIZED,
    315318    SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY,
    316319    SUPR3HARDENEDMAINSTATE_INIT_RUNTIME,
     
    452455extern char         g_szSupLibHardenedExePath[RTPATH_MAX];
    453456# endif
     457DECLHIDDEN(void)    supR3HardenedWinCompactHeaps(void);
    454458#endif
    455459
  • trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp

    r52940 r52941  
    227227{
    228228    for (;;)
     229    {
    229230#ifdef RT_OS_WINDOWS
    230         RtlExitProcess(rcExit);
     231        if (g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED)
     232            ExitProcess(rcExit);
     233        if (RtlExitUserProcess != NULL)
     234            RtlExitUserProcess(rcExit);
     235        NtTerminateProcess(NtCurrentProcess(), rcExit);
    231236#else
    232237        _Exit(rcExit);
    233238#endif
     239    }
    234240}
    235241
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp

    r52940 r52941  
    39163916     */
    39173917    supR3HardenedWinFlushLoaderCache();
    3918     RtlCompactHeap(GetProcessHeap(), 0 /*dwFlags*/);
     3918    supR3HardenedWinCompactHeaps();
    39193919
    39203920    /*
     
    50515051
    50525052    g_cSuplibHardenedWindowsMainCalls++;
     5053    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_WIN_EP_CALLED;
    50535054
    50545055    /*
     
    50575058     */
    50585059    supR3HardenedWinInitImports();
     5060    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED;
    50595061
    50605062    /*
     
    50705072     */
    50715073    supR3HardenedWinInitVersion();
     5074    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_WIN_VERSION_INITIALIZED;
    50725075
    50735076    /*
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm

    r52940 r52941  
    162162%define SUPHARNT_COMMENT(a_Comment)
    163163%define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86)       SupHardNtImport a_Name, a_cbParamsX86, SUPHNTIMP_SYSCALL, 1
    164 %define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)       SupHardNtImport a_Name, a_cbParamsX86, 0,                 0
    165 %define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0,                 1
     164%define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)       SupHardNtImport a_Name, a_cbParamsX86, 0, 0
     165%define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0, 1
     166%define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)
    166167%include "import-template-ntdll.h"
    167168%include "import-template-kernel32.h"
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainImports-win.cpp

    r52940 r52941  
    7272     * during early process initialization. */
    7373    PFNRT               pfnEarlyDummy;
     74    /** Indicates whether this is an optional import and failure to locate it
     75     * should set it to NULL instead of freaking out. */
     76    bool                fOptional;
    7477} SUPHNTIMPFUNC;
    7578/** Pointer to an import table entry.  */
     
    156159#define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) \
    157160    extern PFNRT    RT_CONCAT(g_pfn, a_Name);
     161#define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86)  SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)
    158162#define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86) \
    159163    SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) \
     
    175179#undef SUPHARNT_IMPORT_SYSCALL
    176180#undef SUPHARNT_IMPORT_STDCALL_EARLY
     181#undef SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL
    177182#undef SUPHARNT_IMPORT_STDCALL
    178 #define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86)          { #a_Name, &RT_CONCAT(g_pfn, a_Name), NULL },
    179 #define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)    { #a_Name, &RT_CONCAT(g_pfn, a_Name), NULL },
    180 #define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)          { #a_Name, &RT_CONCAT(g_pfn, a_Name), RT_CONCAT(a_Name,_Early) },
     183#define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86) \
     184    { #a_Name, &RT_CONCAT(g_pfn, a_Name), NULL, false },
     185#define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) \
     186    { #a_Name, &RT_CONCAT(g_pfn, a_Name), NULL, false },
     187#define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86) \
     188    { #a_Name, &RT_CONCAT(g_pfn, a_Name), NULL, true },
     189#define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86) \
     190    { #a_Name, &RT_CONCAT(g_pfn, a_Name), RT_CONCAT(a_Name,_Early), false },
    181191static const SUPHNTIMPFUNC g_aSupNtImpNtDllFunctions[] =
    182192{
     
    197207#undef SUPHARNT_IMPORT_STDCALL
    198208#undef SUPHARNT_IMPORT_STDCALL_EARLY
     209#undef SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL
    199210#ifdef RT_ARCH_AMD64
    200211# define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86) \
     
    208219    { &RT_CONCAT(g_uApiNo, a_Name), &RT_CONCAT(a_Name,_SyscallType1), &RT_CONCAT(a_Name, _SyscallType2), a_cbParamsX86 },
    209220#endif
    210 #define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)
     221#define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)          SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)
     222#define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)
    211223static const SUPHNTIMPSYSCALL g_aSupNtImpNtDllSyscalls[] =
    212224{
     
    399411    }
    400412
    401     SUPHNTIMP_ERROR(15, "supR3HardenedResolveImport", kSupInitOp_Misc, VERR_SYMBOL_NOT_FOUND,
    402                     "%ls: Failed to resolve '%s'.", pDll->pwszName, pImport->pszName);
     413    if (!pImport->fOptional)
     414        SUPHNTIMP_ERROR(15, "supR3HardenedResolveImport", kSupInitOp_Misc, VERR_SYMBOL_NOT_FOUND,
     415                        "%ls: Failed to resolve '%s'.", pDll->pwszName, pImport->pszName);
     416    *pImport->ppfnImport = NULL;
    403417    return NULL;
    404418}
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp

    r52940 r52941  
    9797 */
    9898
     99/** The heap we're using. */
     100static HANDLE g_hSupR3HardenedHeap = NULL;
     101
     102
     103/**
     104 * Lazy heap initialization function.
     105 *
     106 * @returns Heap handle.
     107 */
     108static HANDLE supR3HardenedHeapInit(void)
     109{
     110    HANDLE hHeap = RtlCreateHeap(HEAP_GROWABLE | HEAP_CLASS_PRIVATE, NULL /*HeapBase*/,
     111                                 0 /*ReserveSize*/, 0 /*CommitSize*/,  NULL /*Lock*/, NULL /*Parameters*/);
     112    if (hHeap)
     113    {
     114        g_hSupR3HardenedHeap = hHeap;
     115        return hHeap;
     116    }
     117
     118    supR3HardenedFatal("RtlCreateHeap failed.\n");
     119    return NULL;
     120}
     121
     122
     123/**
     124 * Compacts the heaps before enter wait for parent/child.
     125 */
     126DECLHIDDEN(void) supR3HardenedWinCompactHeaps(void)
     127{
     128    if (g_hSupR3HardenedHeap)
     129        RtlCompactHeap(g_hSupR3HardenedHeap, 0 /*dwFlags*/);
     130    RtlCompactHeap(GetProcessHeap(), 0 /*dwFlags*/);
     131}
     132
     133
     134
    99135RTDECL(void *) RTMemTmpAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
    100136{
     
    117153RTDECL(void *) RTMemAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
    118154{
    119     void *pv = RtlAllocateHeap(GetProcessHeap(), 0 /*fFlags*/, cb);
     155    HANDLE hHeap = g_hSupR3HardenedHeap;
     156    if (!hHeap)
     157        hHeap = supR3HardenedHeapInit();
     158    void *pv = RtlAllocateHeap(hHeap, 0 /*fFlags*/, cb);
    120159    if (!pv)
    121160        supR3HardenedFatal("RtlAllocateHeap failed to allocate %zu bytes.\n", cb);
     
    126165RTDECL(void *) RTMemAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
    127166{
    128     void *pv = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, cb);
     167    HANDLE hHeap = g_hSupR3HardenedHeap;
     168    if (!hHeap)
     169        hHeap = supR3HardenedHeapInit();
     170    void *pv = RtlAllocateHeap(hHeap, HEAP_ZERO_MEMORY, cb);
    129171    if (!pv)
    130172        supR3HardenedFatal("RtlAllocateHeap failed to allocate %zu bytes.\n", cb);
     
    160202        return RTMemAllocZTag(cbNew, pszTag);
    161203
    162     void *pv = RtlReAllocateHeap(GetProcessHeap(), 0 /*dwFlags*/, pvOld, cbNew);
     204    HANDLE hHeap = g_hSupR3HardenedHeap;
     205    Assert(hHeap != NULL);
     206    void *pv = RtlReAllocateHeap(hHeap, 0 /*dwFlags*/, pvOld, cbNew);
    163207    if (!pv)
    164208        supR3HardenedFatal("RtlReAllocateHeap failed to allocate %zu bytes.\n", cbNew);
     
    170214{
    171215    if (pv)
    172         RtlFreeHeap(GetProcessHeap(), 0 /* dwFlags*/, pv);
     216    {
     217        HANDLE hHeap = g_hSupR3HardenedHeap;
     218        Assert(hHeap != NULL);
     219        RtlFreeHeap(hHeap, 0 /* dwFlags*/, pv);
     220    }
    173221}
    174222
  • trunk/src/VBox/HostDrivers/Support/win/import-template-kernel32.h

    r52940 r52941  
    11SUPHARNT_IMPORT_STDCALL(CreateFileW, 28)
    22SUPHARNT_IMPORT_STDCALL(CreateProcessW, 40)
     3SUPHARNT_IMPORT_STDCALL(ExitProcess, 4)
    34SUPHARNT_IMPORT_STDCALL(GetFullPathNameA, 16)
    45SUPHARNT_IMPORT_STDCALL(GetModuleFileNameW, 12)
  • trunk/src/VBox/HostDrivers/Support/win/import-template-ntdll.h

    r52940 r52941  
    4949
    5050
    51 SUPHARNT_IMPORT_STDCALL(NtCreateSection, 28)
    52 SUPHARNT_IMPORT_STDCALL(NtQueryVolumeInformationFile, 20)
    53 SUPHARNT_IMPORT_STDCALL(LdrInitializeThunk, 12)
     51SUPHARNT_IMPORT_STDCALL_EARLY(NtCreateSection, 28)
     52SUPHARNT_IMPORT_STDCALL_EARLY(NtQueryVolumeInformationFile, 20)
     53SUPHARNT_IMPORT_STDCALL_EARLY(LdrInitializeThunk, 12)
    5454SUPHARNT_IMPORT_STDCALL(RtlAddAccessAllowedAce, 16)
    5555SUPHARNT_IMPORT_STDCALL(RtlAddAccessDeniedAce, 16)
    56 SUPHARNT_IMPORT_STDCALL(RtlAllocateHeap, 12)
     56SUPHARNT_IMPORT_STDCALL_EARLY(RtlAllocateHeap, 12)
    5757SUPHARNT_IMPORT_STDCALL(RtlCompactHeap, 8)
    5858SUPHARNT_IMPORT_STDCALL(RtlCopySid, 12)
    5959SUPHARNT_IMPORT_STDCALL(RtlCreateAcl, 12)
     60SUPHARNT_IMPORT_STDCALL_EARLY(RtlCreateHeap, 24)
    6061SUPHARNT_IMPORT_STDCALL(RtlCreateProcessParameters, 40)
    6162SUPHARNT_IMPORT_STDCALL(RtlCreateSecurityDescriptor, 8)
     
    6364SUPHARNT_IMPORT_STDCALL(RtlCreateUserThread, 40)
    6465SUPHARNT_IMPORT_STDCALL(RtlDestroyProcessParameters, 4)
    65 SUPHARNT_IMPORT_STDCALL(RtlDosApplyFileIsolationRedirection_Ustr, 36)
    66 SUPHARNT_IMPORT_STDCALL(RtlEqualSid, 8)
    67 SUPHARNT_IMPORT_STDCALL(RtlExitProcess, 4)
    68 SUPHARNT_IMPORT_STDCALL(RtlExitThread, 4)
     66SUPHARNT_IMPORT_STDCALL_EARLY(RtlDosApplyFileIsolationRedirection_Ustr, 36)
     67SUPHARNT_IMPORT_STDCALL_EARLY(RtlEqualSid, 8)
     68SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(RtlExitUserProcess, 4)
     69SUPHARNT_IMPORT_STDCALL_EARLY(RtlExitUserThread, 4)
    6970SUPHARNT_IMPORT_STDCALL(RtlExpandEnvironmentStrings_U, 16)
    70 SUPHARNT_IMPORT_STDCALL(RtlFreeHeap, 12)
    71 SUPHARNT_IMPORT_STDCALL(RtlFreeUnicodeString, 4)
    72 SUPHARNT_IMPORT_STDCALL(RtlGetLastNtStatus, 0)
    73 SUPHARNT_IMPORT_STDCALL(RtlGetLastWin32Error, 0)
    74 SUPHARNT_IMPORT_STDCALL(RtlGetVersion, 4)
     71SUPHARNT_IMPORT_STDCALL_EARLY(RtlFreeHeap, 12)
     72SUPHARNT_IMPORT_STDCALL_EARLY(RtlFreeUnicodeString, 4)
     73SUPHARNT_IMPORT_STDCALL_EARLY(RtlGetLastNtStatus, 0)
     74SUPHARNT_IMPORT_STDCALL_EARLY(RtlGetLastWin32Error, 0)
     75SUPHARNT_IMPORT_STDCALL_EARLY(RtlGetVersion, 4)
    7576SUPHARNT_IMPORT_STDCALL(RtlInitializeSid, 12)
    76 SUPHARNT_IMPORT_STDCALL(RtlNtStatusToDosError, 4)
    77 SUPHARNT_IMPORT_STDCALL(RtlReAllocateHeap, 16)
    78 SUPHARNT_IMPORT_STDCALL(RtlRestoreLastWin32Error, 4)
     77SUPHARNT_IMPORT_STDCALL_EARLY(RtlNtStatusToDosError, 4)
     78SUPHARNT_IMPORT_STDCALL_EARLY(RtlReAllocateHeap, 16)
     79SUPHARNT_IMPORT_STDCALL_EARLY(RtlRestoreLastWin32Error, 4)
    7980SUPHARNT_IMPORT_STDCALL(RtlSetDaclSecurityDescriptor, 16)
    80 SUPHARNT_IMPORT_STDCALL(RtlSetLastWin32Error, 4)
    81 SUPHARNT_IMPORT_STDCALL(RtlSetLastWin32ErrorAndNtStatusFromNtStatus, 4)
    82 SUPHARNT_IMPORT_STDCALL(RtlSizeHeap, 12)
     81SUPHARNT_IMPORT_STDCALL_EARLY(RtlSetLastWin32Error, 4)
     82SUPHARNT_IMPORT_STDCALL_EARLY(RtlSetLastWin32ErrorAndNtStatusFromNtStatus, 4)
     83SUPHARNT_IMPORT_STDCALL_EARLY(RtlSizeHeap, 12)
    8384SUPHARNT_IMPORT_STDCALL(RtlSubAuthoritySid, 8)
    8485
  • trunk/src/VBox/Runtime/r3/win/ntdll-mini-implib.def

    r52940 r52941  
    9191    RtlCopySid                            ;;= _RtlCopySid@12
    9292    RtlCreateAcl                          ;;= _RtlCreateAcl@12
     93    RtlCreateHeap                         ;;= _RtlCreateHeap@24
    9394    RtlCreateProcessParameters            ;;= _RtlCreateProcessParameters@40
    9495    RtlCreateSecurityDescriptor           ;;= _RtlCreateSecurityDescriptor@8
     
    9899    RtlDosApplyFileIsolationRedirection_Ustr ;;= _RtlDosApplyFileIsolationRedirection_Ustr@36
    99100    RtlEqualSid                           ;;= _RtlEqualSid@8
    100     RtlExitProcess                        ;;= _RtlExitProcess@4
    101     RtlExitThread                         ;;= _RtlExitThread@4
     101    RtlExitUserProcess                    ;;= _RtlExitProcess@4
     102    RtlExitUserThread                     ;;= _RtlExitThread@4
    102103    RtlExpandEnvironmentStrings_U         ;;= _RtlExpandEnvironmentStrings_U@16
    103104    RtlFreeHeap                           ;;= _RtlFreeHeap@12
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette