debug.c
上传用户:gzccxsp
上传日期:2015-07-14
资源大小:182k
文件大小:4k
源码类别:

MacOS编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1997-1998 Microsoft Corporation
  3. Module Name:
  4.     DEBUG.C
  5. Abstract:
  6.     This source file contains debug routines.
  7. Environment:
  8.     user mode
  9. Revision History:
  10.     07-08-97 : created
  11. --*/
  12. //*****************************************************************************
  13. // I N C L U D E S
  14. //*****************************************************************************
  15. #include <windows.h>
  16. #include <basetyps.h>
  17. #include <winioctl.h>
  18. #include "usbview.h"
  19. #if DBG
  20. //*****************************************************************************
  21. // T Y P E D E F S
  22. //*****************************************************************************
  23. typedef struct _ALLOCHEADER
  24. {
  25.     LIST_ENTRY  ListEntry;
  26.     PCHAR       File;
  27.     ULONG       Line;
  28. } ALLOCHEADER, *PALLOCHEADER;
  29. //*****************************************************************************
  30. // G L O B A L S
  31. //*****************************************************************************
  32. LIST_ENTRY AllocListHead =
  33. {
  34.     &AllocListHead,
  35.     &AllocListHead
  36. };
  37. //*****************************************************************************
  38. //
  39. // MyAlloc()
  40. //
  41. //*****************************************************************************
  42. HGLOBAL
  43. MyAlloc (
  44.     PCHAR   File,
  45.     ULONG   Line,
  46.     DWORD   dwBytes
  47. )
  48. {
  49.     PALLOCHEADER header;
  50.     if (dwBytes)
  51.     {
  52.         dwBytes += sizeof(ALLOCHEADER);
  53.         header = (PALLOCHEADER)GlobalAlloc(GPTR, dwBytes);
  54.         if (header != NULL)
  55.         {
  56.             InsertTailList(&AllocListHead, &header->ListEntry);
  57.             header->File = File;
  58.             header->Line = Line;
  59.             return (HGLOBAL)(header + 1);
  60.         }
  61.     }
  62.     return NULL;
  63. }
  64. //*****************************************************************************
  65. //
  66. // MyReAlloc()
  67. //
  68. //*****************************************************************************
  69. HGLOBAL
  70. MyReAlloc (
  71.     HGLOBAL hMem,
  72.     DWORD   dwBytes
  73. )
  74. {
  75.     PALLOCHEADER header;
  76.     PALLOCHEADER headerNew;
  77.     if (hMem)
  78.     {
  79.         header = (PALLOCHEADER)hMem;
  80.         header--;
  81.         // Remove the old address from the allocation list
  82.         //
  83.         RemoveEntryList(&header->ListEntry);
  84.         headerNew = GlobalReAlloc((HGLOBAL)header, dwBytes, GMEM_MOVEABLE|GMEM_ZEROINIT);
  85.         if (headerNew != NULL)
  86.         {
  87.             // Add the new address to the allocation list
  88.             //
  89.             InsertTailList(&AllocListHead, &headerNew->ListEntry);
  90.             return (HGLOBAL)(headerNew + 1);
  91.         }
  92.         else
  93.         {
  94.             // If GlobalReAlloc fails, the original memory is not freed,
  95.             // and the original handle and pointer are still valid.
  96.             // Add the old address back to the allocation list.
  97.             //
  98.             InsertTailList(&AllocListHead, &header->ListEntry);
  99.         }
  100.     }
  101.     return NULL;
  102. }
  103. //*****************************************************************************
  104. //
  105. // MyFree()
  106. //
  107. //*****************************************************************************
  108. HGLOBAL
  109. MyFree (
  110.     HGLOBAL hMem
  111. )
  112. {
  113.     PALLOCHEADER header;
  114.     if (hMem)
  115.     {
  116.         header = (PALLOCHEADER)hMem;
  117.         header--;
  118.         RemoveEntryList(&header->ListEntry);
  119.         return GlobalFree((HGLOBAL)header);
  120.     }
  121.     return GlobalFree(hMem);
  122. }
  123. //*****************************************************************************
  124. //
  125. // MyCheckForLeaks()
  126. //
  127. //*****************************************************************************
  128. VOID
  129. MyCheckForLeaks (
  130.     VOID
  131. )
  132. {
  133.     PALLOCHEADER header;
  134.     CHAR         buf[128];
  135.     while (!IsListEmpty(&AllocListHead))
  136.     {
  137.         header = (PALLOCHEADER)RemoveHeadList(&AllocListHead);
  138.         wsprintf(buf,
  139.                  "File: %s, Line: %d",
  140.                  header->File,
  141.                  header->Line);
  142.         MessageBox(NULL, buf, "USBView Memory Leak", MB_OK);
  143.     }
  144. }
  145. #endif