home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 10
/
Sonderheft_12.iso
/
best-of-tools
/
packer
/
xpk3.11
/
xpk_source
/
xpkmaster
/
hook_mem.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-11-26
|
3KB
|
117 lines
#ifndef XPKMASTER_HOOK_MEM_C
#define XPKMASTER_HOOK_MEM_C
/* Routinesheader
Name: hook_mem.c
Main: xpkmaster
Versionstring: $VER: hook_mem.c 1.0 (06.10.96)
Author: SDI
Distribution: PD
Description: Memory IO hooks
1.0 06.10.96 : first real version
*/
#include <exec/types.h>
#include <pragma/exec_lib.h>
#include "xpkmaster.h"
#ifdef __MAXON__
#define __asm
#endif
/*************************** read-from-mem hook **************************/
static LONG __asm meminfunc(register __a1 struct XpkMasterMsg *msg)
{
STRPTR bufpos;
LONG ofs;
bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
switch (msg->xmm_Type)
{
case XIO_READ:
if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_Len)
return XPKERR_TRUNCATED;
msg->xmm_BufOfs += msg->xmm_Size;
if(!msg->xmm_Ptr)
msg->xmm_Ptr = bufpos;
else if(bufpos != msg->xmm_Ptr)
CopyMem(bufpos, msg->xmm_Ptr, msg->xmm_Size);
break;
case XIO_SEEK:
msg->xmm_Ptr = (STRPTR) 42; /* something > 0. */
ofs = msg->xmm_BufOfs + msg->xmm_Size;
if((ofs < 0) || (ofs > msg->xmm_Len))
return XPKERR_IOERRIN;
msg->xmm_Size = msg->xmm_BufOfs; /* preSEEK position. */
msg->xmm_BufOfs = ofs;
break;
// case XIO_ABORT:
// case XIO_FREE:
}
return 0;
}
struct Hook meminhook = { {0}, (ULONG (*) ()) meminfunc, 0, 0};
/*************************** write-to-mem hook **************************/
static LONG __asm memoutfunc(register __a1 struct XpkMasterMsg *msg)
{
STRPTR bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
LONG ofs;
switch (msg->xmm_Type)
{
case XIO_SEEK:
msg->xmm_Ptr = (STRPTR) 42; /* something > 0. */
ofs = msg->xmm_BufOfs + msg->xmm_Size;
if((ofs < 0) || (ofs > msg->xmm_BufLen))
return XPKERR_IOERROUT;
msg->xmm_Size = msg->xmm_BufOfs; /* preSEEK position. */
msg->xmm_BufOfs = ofs;
break;
case XIO_TOTSIZE:
if(msg->xmm_Flags & XIO_GETOUTBUF)
{
if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
return XPKERR_NOMEM;
msg->xmm_BufLen = msg->xmm_Size;
}
else if(!msg->xmm_Buf)
return XPKERR_SMALLBUF;
break;
case XIO_GETBUF:
if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
return XPKERR_SMALLBUF;
msg->xmm_Ptr = bufpos;
break;
case XIO_WRITE:
if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
return XPKERR_SMALLBUF;
if(msg->xmm_Ptr && (msg->xmm_Ptr != bufpos))
CopyMem (msg->xmm_Ptr, bufpos, msg->xmm_Size);
msg->xmm_BufOfs += msg->xmm_Size;
break;
case XIO_ABORT:
if((msg->xmm_Flags & XIO_GETOUTBUF) && msg->xmm_Buf)
{
FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
msg->xmm_Buf = 0;
}
break;
}
/* FUTURE_CODE
if(msg->xmm_BufOfs > msg->xmm_Len)
msg->xmm_Len = msg->xmm_BufOfs;
*/
return 0;
}
struct Hook memouthook = {{0}, (ULONG (*) ()) memoutfunc,0 ,0};
#endif