home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Cruncher / XPK416SR.LHA / xpk_Source / xpkmaster / hook_mem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-06  |  2.8 KB  |  113 lines

  1. #ifndef XPKMASTER_HOOK_MEM_C
  2. #define XPKMASTER_HOOK_MEM_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_mem.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_mem.c 1.2 (29.03.97)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    Memory IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   01.01.97 : added debug info
  15.  1.2   29.03.97 : added TOTSIZE in inhook
  16. */
  17.  
  18. #include <proto/exec.h>
  19. #include "xpkmaster.h"
  20.  
  21. #ifdef __MAXON__
  22.   #define __asm
  23. #endif
  24.  
  25. /*************************** read-from-mem hook **************************/
  26. static LONG __asm meminfunc(register __a1 struct XpkMasterMsg *msg)
  27. {
  28.   STRPTR bufpos;
  29.   LONG ofs;
  30.  
  31.   bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  32.  
  33.   switch (msg->xmm_Type)
  34.   {
  35.   case XIO_READ:
  36.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_Len)
  37.       return XPKERR_TRUNCATED;
  38.     msg->xmm_BufOfs += msg->xmm_Size;
  39.     if(!msg->xmm_Ptr)
  40.       msg->xmm_Ptr = bufpos;
  41.     else if(bufpos != msg->xmm_Ptr)
  42.       CopyMem(bufpos, msg->xmm_Ptr, msg->xmm_Size);
  43.     break;
  44.   case XIO_SEEK:
  45.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  46.     if((ofs < 0) || (ofs > msg->xmm_Len))
  47.       return XPKERR_IOERRIN;
  48.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  49.     msg->xmm_BufOfs = ofs;
  50.     break;
  51. //  case XIO_ABORT:
  52. //  case XIO_FREE:
  53.   case XIO_TOTSIZE: return XPKERR_BADPARAMS; break; /* always needed */
  54.   }
  55.  
  56.   return 0;
  57. }
  58.  
  59. struct Hook meminhook = { {0}, (ULONG (*) ()) meminfunc, 0, 0};
  60.  
  61. /*************************** write-to-mem hook **************************/
  62. static LONG __asm memoutfunc(register __a1 struct XpkMasterMsg *msg)
  63. {
  64.   STRPTR bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  65.   LONG ofs;
  66.  
  67.   switch (msg->xmm_Type)
  68.   {
  69.   case XIO_SEEK:
  70.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  71.     if((ofs < 0) || (ofs > msg->xmm_BufLen))
  72.       return XPKERR_IOERROUT;
  73.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  74.     msg->xmm_BufOfs = ofs;
  75.     break;
  76.   case XIO_TOTSIZE:
  77.     if(msg->xmm_Flags & XIO_GETOUTBUF)
  78.     {
  79.       if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
  80.     return XPKERR_NOMEM;
  81.       msg->xmm_BufLen = msg->xmm_Size;
  82.     }
  83.     else if(!msg->xmm_Buf)
  84.       return XPKERR_SMALLBUF;
  85.     break;
  86.   case XIO_GETBUF:
  87.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  88.       return XPKERR_SMALLBUF;
  89.     msg->xmm_Ptr = bufpos;
  90.     break;
  91.   case XIO_WRITE:
  92.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  93.       return XPKERR_SMALLBUF;
  94.     if(msg->xmm_Ptr && (msg->xmm_Ptr != bufpos))
  95.       CopyMem(msg->xmm_Ptr, bufpos, msg->xmm_Size);
  96.     msg->xmm_BufOfs += msg->xmm_Size;
  97.     break;
  98.   case XIO_ABORT:
  99.     if((msg->xmm_Flags & XIO_GETOUTBUF) && msg->xmm_Buf)
  100.     {
  101.       FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  102.       msg->xmm_Buf = 0;
  103.     }
  104.     break;
  105.   }
  106.  
  107.   return 0;
  108. }
  109.  
  110. struct Hook memouthook = {{0}, (ULONG (*) ()) memoutfunc,0 ,0};
  111.  
  112. #endif
  113.