/*++ Copyright (c) 1994 Microsoft Corporation All rights reserved. Module Name: Mem.cxx Abstract: Memory manipulations Author: Albert Ting (AlbertT) 20-May-1994 Revision History: --*/ #include "spllibp.hxx" #pragma hdrstop HANDLE ghMemHeap; #if DBG HANDLE ghDbgMemHeap; VBackTrace* gpbtAlloc; VBackTrace* gpbtFree; PVOID DbgAllocMem( UINT cbSize ) { return HeapAlloc( ghDbgMemHeap, 0, cbSize ); } VOID DbgFreeMem( PVOID pMem ) { if( pMem ){ HeapFree( ghDbgMemHeap, 0, pMem ); } } #endif PVOID AllocMem( UINT cbSize ) /*++ Routine Description: Allocates memory. If CHECKMEM is defined, adds tail guard. Arguments: Return Value: --*/ { #if defined( CHECKMEM ) || DBG PDWORD pMem; UINT cbNew; SPLASSERT( cbSize < 0x1000000 ); cbNew = DWordAlign(cbSize+3*sizeof(DWORD)); pMem = (PDWORD)HeapAlloc( ghMemHeap, 0, cbNew ); if (!pMem) { DBGMSG( DBG_WARN, ( "AllocMem failed: size %x, %d\n", cbSize, ::GetLastError( ))); return NULL; } FillMemory(pMem, cbNew, 0x83); pMem[0] = cbSize; #if DBG pMem[1] = gpbtAlloc ? (DWORD)gpbtAlloc->pvCapture( (DWORD)&pMem[2], cbSize ) : 0; #endif *(PDWORD)((PBYTE)pMem + cbNew - sizeof(DWORD)) = 0xdeadbeef; return (PVOID)(pMem+2); #else return (PVOID)HeapAlloc( ghMemHeap, 0, cbSize ); #endif } VOID FreeMem( PVOID pMem ) { if( !pMem ){ return; } #if defined( CHECKMEM ) || DBG DWORD cbSize; PDWORD pNewMem; pNewMem = (PDWORD)pMem; pNewMem -= 2; cbSize = *pNewMem; if (*(PDWORD)((PBYTE)pMem + DWordAlign(cbSize)) != 0xdeadbeef) { DBGMSG( DBG_ERROR, ( "Corrupt Memory: %x size = 0x%x\n", pMem, cbSize )); } else { FillMemory(pNewMem, cbSize, 0x65); HeapFree( ghMemHeap, 0, (PVOID)pNewMem ); #if DBG if( gpbtFree ){ gpbtFree->pvCapture( (DWORD)pMem, cbSize ); } #endif } #else HeapFree( ghMemHeap, 0, (PVOID)pMem ); #endif }