deballoc.c
Upload User: caisha3
Upload Date: 2013-09-21
Package Size: 208739k
Code Size: 3k
Category:

Windows Develop

Development Platform:

Visual C++

  1. //====================================================================
  2. // Debugging memory problems.
  3. //====================================================================
  4. #include "shellprv.h"
  5. #pragma hdrstop
  6. #undef LocalAlloc
  7. #undef LocalReAlloc
  8. #undef LocalFree
  9. #define CBALLOCEXTRA        (sizeof(LPARAM)+sizeof(UINT))
  10. #define HMEM2PTR(hMem,i)    (((BYTE*)hMem)+i)
  11. void _StoreSigniture(HLOCAL hMem, UINT uByte, LPARAM lParam)
  12. {
  13.     if (hMem)
  14.     {
  15.         SIZE_T uSize = LocalSize(hMem);
  16.         ASSERT(uSize>=uByte+CBALLOCEXTRA);
  17.         *(UNALIGNED UINT *)HMEM2PTR(hMem, uSize-sizeof(UINT)) = uByte;
  18.         *(UNALIGNED LPARAM *)HMEM2PTR(hMem, uByte) = lParam;
  19.         _DebugMsg( DM_ALLOC, TEXT("_StoreSig: %x ==> uByte = 0x%x, lParam = 0x%x"), hMem, uByte, lParam );
  20.     }
  21. }
  22. UINT _ValidateLocalMem(HLOCAL hMem, LPARAM lParam, LPCTSTR pszText)
  23. {
  24.     UINT uByte = 0;
  25.     if (hMem)
  26.     {
  27.         SIZE_T uSize = LocalSize(hMem);
  28.         if (uSize)
  29.         {
  30.             LPARAM lParamStored;
  31.             uByte = *(UNALIGNED UINT *)HMEM2PTR(hMem, uSize-sizeof(UINT));
  32.             AssertMsg(uByte+CBALLOCEXTRA <= uSize,
  33.                       TEXT("cm ASSERT! Bogus uByte %x (%x, %x) (%s for %x)"),
  34.                       uByte, uByte+CBALLOCEXTRA, uSize, pszText, hMem);
  35.             lParamStored = *(UNALIGNED LPARAM *)HMEM2PTR(hMem, uByte);
  36.             AssertMsg( lParamStored==lParam,
  37.                        TEXT("cm ASSERT! Bad Signiture %x!=%x (%s for %x)"),
  38.                        lParamStored, lParam, pszText, hMem
  39.                       );
  40.         }
  41.         else
  42.         {
  43.             AssertMsg( uSize!=0,
  44.                        TEXT("cm ASSERT! LocalSize is zero (%s for %x)"),
  45.                        pszText, hMem
  46.                       );
  47.         }
  48.     }
  49.     return uByte;
  50. }
  51. HLOCAL WINAPI DebugLocalAlloc(UINT uFlags, UINT uBytes)
  52. {
  53.     HLOCAL hMem;
  54.     _DebugMsg(DM_ALLOC,TEXT("DbgLocalAlloc( size=0x%x )..."),uBytes);
  55.     hMem = LocalAlloc(uFlags, (uBytes+CBALLOCEXTRA));
  56.     _StoreSigniture(hMem, uBytes, (LPARAM)hMem);
  57.     _DebugMsg(DM_ALLOC,TEXT("DbgLocalAlloc( size=0x%x ) returning %x, size=0x%x"),uBytes,hMem,(uBytes+CBALLOCEXTRA));
  58.     return hMem;
  59. }
  60. HLOCAL WINAPI DebugLocalReAlloc(HLOCAL hMem, UINT uBytes, UINT uFlags)
  61. {
  62.     HLOCAL hMemSave = hMem;
  63.     _DebugMsg(DM_ALLOC,TEXT("DbgLocalReAlloc( hMem=%x, size=0x%x )..."),hMem,uBytes);
  64.     _ValidateLocalMem(hMem, (LPARAM)hMem, TEXT("LocalReAlloc"));
  65.     hMem = LocalReAlloc(hMemSave, uBytes+CBALLOCEXTRA, uFlags);
  66.     _StoreSigniture(hMem, uBytes, (LPARAM)hMem);
  67.     _DebugMsg(DM_ALLOC,TEXT("DbgLocalReAlloc( hMem=%x, size=0x%x ) returning %x, size=0x%x"),hMemSave,uBytes,hMem,(uBytes+CBALLOCEXTRA));
  68.     return hMem;
  69. }
  70. HLOCAL WINAPI DebugLocalFree( HLOCAL hMem )
  71. {
  72.     UINT uBytes;
  73.     _DebugMsg(DM_ALLOC,TEXT("DbgLocalFree( hMem=%x )..."),hMem);
  74.     uBytes = _ValidateLocalMem(hMem, (LPARAM)hMem, TEXT("LocalFree"));
  75.     if (uBytes)
  76.     {
  77.         _StoreSigniture(hMem, uBytes, (LPARAM)0xDEADDEAD);
  78.         _fmemset(hMem, 0xE5, uBytes);
  79.     }
  80.     return LocalFree(hMem);
  81. }