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

183 lines
5.8 KiB
C

/* Copyright 1996 Microsoft */
#ifndef _DBGMEMORY_
#define _DBGMEMORY_
#ifdef DEBUG
#define DBGMEM_MEMORY 0x00
#define DBGMEM_STRDUP 0x01
#define DBGMEM_OBJECT 0x02
#define DBGMEM_TRACED 0x04
#define DBGMEM_UNKNOBJ 0x08
#endif // DEBUG
#define DML_TYPE_MAIN 0
#define DML_TYPE_THREAD 1
#define DML_TYPE_FRAME 2
#define DML_TYPE_DOWNLOAD 3
#define DML_TYPE_NAVIGATE 4
#define DML_TYPE_MASK 0x0000000f
#define DML_BEGIN 0x00000000
#define DML_END 0x80000000
#ifdef DEBUG
EXTERN_C BOOL g_bUseNewLeakDetection;
STDAPI_(void) MemLeakInit(UINT wFlags, LPCTSTR pszFile, UINT iLine);
#define DebugMemLeak(wFlags) MemLeakInit(wFlags, TEXT(__FILE__), __LINE__)
// shdocvw memory leak tracker...
// void _DumpMemLeak( DWORD dwFlags ); // call DebugMemLeak instead!
// stuff used to move memory ownership from one thread to another
STDAPI_(void) remove_from_thread_memlist( DWORD dwThreadId, LPVOID pv );
STDAPI_(void) transfer_to_thread_memlist( DWORD dwThread, LPVOID pv );
STDAPI_(UINT) mem_thread_message( void );
STDAPI_(void) received_for_thread_memlist( DWORD dwFlags, void * pData );
#else
#define DebugMemLeak(wFlags) (0)
#endif
typedef struct _leakmeminfo {
HMODULE hmod; // which dll was it allocated from...
void* pv;
UINT cb;
UINT nType;
// DWORD adwCaller[4]; // for future
LPCSTR pszFile; // file where memory block was allocced
INT_PTR iLine; // line where memory block was allocced
} LEAKMEMINFO, *PLEAKMEMINFO;
typedef struct _IntelliLeakDumpCBFunctions
{
void (STDMETHODCALLTYPE *pfnDumpLeakedMemory)(PLEAKMEMINFO pmeminfo);
LPWSTR (STDMETHODCALLTYPE *pfnGetLeakSymbolicName)(PLEAKMEMINFO pmeminfo, LPWSTR pwszBuf, int cchBuf);
} INTELLILEAKDUMPCBFUNCTIONS;
typedef struct _LeakDetectFunctions
{
HLOCAL (STDMETHODCALLTYPE * pfnTrcLocalAlloc)(UINT uFlags,
UINT uBytes,
LPCSTR pszFile,
const int iLine );
HLOCAL (STDMETHODCALLTYPE * pfnTrcLocalFree )(HLOCAL hMem );
LPTSTR (STDMETHODCALLTYPE * pfnTrcStrDup )(LPTSTR lpSrch,
LPCSTR pszFile,
const int iLine);
void (STDMETHODCALLTYPE * pfnDumpMemLeak )(DWORD wFlags);
void (STDMETHODCALLTYPE * pfnDebugMemLeak)(UINT wFlags, LPCTSTR pszFile, UINT iLine);
void (STDMETHODCALLTYPE * pfnreceived_for_thread_memlist)( DWORD dwFlags, void * pData );
void (STDMETHODCALLTYPE * pfnremove_from_thread_memlist )( DWORD dwThreadId, LPVOID pv );
UINT (STDMETHODCALLTYPE * pfnmem_thread_message )();
void (STDMETHODCALLTYPE * pfnremove_from_memlist )(void *pv);
void (STDMETHODCALLTYPE * pfnadd_to_memlist )(HMODULE hmod, void *pv, unsigned int nSize, UINT nType, LPCSTR pszFile, const INT_PTR iLine );
void (STDMETHODCALLTYPE * pfnregister_hmod_intelli_dump)(HMODULE hmod, const INTELLILEAKDUMPCBFUNCTIONS*pildf);
} LEAKDETECTFUNCS;
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
STDAPI_(BOOL) GetLeakDetectionFunctionTable(LEAKDETECTFUNCS *pTable);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#ifdef DEBUG
// use the macros below
STDAPI_(HLOCAL) _TrcLocalAlloc(
UINT uFlags, // flags used in LocalAlloc
UINT uBytes, // number of bytes to be allocated
LPCSTR pszFile, // file which allocced memory
const int iLine // line which allocced memory
);
STDAPI_(LPTSTR) _TrcStrDup(
LPTSTR lpSrch, // pointer to string to StrDup
LPCSTR pszFile, // file which allocced memory
const int iLine // line which allocced memory
);
STDAPI_(HLOCAL) _TrcLocalFree(
HLOCAL hMem // memory to be freed
);
STDAPI_(void) add_to_memlist(
HMODULE hmod, // for secondary memory allocators...
void *pv, // pointer to memory block
unsigned int nSize, // size of memory block
unsigned int nType, // what the possible use of the memory is
LPCSTR pszFile, // file name
const INT_PTR iLine // line number
);
STDAPI_(void) remove_from_memlist(
void *pv // pointer to memory block
);
STDAPI_(void) register_intelli_dump(
HMODULE hmod,
const INTELLILEAKDUMPCBFUNCTIONS *pfns
);
#ifndef _NO_DBGMEMORY_REDEFINITION_
#ifdef __cplusplus
extern void* __cdecl operator new( size_t nSize, LPCSTR pszFile, const int iLine );
#define new new( __FILE__, __LINE__ )
#endif
#endif // _NO_DBGMEMORY_REDEFINITIONS
// use these macros
#define TrcLocalAlloc( _uFlags, _uBytes ) \
_TrcLocalAlloc( _uFlags, _uBytes, __FILE__, __LINE__ )
#define TrcStrDup( _pSrc ) \
_TrcStrDup( (LPTSTR)_pSrc, (LPCSTR)__FILE__, (const int)__LINE__ )
#define TrcLocalFree( _hMem ) \
_TrcLocalFree( _hMem )
#define DbgAddToMemList( _pv ) \
{ \
if ( _pv ) \
add_to_memlist( 0, _pv, (UINT)LocalSize( _pv ), DBGMEM_TRACED, __FILE__, __LINE__ ); \
}
#define DbgRemoveFromMemList( _pv ) \
remove_from_memlist( _pv )
#else // DEBUG
#define add_to_memlist(p) (0)
#define remove_from_memlist(p) (0)
#define remove_from_thread_memlist(p,v) (0)
#define TrcLocalAlloc( _uFlags, _uBytes ) \
LocalAlloc( _uFlags, _uBytes )
#define TrcStrDup( _pSrc ) \
StrDup( _pSrc )
#define TrcLocalFree( _hMem ) \
LocalFree( _hMem )
#define DbgAddToMemList( _pv ) // NOP
#define DbgRemoveFromMemList( _pv ) // NOP
#endif // DEBUG
#endif // _DBGMEMORY_