Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

399 lines
9.5 KiB

//+---------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1993.
//
// File: $(COMTOOLS)\memory\ctmem.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 27-Oct-93 DarrylA Created.
// 1-May-94 DeanE Added Heap validation macros.
// 26-May-94 NaveenB ported to build for 16-bit
// 06-Oct-94 NaveenB added sifting of the test code
// capability
// 10-Oct-94 NaveenB added IMallocAllocCtm and
// IMallocFreeCtm
//
//----------------------------------------------------------------------
#include <comtpch.hxx>
#pragma hdrstop
#include <ctmem.hxx>
#ifdef WIN16
#include <types16.h>
#include <stdio.h>
#define NON_TASK_ALLOCATOR
#define _TEXT(quote) quote
#else
#include <tchar.h>
#endif
#ifdef SIFTING_TEST_CODE
#include <sift.hxx>
ISift *g_psftSiftObject = NULL;
#define SIMULATE_FAILURE( dwRes ) \
((NULL != g_psftSiftObject) && \
(g_psftSiftObject->SimFail( ( dwRes ) )))
#endif
DWORD dwCtValidateHeap = 1;
#if defined(WIN32) && !defined(_CHICAGO_) && !defined(_MAC)
DWORD dwCtExceptionCode = (DWORD) CT_EXCEPTION_HEAP;
#endif
//+---------------------------------------------------------------------
//
// Function: new, new(FAIL_BEHAVIOR), delete
//
// Synopsis: Overrides to support the default behavior of the
// commnot new and delete. Simply uses malloc and free.
//
// History: 06-Oct-93 DarrylA Created.
//
// Notes:
//
//----------------------------------------------------------------------
PVOID __cdecl operator new(unsigned int nSize, FAIL_BEHAVIOR enfb)
{
VDATEHEAP();
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
if(ExceptOnFail == enfb)
{
#if defined(WIN16) || defined(_MAC)
OutputDebugString(
"Can not call new (ExceptOnFail) in Win16 or Mac\n");
#else
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
else
{
return(NULL);
}
}
#endif
#ifdef NON_TASK_ALLOCATOR
PVOID pvTmp;
pvTmp = (PVOID) malloc(nSize);
if(ExceptOnFail == enfb)
{
#if defined(WIN16) || defined(_MAC)
OutputDebugString(
"Can not call new (ExceptOnFail) in Win16 or Mac\n");
#endif
if(NULL == pvTmp)
{
#if !defined(WIN16) && !defined(_MAC)
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
}
return pvTmp;
#else // TASK_ALLOCATOR
PVOID pvTmp = NULL;
pvTmp = CoTaskMemAlloc(nSize);
if (NULL == pvTmp)
{
if (ExceptOnFail==enfb)
{
#if !defined(WIN16) && !defined(_MAC)
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
}
return(pvTmp);
#endif
}
PVOID __cdecl operator new(unsigned int nSize)
{
VDATEHEAP();
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
return(NULL);
}
#endif
#ifdef NON_TASK_ALLOCATOR
return (PVOID) malloc(nSize);
#else // TASK_ALLOCATOR
PVOID pvTmp = CoTaskMemAlloc(nSize);
return(pvTmp);
#endif
}
VOID __cdecl operator delete(void *pbData)
{
VDATEHEAP();
#ifdef NON_TASK_ALLOCATOR
if(NULL != pbData)
{
free(pbData);
}
#else // TASK_ALLOCATOR
CoTaskMemFree(pbData);
#endif
}
//+---------------------------------------------------------------------
//
// Function: CtRealloc
//
// Synopsis: Adds support for realloc
//
// History: 31-Dec-97 VaraT Created.
//
// Notes:
//
//----------------------------------------------------------------------
PVOID __cdecl CtRealloc(PVOID memBlock,
size_t nSize, FAIL_BEHAVIOR enfb)
{
VDATEHEAP();
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
if(ExceptOnFail == enfb)
{
#if defined(WIN16) || defined(_MAC)
OutputDebugString(
"Can not call Realloc (ExceptOnFail) in Win16 or Mac\n");
#else
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
else
{
return(NULL);
}
}
#endif
#ifdef NON_TASK_ALLOCATOR
PVOID pvTmp;
pvTmp = (PVOID) realloc(memBlock, nSize);
if(ExceptOnFail == enfb)
{
#if defined(WIN16) || defined(_MAC)
OutputDebugString(
"Can not call new (ExceptOnFail) in Win16 or Mac\n");
#endif
if(NULL == pvTmp && nSize != 0)
{
#if !defined(WIN16) && !defined(_MAC)
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
}
return pvTmp;
#else // TASK_ALLOCATOR
PVOID pvTmp = NULL;
pvTmp = CoTaskMemRealloc(memBlock, nSize);
if (NULL == pvTmp && nSize != 0)
{
if (ExceptOnFail==enfb)
{
#if !defined(WIN16) && !defined(_MAC)
RaiseException((ULONG) E_OUTOFMEMORY, 0, 0, NULL);
#endif
}
}
return(pvTmp);
#endif
}
PVOID __cdecl CtRealloc(PVOID memBlock, size_t nSize)
{
VDATEHEAP();
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
return(NULL);
}
#endif
#ifdef NON_TASK_ALLOCATOR
return (PVOID) realloc(memBlock, nSize);
#else // TASK_ALLOCATOR
PVOID pvTmp = CoTaskMemRealloc(memBlock, nSize);
return(pvTmp);
#endif
}
//+--------------------------------------------------------------
// Function: IMallocAllocCtm
//
// Synopsis: Calls the Ole memory allocator and returns the pointer
// of the new allocated block. Sifting capability is present
//
// Arguments: dwMemctx specifies whether the memory block is
// private to a task or shared between
// processes
// ulCb size of the memory block
//
// Returns: pointer to the allocated block if succeeded else NULL.
//
// History: 10-Oct-94 NaveenB Created
//---------------------------------------------------------------
VOID FAR* IMallocAllocCtm(DWORD dwMemctx, ULONG ulCb)
{
void FAR* pMemory = NULL;
LPMALLOC lpIMalloc = NULL;
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
return(NULL);
}
#endif
if (SUCCEEDED(CoGetMalloc(dwMemctx, &lpIMalloc)))
{
if (lpIMalloc != NULL)
{
pMemory = lpIMalloc->Alloc(ulCb);
lpIMalloc->Release();
}
}
else
{
OutputDebugString(_TEXT("CoGetMalloc Failed \n"));
}
return pMemory;
}
//+--------------------------------------------------------------
// Function: IMallocFreeCtm
//
// Synopsis: Calls the Ole memory allocator and returns the pointer
// of the new allocated block
//
// Arguments: dwMemctx specifies whether the memory block is
// private to a task or shared between
// processes
// pv pointer to the memory block to free
//
// Returns: None
//
// History: 10-Oct-94 NaveenB Created
//---------------------------------------------------------------
VOID IMallocFreeCtm(DWORD dwMemctx, void FAR* pv)
{
LPMALLOC lpIMalloc = NULL;
if (pv != NULL)
{
if (SUCCEEDED(CoGetMalloc(dwMemctx, &lpIMalloc)))
{
if (lpIMalloc != NULL)
{
lpIMalloc->Free(pv);
lpIMalloc->Release();
}
}
else
{
OutputDebugString(_TEXT("CoGetMalloc Failed \n"));
}
}
}
//+--------------------------------------------------------------
// Function: IMallocReallocCtm
//
// Synopsis: Calls the Ole memory allocator and returns the pointer
// of the new allocated block
//
// Arguments: dwMemctx specifies whether the memory block is
// private to a task or shared between
// processes
// pv pointer to the memory block to free
// cb New count of allocated memory
//
// Returns: None
//
// History: 5-Nov-97 VaraT Created
//---------------------------------------------------------------
VOID FAR * IMallocReallocCtm(DWORD dwMemctx, void FAR* pv, DWORD ulCb)
{
LPMALLOC lpIMalloc = NULL;
void FAR* pMemory = NULL;
#ifdef SIFTING_TEST_CODE
// Check for memory failure if sifting
if (SIMULATE_FAILURE(SR_PUBLIC_MEMORY))
{
return(NULL);
}
#endif
if (SUCCEEDED(CoGetMalloc(dwMemctx, &lpIMalloc)))
{
if (lpIMalloc != NULL)
{
pMemory = lpIMalloc->Realloc(pv, ulCb);
lpIMalloc->Release();
}
}
else
{
OutputDebugString(_TEXT("CoGetMalloc Failed \n"));
}
return pMemory;
}