home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 28
/
amigaformatcd28.iso
/
-in_the_mag-
/
reader_requests
/
stackattack
/
source
/
main.c
next >
Wrap
C/C++ Source or Header
|
1998-05-02
|
4KB
|
178 lines
#include <OSIncludes.h>
#pragma header
#include <stdio.h>
#include <stdlib.h>
extern "ASM" void New_CreateProc(void);
extern "ASM" void New_CreateNewProc(void);
extern "ASM" void New_SystemTagList(void);
extern "ASM" void New_RunCommand(void);
char *VersionString = "$VER: StackAttack 1.2 ("__DATE2__")";
char *AuthorString = "$AUTH: Georg Steger";
char *TEMPLATE = "MINSTACK=MIN/N/K,ADDSTACK=ADD/N/K";
enum {ARG_MINSTACK,ARG_ADDSTACK,NUM_ARGS};
#define LVO_CreateProc -138
#define LVO_CreateNewProc -498
#define LVO_SystemTagList -606
#define LVO_RunCommand -504
struct RDArgs *MyArgs;
LONG *Args[NUM_ARGS];
BOOL DontCloseUtility;
extern "C" // C-Style variables in patch.asm
{
struct UtilityBase *UtilityBase;
struct Library *CDOSBase;
APTR Old_CreateProc,
Old_CreateNewProc,
Old_SystemTagList,
Old_RunCommand;
ULONG MinStack,StackAdd;
};
extern "ASM"
{
void PATCHSTART(void);
void PATCHEND(void);
};
void Cleanup(LONG rc)
{
if (UtilityBase && (!DontCloseUtility)) CloseLibrary((struct Library *)UtilityBase);
exit(rc);
}
void Init(void)
{
/* DOSBase is already open and will be closed by the
compiler, so we use another name for the variable */
CDOSBase=OpenLibrary("dos.library",36);
}
void OpenLibs(void)
{
if (!(UtilityBase=(struct UtilityBase *)OpenLibrary(UTILITYNAME,36)))
{
Cleanup(RETURN_WARN);
}
}
void GetArguments(void)
{
BOOL ok=FALSE;
if ((MyArgs=ReadArgs(TEMPLATE,(LONG *)Args,0)))
{
if (Args[ARG_MINSTACK])
{
MinStack=(*Args[ARG_MINSTACK]+3)&0xFFFFFFFC;
ok=TRUE;
}
if (Args[ARG_ADDSTACK])
{
StackAdd=(*Args[ARG_ADDSTACK]+3)&0xFFFFFFFC;
ok=TRUE;
}
FreeArgs(MyArgs);
}
if (!ok) Cleanup(RETURN_WARN);
}
/* NEW_CreateNewProc and NEW_SystemTagList initially
were written in C but have been converted to Assembly
language, later. So the routines here are commented
out!!
Note: The ASM-Routines now call CloneTagItems
===== The C-Routines here don't do that and may vary also
in some other ways!!!!
LONG NEW_CreateNewProc(struct TagItem *tags)
{
struct TagItem newti[2] = {NP_StackSize,MinStack+StackAdd,TAG_MORE,(LONG)tags};
struct TagItem *ti;
if (tags && ((ti=FindTagItem(NP_StackSize,tags))))
{
if (ti->ti_Data<MinStack) ti->ti_Data=MinStack;
ti->ti_Data+=StackAdd;
return JumpOld_CreateNewProc(tags);
} else {
if (!tags) newti[1].ti_Tag=TAG_DONE;
return JumpOld_CreateNewProc(newti);
}
}
LONG NEW_SystemTagList(STRPTR command, struct TagItem *tags)
{
struct TagItem newti[2] = {NP_StackSize,MinStack+StackAdd,TAG_MORE,(LONG)tags};
struct TagItem *ti;
if (tags && ((ti=FindTagItem(NP_StackSize,tags))))
{
if (ti->ti_Data<MinStack) ti->ti_Data=MinStack;
ti->ti_Data+=StackAdd;
return JumpOld_SystemTagList(command,tags);
} else {
if (!tags) newti[1].ti_Tag=TAG_DONE;
return JumpOld_SystemTagList(command,newti);
}
}
*/
void DoPatches(void)
{
#define REALPOS(routine) (APTR) (((UBYTE *)routine) - ((UBYTE *)PATCHSTART) + mem)
UBYTE *mem;
ULONG len=((UBYTE *)PATCHEND) - ((UBYTE *)PATCHSTART) + 1;
if (!(mem=AllocMem(len,MEMF_PUBLIC))) Cleanup(RETURN_WARN);
/* Now we know that StackAttack will not fail to run,
therefore Cleanup must not close utility.library
(because of the patches needing it)!! */
DontCloseUtility=TRUE;
Forbid();
Old_CreateProc=SetFunction((struct Library *)DOSBase,LVO_CreateProc,REALPOS(New_CreateProc));
Old_CreateNewProc=SetFunction((struct Library *)DOSBase,LVO_CreateNewProc,REALPOS(New_CreateNewProc));
Old_SystemTagList=SetFunction((struct Library *)DOSBase,LVO_SystemTagList,REALPOS(New_SystemTagList));
Old_RunCommand=SetFunction((struct Library *)DOSBase,LVO_RunCommand,REALPOS(New_RunCommand));
// we copymem only here because the Old_??
// variables will be copied, too!!
CopyMem(PATCHSTART,mem,len);
CacheClearU(); // !!
Permit();
}
void main(void)
{
Init();
OpenLibs();
GetArguments();
DoPatches();
Cleanup(RETURN_OK);
}