home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 August - Disc 3 / chip_20018103_hu.iso / amiga / chiputil / wipeout.lha / source / mungmem.c < prev    next >
C/C++ Source or Header  |  1999-01-20  |  2KB  |  117 lines

  1. /*
  2.  * $Id: mungmem.c 1.6 1999/01/20 16:54:30 olsen Exp olsen $
  3.  *
  4.  * :ts=4
  5.  *
  6.  * Wipeout -- Traces and munges memory and detects memory trashing
  7.  *
  8.  * Written by Olaf `Olsen' Barthel <olsen@sourcery.han.de>
  9.  * Public Domain
  10.  */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "global.h"
  14. #endif    /* _GLOBAL_H */
  15.  
  16. /******************************************************************************/
  17.  
  18. VOID
  19. MungMem(ULONG * mem,ULONG numBytes,ULONG magic)
  20. {
  21.     /* the memory to munge must be on a long-word address */
  22.     ASSERT((((ULONG)mem) & 3) == 0);
  23.  
  24.     /* fill the memory with junk, but only as long as
  25.      * a long-word fits into the remaining space
  26.      */
  27.     while(numBytes > sizeof(*mem))
  28.     {
  29.         (*mem++) = magic;
  30.  
  31.         numBytes -= sizeof(*mem);
  32.     }
  33.  
  34.     /* fill in the left-over space */
  35.     if(numBytes > 0)
  36.     {
  37.         memcpy(mem,&magic,numBytes);
  38.     }
  39. }
  40.  
  41. /******************************************************************************/
  42.  
  43. STATIC VOID
  44. MungFreeMem(VOID)
  45. {
  46.     struct MemHeader *    mh;
  47.     struct MemChunk *    mc;
  48.  
  49.     /* walk down the list of unallocated system memory
  50.      * and trash it
  51.      */
  52.  
  53.     Forbid();
  54.  
  55.     for(mh = (struct MemHeader *)SysBase->MemList.lh_Head ;
  56.         mh->mh_Node.ln_Succ != NULL ;
  57.         mh = (struct MemHeader *)mh->mh_Node.ln_Succ)
  58.     {
  59.         for(mc = mh->mh_First ;
  60.             mc != NULL ;
  61.             mc = mc->mc_Next)
  62.         {
  63.             if(mc->mc_Bytes > sizeof(*mc))
  64.             {
  65.                 MungMem((ULONG *)(mc + 1),mc->mc_Bytes - sizeof(*mc),ABADCAFE);
  66.             }
  67.         }
  68.     }
  69.  
  70.     Permit();
  71. }
  72.  
  73. /******************************************************************************/
  74.  
  75. STATIC BOOL
  76. EnforcerIsRunning(VOID)
  77. {
  78.     BOOL found = FALSE;
  79.  
  80.     /* check whether The Enforcer or a program with similar
  81.      * functionality (such as CyberGuard) is currently
  82.      * running
  83.      */
  84.  
  85.     Forbid();
  86.  
  87.     if(FindPort("_The Enforcer_") != NULL ||
  88.        FindTask("½ Enforcer ╗") != NULL ||
  89.        FindPort("CyberGuard") != NULL)
  90.     {
  91.         found = TRUE;
  92.     }
  93.  
  94.     Permit();
  95.  
  96.     return(found);
  97. }
  98.  
  99. /******************************************************************************/
  100.  
  101. VOID
  102. BeginMemMung(VOID)
  103. {
  104.     Forbid();
  105.  
  106.     /* unless The Enforcer is running, trash address 0 */
  107.     if(NOT EnforcerIsRunning())
  108.     {
  109.         (*(ULONG *)0) = CODEDBAD;
  110.     }
  111.  
  112.     Permit();
  113.  
  114.     /* proceed to trash all unallocated system memory */
  115.     MungFreeMem();
  116. }
  117.