windows-nt/Source/XPSP1/NT/shell/inc/heapaloc.h
2020-09-26 16:20:57 +08:00

135 lines
4.3 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1995.
//
// File: heapaloc.h
//
// Contents: Macros which wrap the standard memory API calls, redirecting
// them to HeapAlloc.
//
// Functions: __inline HLOCAL HeapLocalAlloc (fuFlags, cbBytes)
// __inline HLOCAL HeapLocalReAlloc (hMem, cbBytes, fuFlags)
// __inline HLOCAL HeapLocalFree (HLOCAL hMem)
//
// History: 2-01-95 davepl Created
// 12-15-97 t-saml changed to be used only for leak tracking
//
//--------------------------------------------------------------------------
#ifndef _HEAPALOC_H
#define _HEAPALOC_H 1
#ifndef DEBUG
#define IMSAddToList(bAdd, pv, cb)
#else
// Function to add/remove from leak detection list
// In stocklib (shell\lib\debug.c)
STDAPI_(void) IMSAddToList(BOOL bAdd, void*pv, SIZE_T cb);
#ifdef _SHELLP_H_
// Function to call in allocspy.dll (GetShellMallocSpy)
typedef BOOL (__stdcall *PFNGSMS) (IShellMallocSpy **ppout);
#endif
#ifndef ASSERT
#define ASSERT Assert
#endif
#ifdef LocalAlloc
#error "HEAPALOC.H(42): LocalAlloc shouldn't be defined"
#endif
//
// These are functions normally in comctl32, but there's no good reason to call
// that dll, so handle them here. Since Chicago may still want to use these
// shared memory routines, only "forward" them under NT.
//
#if defined(WINNT) && defined(_COMCTL32_)
#define Alloc(cb) HeapLocalAlloc(LMEM_ZEROINIT | LMEM_FIXED, cb)
#define ReAlloc(pb, cb) HeapLocalReAlloc(pb, cb, LMEM_ZEROINIT | LMEM_FIXED)
//
// Free() in comctl32 is just HeapFree(), so the return code reversing
// in HeapLocalFree is the opposite of what we want. Reverse it
// again here for now, and consider redefining Free() as just
// HeapFree(g_hProcessHeap) if the compiler isn't smart enough
// to generate the same code already.
// REVIEW: who checks the return value from a free? What do you do if it fails?
//
#define Free(pb) (!HeapLocalFree(pb))
#define GetSize(pb) HeapLocalSize(pb)
#endif
#if 0
// GlobalAllocs cannot be trivially replaced since they are used for DDE, OLE,
// and GDI operations. However, on a case-by-case version we can switch them
// over to HeapGlobalAlloc as we identify instances that don't _really_ require
// GlobalAllocs.
#define GlobalAlloc(fuFlags, cbBytes) HeapGlobalAlloc(fuFlags, cbBytes)
#define GlobalReAlloc(hMem, cbBytes, fuFlags) HeapGlobalReAlloc(hMem, cbBytes, fuFlags)
#define GlobalSize(hMem) HeapGlobalSize(hMem)
#define GlobalFree(hMem) HeapGlobalFree(hMem)
#define GlobalCompact InvalidMemoryCall
#define GlobalDiscard InvalidMemoryCall
#define GlobalFlags InvalidMemoryCall
#define GlobalHandle InvalidMemoryCall
#define GlobalLock InvalidMemoryCall
#define GlobalUnlock InvalidMemoryCall
#endif
__inline HLOCAL HeapLocalAlloc(IN UINT fuFlags, IN SIZE_T cbBytes)
{
void * pv;
pv = LocalAlloc(fuFlags, cbBytes);
IMSAddToList(TRUE, pv, cbBytes); // Add to leak tracking
return (HLOCAL) pv;
}
__inline HLOCAL HeapLocalFree(HLOCAL hMem)
{
IMSAddToList(FALSE, hMem, 0); // Free leak tracking
return LocalFree(hMem);
}
__inline HLOCAL HeapLocalReAlloc(IN HGLOBAL hMem,
IN SIZE_T cbBytes,
IN UINT fuFlags)
{
void * pv;
// (DavePl) Why can we realloc on a null ptr?
if (NULL == hMem)
{
return LocalAlloc(fuFlags, cbBytes);
}
pv = LocalReAlloc((void *) hMem, cbBytes, fuFlags);
IMSAddToList(FALSE, hMem, 0); // Take out the old
IMSAddToList(TRUE, pv, cbBytes); // And bring in the new
return (HGLOBAL) pv;
}
// Redefine the standard memory APIs to thunk over to our Heap-based funcs
#define LocalAlloc(fuFlags, cbBytes) HeapLocalAlloc(fuFlags, cbBytes)
#define LocalReAlloc(hMem, cbBytes, fuFlags) HeapLocalReAlloc(hMem, cbBytes, fuFlags)
#define LocalFree(hMem) HeapLocalFree(hMem)
#endif
#endif