150 lines
2.4 KiB
C++
150 lines
2.4 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: N C M E M . C P P
|
||
|
//
|
||
|
// Contents: Common memory management routines.
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: shaunco 24 Mar 1997
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.h>
|
||
|
#pragma hdrstop
|
||
|
#include "ncdebug.h"
|
||
|
#include "ncmem.h"
|
||
|
|
||
|
// This global heap handle will be set to the process heap when the
|
||
|
// first request to allocate memory through MemAlloc is made.
|
||
|
//
|
||
|
HANDLE g_hHeap;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: HrMalloc
|
||
|
//
|
||
|
// Purpose: HRESULT returning version of malloc.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// cb [in] Count of bytes to allocate.
|
||
|
// ppv [out] Address of returned allocation.
|
||
|
//
|
||
|
// Returns: S_OK or E_OUTOFMEMORY;
|
||
|
//
|
||
|
// Author: shaunco 31 Mar 1998
|
||
|
//
|
||
|
// Notes: Free the returned buffer with free.
|
||
|
//
|
||
|
HRESULT
|
||
|
HrMalloc (
|
||
|
size_t cb,
|
||
|
PVOID* ppv)
|
||
|
{
|
||
|
Assert (ppv);
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
*ppv = MemAlloc (cb);
|
||
|
if (!*ppv)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
TraceHr (ttidError, FAL, hr, FALSE, "HrMalloc");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
VOID*
|
||
|
MemAlloc (
|
||
|
size_t cb)
|
||
|
{
|
||
|
#ifdef USE_HEAP_ALLOC
|
||
|
if (!g_hHeap)
|
||
|
{
|
||
|
g_hHeap = GetProcessHeap();
|
||
|
}
|
||
|
return HeapAlloc (g_hHeap, 0, cb);
|
||
|
#else
|
||
|
return malloc (cb);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
VOID*
|
||
|
MemAllocRaiseException (
|
||
|
size_t cb)
|
||
|
{
|
||
|
VOID* pv = MemAlloc (cb);
|
||
|
if (!pv)
|
||
|
{
|
||
|
RaiseException (E_OUTOFMEMORY, 0, 0, NULL);
|
||
|
}
|
||
|
return pv;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
MemFree (
|
||
|
VOID* pv)
|
||
|
{
|
||
|
#ifdef USE_HEAP_ALLOC
|
||
|
if (!g_hHeap)
|
||
|
{
|
||
|
g_hHeap = GetProcessHeap();
|
||
|
}
|
||
|
HeapFree (g_hHeap, 0, pv);
|
||
|
#else
|
||
|
free (pv);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
// CRT memory function overloads
|
||
|
//
|
||
|
|
||
|
const raiseexception_t raiseexception;
|
||
|
|
||
|
VOID*
|
||
|
__cdecl
|
||
|
operator new (
|
||
|
size_t cb,
|
||
|
const raiseexception_t&)
|
||
|
{
|
||
|
Assert(FALSE);
|
||
|
return MemAllocRaiseException (cb);
|
||
|
}
|
||
|
|
||
|
|
||
|
const extrabytes_t extrabytes;
|
||
|
|
||
|
VOID*
|
||
|
__cdecl
|
||
|
operator new (
|
||
|
size_t cb,
|
||
|
const extrabytes_t&,
|
||
|
size_t cbExtra)
|
||
|
{
|
||
|
return MemAlloc (cb + cbExtra);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID*
|
||
|
__cdecl
|
||
|
operator new (
|
||
|
size_t cb)
|
||
|
{
|
||
|
return MemAlloc (cb);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
__cdecl
|
||
|
operator delete (
|
||
|
VOID* pv)
|
||
|
{
|
||
|
if (pv)
|
||
|
{
|
||
|
MemFree (pv);
|
||
|
}
|
||
|
}
|