dbgalloc.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 5k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #define SYM_MAXNAMELEN 96
  2. #define SYM_STACKLEVEL 12
  3. struct THREADSTATE      // tag: pts
  4. {
  5.     THREADSTATE *   ptsNext;
  6.     THREADSTATE *   ptsPrev;
  7.     // Add globals below
  8.     void *  pvRequest;              // Last pointer seen by pre-hook function.
  9.     size_t  cbRequest;              // Last size seen by pre-hook function.
  10.     int     cTrackDisable;          // Disable memory tracking count/flag
  11.     BOOL    fSpyAlloc;              // Allocation is from IMallocSpy
  12.     DWORD   dwThreadId;
  13. };
  14. struct SPYBLK
  15. {
  16.     DWORD       dwSig;
  17.     SPYBLK *    psbNext;
  18.     void *      pvRequest;
  19.     size_t      cbRequest;
  20.     DWORD       cRealloc;
  21.     BOOL        bOKToLeak;
  22.     DWORD       dwThreadId;
  23.     DWORD       rdwStack[SYM_STACKLEVEL];
  24.     CHAR szStackSym[SYM_STACKLEVEL * SYM_MAXNAMELEN];
  25. };
  26. class CMallocSpy :  public IMallocSpy,
  27.                     public IShellMallocSpy
  28. {
  29. public:
  30.     ~CMallocSpy();
  31.     CMallocSpy();
  32.     // IUnknown methods
  33.     STDMETHOD(QueryInterface) (REFIID riid, void **ppv);
  34.     STDMETHOD_(ULONG, AddRef)();
  35.     STDMETHOD_(ULONG, Release)();
  36.     // IMallocSpy methods
  37.     STDMETHOD_(ULONG,  PreAlloc)(ULONG cbRequest);
  38.     STDMETHOD_(void *, PostAlloc)(void *pvActual);
  39.     STDMETHOD_(void *, PreFree)(void *pvRequest, BOOL fSpyed);
  40.     STDMETHOD_(void,   PostFree)(BOOL fSpyed);
  41.     STDMETHOD_(ULONG,  PreRealloc)(void *pvRequest, ULONG cbRequest, void **ppvActual, BOOL fSpyed);
  42.     STDMETHOD_(void *, PostRealloc)(void *pvActual, BOOL fSpyed);
  43.     STDMETHOD_(void *, PreGetSize)(void *pvRequest, BOOL fSpyed);
  44.     STDMETHOD_(ULONG,  PostGetSize)(ULONG cbActual, BOOL fSpyed);
  45.     STDMETHOD_(void *, PreDidAlloc)(void *pvRequest, BOOL fSpyed);
  46.     STDMETHOD_(BOOL,   PostDidAlloc)(void *pvRequest, BOOL fSpyed, BOOL fActual);
  47.     STDMETHOD_(void,   PreHeapMinimize)();
  48.     STDMETHOD_(void,   PostHeapMinimize)();
  49.     // IShellMallocSpy methods
  50.     STDMETHOD(RegisterSpy) (THIS);
  51.     STDMETHOD(RevokeSpy) (THIS);
  52.     STDMETHOD(SetTracking) (THIS_ BOOL bTrack);
  53.     STDMETHOD(AddToList) (THIS_ void *pv, UINT cb);
  54.     STDMETHOD(RemoveFromList) (THIS_ void *pv);
  55. private:
  56.     // Helper Functions
  57.     void SpyEnqueue(SPYBLK * psb);
  58.     SPYBLK *SpyDequeue(void * pvRequest);
  59.     SPYBLK *_SpyFindBlock(void * pvRequest);
  60.     
  61.     LPVOID SpyPostAlloc(void * pvActual);
  62.     LPVOID SpyPreFree(void * pvRequest);
  63.     size_t SpyPreRealloc(void *pvRequest, size_t cbRequest, void **ppv);
  64.     LPVOID SpyPostRealloc(void * pvActual);
  65.     BOOL SymInit();
  66.     int GetStackBacktrace(int ifrStart, int cfrTotal, DWORD *pdwEip, LPSTR szSym);
  67.     BOOL WriteToFile(HANDLE hFile, LPCSTR szFormat, ...);
  68.     BOOL DumpLeaks(LPCTSTR szFile);
  69.     // Member variables
  70.     ULONG               _ulRef;
  71.     LONG    _iAllocs;
  72.     LONG    _iPeakAllocs;
  73.     LONG    _iBytes;
  74.     LONG    _iPeakBytes;
  75.     CRITICAL_SECTION _csImgHlp;
  76.     HANDLE _hProcess;
  77.     DWORD _dwLeakSetting;
  78.     SPYBLK *_psbHead;
  79. public:
  80.     BOOL                _fRegistered;
  81. };
  82. // ImageHlp.DLL prototypes
  83.  
  84. typedef BOOL (__stdcall *pfnImgHlp_StackWalk)(
  85.     DWORD                             MachineType,
  86.     HANDLE                            hProcess,
  87.     HANDLE                            hThread,
  88.     LPSTACKFRAME                      StackFrame,
  89.     LPVOID                            ContextRecord,
  90.     PREAD_PROCESS_MEMORY_ROUTINE      ReadMemoryRoutine,
  91.     PFUNCTION_TABLE_ACCESS_ROUTINE    FunctionTableAccessRoutine,
  92.     PGET_MODULE_BASE_ROUTINE          GetModuleBaseRoutine,
  93.     PTRANSLATE_ADDRESS_ROUTINE        TranslateAddress
  94.     );
  95. typedef BOOL (__stdcall *pfnImgHlp_SymGetModuleInfo)(
  96.     IN  HANDLE              hProcess,
  97.     IN  DWORD               dwAddr,
  98.     OUT PIMAGEHLP_MODULE    ModuleInfo
  99.     );
  100. typedef BOOL (__stdcall *pfnImgHlp_SymLoadModule)(
  101.     IN  HANDLE          hProcess,
  102.     IN  HANDLE          hFile,
  103.     IN  PSTR            ImageName,
  104.     IN  PSTR            ModuleName,
  105.     IN  DWORD           BaseOfDll,
  106.     IN  DWORD           SizeOfDll
  107.     );
  108. typedef BOOL (__stdcall * pfnImgHlp_SymUnDName)(
  109.     IN  PIMAGEHLP_SYMBOL sym,               // Symbol to undecorate
  110.     OUT LPSTR            UnDecName,         // Buffer to store undecorated name in
  111.     IN  DWORD            UnDecNameLength    // Size of the buffer
  112.     );
  113. typedef BOOL (__stdcall * pfnImgHlp_SymGetLineFromAddr)(
  114.     IN  HANDLE                  hProcess,
  115.     IN  DWORD                   dwAddr,
  116.     OUT PDWORD                  pdwDisplacement,
  117.     OUT PIMAGEHLP_LINE          Line
  118.     );
  119. typedef BOOL (__stdcall * pfnImgHlp_SymGetSymFromAddr)(
  120.     IN  HANDLE              hProcess,
  121.     IN  DWORD               dwAddr,
  122.     OUT PDWORD              pdwDisplacement,
  123.     OUT PIMAGEHLP_SYMBOL    Symbol
  124.     );
  125. typedef HRESULT (__stdcall *pfnCoRegisterMallocSpy)(IMallocSpy * pms);
  126. typedef HRESULT (__stdcall *pfnCoRevokeMallocSpy)();