13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/* $Id$ */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/** @file
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * VirtualBox Support Library - Hardened main(), windows bits.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Copyright (C) 2006-2014 Oracle Corporation
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * available from http://www.virtualbox.org. This file is free software;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * General Public License (GPL) as published by the Free Software
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * The contents of this file may alternatively be used under the terms
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * of the Common Development and Distribution License Version 1.0
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * CDDL are applicable instead of those of the GPL.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * You may elect to license modified versions of this file under the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * terms and conditions of either the GPL or the CDDL or both.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*******************************************************************************
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync* Header Files *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync*******************************************************************************/
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/nt/nt-and-windows.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <AccCtrl.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <AclApi.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#ifndef PROCESS_SET_LIMITED_INFORMATION
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync# define PROCESS_SET_LIMITED_INFORMATION 0x2000
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#endif
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <VBox/sup.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <VBox/err.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/assert.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/ctype.h>
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#include <iprt/heap.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/string.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/initterm.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/param.h>
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#include <iprt/path.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/mem.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include "SUPLibInternal.h"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include "win/SUPHardenedVerify-win.h"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * assert.cpp
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(char) g_szRTAssertMsg1[1024];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(char) g_szRTAssertMsg2[4096];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(const char * volatile) g_pszRTAssertExpr;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(const char * volatile) g_pszRTAssertFile;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(uint32_t volatile) g_u32RTAssertLine;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDATADECL(const char * volatile) g_pszRTAssertFunction;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(bool) RTAssertMayPanic(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return true;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void) RTAssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Fill in the globals.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_pszRTAssertExpr = pszExpr;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_pszRTAssertFile = pszFile;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_pszRTAssertFunction = pszFunction;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_u32RTAssertLine = uLine;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTStrPrintf(g_szRTAssertMsg1, sizeof(g_szRTAssertMsg1),
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "\n!!Assertion Failed!!\n"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "Expression: %s\n"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "Location : %s(%d) %s\n",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync pszExpr, pszFile, uLine, pszFunction);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void) RTAssertMsg2V(const char *pszFormat, va_list va)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTStrPrintfV(g_szRTAssertMsg2, sizeof(g_szRTAssertMsg2), pszFormat, va);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (g_enmSupR3HardenedMainState < SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync supR3HardenedFatalMsg(g_pszRTAssertExpr, kSupInitOp_Misc, VERR_INTERNAL_ERROR,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "%s%s", g_szRTAssertMsg1, g_szRTAssertMsg2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync else
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync supR3HardenedError(VERR_INTERNAL_ERROR, false/*fFatal*/, "%s%s", g_szRTAssertMsg1, g_szRTAssertMsg2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Memory allocator.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync/** The handle of the heap we're using. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic HANDLE g_hSupR3HardenedHeap = NULL;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync/** Number of heaps used during early process init. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic uint32_t g_cSupR3HardenedEarlyHeaps = 0;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync/** Early process init heaps. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic struct
9f997e760f610c92e3a365be21ead6972bc46130vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /** The heap handle. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTHEAPSIMPLE hHeap;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /** The heap block pointer. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync void *pvBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /** The size of the heap block. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync size_t cbBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /** Number of active allocations on this heap. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync size_t cAllocations;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync} g_aSupR3HardenedEarlyHeaps[8];
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic uint32_t supR3HardenedEarlyFind(void *pv)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync uint32_t iHeap = g_cSupR3HardenedEarlyHeaps;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync while (iHeap-- > 0)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if ((uintptr_t)pv - (uintptr_t)g_aSupR3HardenedEarlyHeaps[iHeap].pvBlock < g_aSupR3HardenedEarlyHeaps[iHeap].cbBlock)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return iHeap;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return UINT32_MAX;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync}
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic void supR3HardenedEarlyCompact(void)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync uint32_t iHeap = g_cSupR3HardenedEarlyHeaps;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync while (iHeap-- > 0)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations == 0)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync PVOID pvMem = g_aSupR3HardenedEarlyHeaps[iHeap].pvBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SIZE_T cbMem = g_aSupR3HardenedEarlyHeaps[iHeap].cbBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (iHeap + 1 < g_cSupR3HardenedEarlyHeaps)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap] = g_aSupR3HardenedEarlyHeaps[g_cSupR3HardenedEarlyHeaps - 1];
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_cSupR3HardenedEarlyHeaps--;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync NTSTATUS rcNt = NtFreeVirtualMemory(NtCurrentProcess(), &pvMem, &cbMem, MEM_RELEASE);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync Assert(NT_SUCCESS(rcNt));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("supR3HardenedEarlyCompact: Removed heap %#u (%#p LB %#zx)\n", iHeap, pvMem, cbMem));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync}
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncstatic void *supR3HardenedEarlyAlloc(size_t cb, bool fZero)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /*
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * Try allocate on existing heaps.
9f997e760f610c92e3a365be21ead6972bc46130vboxsync */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync void *pv;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync uint32_t iHeap = 0;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync while (iHeap < g_cSupR3HardenedEarlyHeaps)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (fZero)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTHeapSimpleAllocZ(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, cb, 0);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync else
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTHeapSimpleAlloc(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, cb, 0);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (pv)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations++;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#ifdef SUPR3HARDENED_EARLY_HEAP_TRACE
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("Early heap: %p LB %#zx - alloc\n", pv, cb));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return pv;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync iHeap++;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /*
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * Add another heap.
9f997e760f610c92e3a365be21ead6972bc46130vboxsync */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (iHeap == RT_ELEMENTS(g_aSupR3HardenedEarlyHeaps))
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedFatal("Early heap table is full (cb=%#zx).\n", cb);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SIZE_T cbBlock = iHeap == 0 ? _1M : g_aSupR3HardenedEarlyHeaps[iHeap - 1].cbBlock * 2;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync while (cbBlock <= cb * 2)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync cbBlock *= 2;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync PVOID pvBlock = NULL;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync NTSTATUS rcNt = NtAllocateVirtualMemory(NtCurrentProcess(), &pvBlock, 0 /*ZeroBits*/, &cbBlock, MEM_COMMIT, PAGE_READWRITE);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (!NT_SUCCESS(rcNt))
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedFatal("NtAllocateVirtualMemory(,,,%#zx,,) failed: rcNt=%#x\n", cbBlock, rcNt);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("New simple heap: #%u %p LB %#zx (for %zu allocation)\n", iHeap, pvBlock, cbBlock, cb));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTHEAPSIMPLE hHeap;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync int rc = RTHeapSimpleInit(&hHeap, pvBlock, cbBlock);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (RT_FAILURE(rc))
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedFatal("RTHeapSimpleInit(,%p,%#zx) failed: rc=%#x\n", pvBlock, cbBlock, rc);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (fZero)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTHeapSimpleAllocZ(hHeap, cb, 0);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync else
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTHeapSimpleAlloc(hHeap, cb, 0);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (!pv)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedFatal("RTHeapSimpleAlloc[Z] failed allocating %#zx bytes on a %#zu heap.\n", cb, cbBlock);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].pvBlock = pvBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].cbBlock = cbBlock;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations = 1;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].hHeap = hHeap;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync Assert(g_cSupR3HardenedEarlyHeaps == iHeap);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_cSupR3HardenedEarlyHeaps = iHeap + 1;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#ifdef SUPR3HARDENED_EARLY_HEAP_TRACE
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("Early heap: %p LB %#zx - alloc\n", pv, cb));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return pv;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync}
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync/**
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync * Lazy heap initialization function.
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync *
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync * @returns Heap handle.
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync */
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsyncstatic HANDLE supR3HardenedHeapInit(void)
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync Assert(g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_EP_CALLED);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync HANDLE hHeap = RtlCreateHeap(HEAP_GROWABLE | HEAP_CLASS_PRIVATE, NULL /*HeapBase*/,
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync 0 /*ReserveSize*/, 0 /*CommitSize*/, NULL /*Lock*/, NULL /*Parameters*/);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync if (hHeap)
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync {
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync g_hSupR3HardenedHeap = hHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync return hHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync }
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync supR3HardenedFatal("RtlCreateHeap failed.\n");
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync return NULL;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync}
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync/**
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync * Compacts the heaps before enter wait for parent/child.
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync */
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsyncDECLHIDDEN(void) supR3HardenedWinCompactHeaps(void)
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync{
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync if (g_hSupR3HardenedHeap)
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync RtlCompactHeap(g_hSupR3HardenedHeap, 0 /*dwFlags*/);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync RtlCompactHeap(GetProcessHeap(), 0 /*dwFlags*/);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedEarlyCompact();
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync}
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemTmpAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return RTMemAllocTag(cb, pszTag);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemTmpAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return RTMemAllocZTag(cb, pszTag);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void) RTMemTmpFree(void *pv) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTMemFree(pv);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync HANDLE hHeap = g_hSupR3HardenedHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync if (!hHeap)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
4db69c2a1302fa56bc5dd7181377b9f47cfd875evboxsync if ( g_fSupEarlyProcessInit
9f997e760f610c92e3a365be21ead6972bc46130vboxsync && g_enmSupR3HardenedMainState <= SUPR3HARDENEDMAINSTATE_WIN_EP_CALLED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return supR3HardenedEarlyAlloc(cb, false /*fZero*/);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync hHeap = supR3HardenedHeapInit();
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync void *pv = RtlAllocateHeap(hHeap, 0 /*fFlags*/, cb);
30f07af559efcbd967e801903746fc21f81ee533vboxsync if (!pv)
30f07af559efcbd967e801903746fc21f81ee533vboxsync supR3HardenedFatal("RtlAllocateHeap failed to allocate %zu bytes.\n", cb);
30f07af559efcbd967e801903746fc21f81ee533vboxsync return pv;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync HANDLE hHeap = g_hSupR3HardenedHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync if (!hHeap)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
4db69c2a1302fa56bc5dd7181377b9f47cfd875evboxsync if ( g_fSupEarlyProcessInit
9f997e760f610c92e3a365be21ead6972bc46130vboxsync && g_enmSupR3HardenedMainState <= SUPR3HARDENEDMAINSTATE_WIN_EP_CALLED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return supR3HardenedEarlyAlloc(cb, true /*fZero*/);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync hHeap = supR3HardenedHeapInit();
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync void *pv = RtlAllocateHeap(hHeap, HEAP_ZERO_MEMORY, cb);
30f07af559efcbd967e801903746fc21f81ee533vboxsync if (!pv)
30f07af559efcbd967e801903746fc21f81ee533vboxsync supR3HardenedFatal("RtlAllocateHeap failed to allocate %zu bytes.\n", cb);
30f07af559efcbd967e801903746fc21f81ee533vboxsync return pv;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemAllocVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cbAligned;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (cbUnaligned >= 16)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync else
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return RTMemAllocTag(cbAligned, pszTag);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemAllocZVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cbAligned;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (cbUnaligned >= 16)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync else
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return RTMemAllocZTag(cbAligned, pszTag);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void *) RTMemReallocTag(void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
30f07af559efcbd967e801903746fc21f81ee533vboxsync if (!pvOld)
30f07af559efcbd967e801903746fc21f81ee533vboxsync return RTMemAllocZTag(cbNew, pszTag);
30f07af559efcbd967e801903746fc21f81ee533vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync void *pv;
4db69c2a1302fa56bc5dd7181377b9f47cfd875evboxsync if (g_fSupEarlyProcessInit)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync uint32_t iHeap = supR3HardenedEarlyFind(pvOld);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (iHeap != UINT32_MAX)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#if 0 /* RTHeapSimpleRealloc is not implemented */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /* If this is before we can use a regular heap, we try resize
9f997e760f610c92e3a365be21ead6972bc46130vboxsync within the simple heap. (There are a lot of array growing in
9f997e760f610c92e3a365be21ead6972bc46130vboxsync the ASN.1 code.) */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (g_enmSupR3HardenedMainState < SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTHeapSimpleRealloc(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, pvOld, cbNew, 0);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (pv)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync# ifdef SUPR3HARDENED_EARLY_HEAP_TRACE
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("Early heap: %p LB %#zx, was %p - realloc\n", pvNew, cbNew, pvOld));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync# endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return pv;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /* Either we can't reallocate it on the same simple heap, or we're
9f997e760f610c92e3a365be21ead6972bc46130vboxsync past hardened main and wish to migrate everything over on the
9f997e760f610c92e3a365be21ead6972bc46130vboxsync real heap. */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync size_t cbOld = RTHeapSimpleSize(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, pvOld);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RTMemAllocTag(cbNew, pszTag);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (pv)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync memcpy(pv, pvOld, RT_MIN(cbOld, cbNew));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTHeapSimpleFree(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, pvOld);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations--;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if ( !g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations
9f997e760f610c92e3a365be21ead6972bc46130vboxsync && g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedEarlyCompact();
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync# ifdef SUPR3HARDENED_EARLY_HEAP_TRACE
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("Early heap: %p LB %#zx, was %p %LB %#zx - realloc\n", pv, cbNew, pvOld, cbOld));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync# endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return pv;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync Assert(g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /* Allocate from the regular heap. */
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync HANDLE hHeap = g_hSupR3HardenedHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync Assert(hHeap != NULL);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync pv = RtlReAllocateHeap(hHeap, 0 /*dwFlags*/, pvOld, cbNew);
30f07af559efcbd967e801903746fc21f81ee533vboxsync if (!pv)
30f07af559efcbd967e801903746fc21f81ee533vboxsync supR3HardenedFatal("RtlReAllocateHeap failed to allocate %zu bytes.\n", cbNew);
30f07af559efcbd967e801903746fc21f81ee533vboxsync return pv;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void) RTMemFree(void *pv) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
30f07af559efcbd967e801903746fc21f81ee533vboxsync if (pv)
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync {
4db69c2a1302fa56bc5dd7181377b9f47cfd875evboxsync if (g_fSupEarlyProcessInit)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync uint32_t iHeap = supR3HardenedEarlyFind(pv);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (iHeap != UINT32_MAX)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#ifdef SUPR3HARDENED_EARLY_HEAP_TRACE
9f997e760f610c92e3a365be21ead6972bc46130vboxsync SUP_DPRINTF(("Early heap: %p - free\n", pv));
9f997e760f610c92e3a365be21ead6972bc46130vboxsync#endif
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTHeapSimpleFree(g_aSupR3HardenedEarlyHeaps[iHeap].hHeap, pv);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations--;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if ( !g_aSupR3HardenedEarlyHeaps[iHeap].cAllocations
9f997e760f610c92e3a365be21ead6972bc46130vboxsync && g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync supR3HardenedEarlyCompact();
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync Assert(g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync HANDLE hHeap = g_hSupR3HardenedHeap;
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync Assert(hHeap != NULL);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync RtlFreeHeap(hHeap, 0 /* dwFlags*/, pv);
79a6b20f984859d9cc49305172355d6c3901f1c5vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Simplified version of RTMemWipeThoroughly that avoids dragging in the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * random number code.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncRTDECL(void) RTMemWipeThoroughly(void *pv, size_t cb, size_t cMinPasses) RT_NO_THROW
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cPasses = RT_MIN(cMinPasses, 6);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync static const uint32_t s_aPatterns[] = { 0x00, 0xaa, 0x55, 0xff, 0xf0, 0x0f, 0xcc, 0x3c, 0xc3 };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint32_t iPattern = 0;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync do
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(pv, s_aPatterns[iPattern], cb);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync ASMMemoryFence();
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(pv, s_aPatterns[iPattern], cb);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync ASMMemoryFence();
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(pv, s_aPatterns[iPattern], cb);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync ASMMemoryFence();
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync } while (cPasses-- > 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(pv, 0xff, cb);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync ASMMemoryFence();
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsync/*
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * path-win.cpp
9f997e760f610c92e3a365be21ead6972bc46130vboxsync */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync
9f997e760f610c92e3a365be21ead6972bc46130vboxsyncRTDECL(int) RTPathGetCurrent(char *pszPath, size_t cbPath)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync{
9f997e760f610c92e3a365be21ead6972bc46130vboxsync int rc;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (g_enmSupR3HardenedMainState < SUPR3HARDENEDMAINSTATE_WIN_IMPORTS_RESOLVED)
9f997e760f610c92e3a365be21ead6972bc46130vboxsync/** @todo Rainy day: improve this by checking the process parameter block
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * (needs to be normalized). */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync rc = RTStrCopy(pszPath, cbPath, "C:\\");
9f997e760f610c92e3a365be21ead6972bc46130vboxsync else
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync /*
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * GetCurrentDirectory may in some cases omit the drive letter, according
9f997e760f610c92e3a365be21ead6972bc46130vboxsync * to MSDN, thus the GetFullPathName call.
9f997e760f610c92e3a365be21ead6972bc46130vboxsync */
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTUTF16 wszCurPath[RTPATH_MAX];
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (GetCurrentDirectoryW(RTPATH_MAX, wszCurPath))
9f997e760f610c92e3a365be21ead6972bc46130vboxsync {
9f997e760f610c92e3a365be21ead6972bc46130vboxsync RTUTF16 wszFullPath[RTPATH_MAX];
9f997e760f610c92e3a365be21ead6972bc46130vboxsync if (GetFullPathNameW(wszCurPath, RTPATH_MAX, wszFullPath, NULL))
9f997e760f610c92e3a365be21ead6972bc46130vboxsync rc = RTUtf16ToUtf8Ex(&wszFullPath[0], RTSTR_MAX, &pszPath, cbPath, NULL);
9f997e760f610c92e3a365be21ead6972bc46130vboxsync else
9f997e760f610c92e3a365be21ead6972bc46130vboxsync rc = RTErrConvertFromWin32(RtlGetLastWin32Error());
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync else
9f997e760f610c92e3a365be21ead6972bc46130vboxsync rc = RTErrConvertFromWin32(RtlGetLastWin32Error());
9f997e760f610c92e3a365be21ead6972bc46130vboxsync }
9f997e760f610c92e3a365be21ead6972bc46130vboxsync return rc;
9f997e760f610c92e3a365be21ead6972bc46130vboxsync}
9f997e760f610c92e3a365be21ead6972bc46130vboxsync