/* ** $RCSfile: UnFreeze.c,v $ ** $Filename: UnFreeze.c $ ** $Revision: 0.12 $ ** $Date: 1995/02/18 17:33:51 $ ** ** sysmon.library startup command UnFreeze (version 0.3) ** ** (C) Copyright 1995 by Etienne Vogt */ #include #include #include #define __USE_SYSBASE #include #include #include #include #include "sysmon_protos.h" #include "sysmon_pragmas.h" struct ExecBase *SysBase; struct DosLibrary *DOSBase; struct Library *SysmonBase; static struct WBStartup *wbmsg; static struct RDArgs *myrda; ULONG __saveds main(void); static void cleanexit(ULONG rc); static UBYTE version[] = "$VER: UnFreeze 0.3 (5.8.95)"; static UBYTE template[] = "TASK,ADDR=ADDRESS/K"; #define OPT_TASK 0 #define OPT_ADDRESS 1 #define OPTMAX 2 ULONG __saveds main(void) /* No startup code */ { struct Process *myproc; struct Task *task = NULL; LONG opts[OPTMAX]; SysBase = *(struct ExecBase **)4; DOSBase = NULL; SysmonBase = NULL; wbmsg = NULL; myrda = NULL; myproc = (struct Process *)FindTask(NULL); if ((DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",36)) == NULL) { Alert(AT_Recovery|AG_OpenLib|AO_DOSLib); return 100; } if (!(myproc->pr_CLI)) /* If started from WB, exit cleanly */ { WaitPort(&(myproc->pr_MsgPort)); wbmsg = (struct WBStartup *)GetMsg(&(myproc->pr_MsgPort)); cleanexit(20); } else { memset((char *)opts, 0, sizeof(opts)); if ((SysmonBase = OpenLibrary("sysmon.library",0)) == NULL) { Printf("UnFreeze : Couldn't open sysmon.library\n"); cleanexit(20); } if ((myrda = ReadArgs(template, opts, NULL)) == NULL) { PrintFault(IoErr(),NULL); cleanexit(20); } if (opts[OPT_TASK]) { if ((task = FindTask((STRPTR)opts[OPT_TASK])) == NULL) { Printf("UnFreeze : Unable to find task %s\n",opts[OPT_TASK]); cleanexit(20); } } else if (opts[OPT_ADDRESS]) { task = (struct Task *)strtoul((const char *)opts[OPT_ADDRESS], NULL, 16); if (task == NULL) task = FindTask(0); if (TypeOfMem(task) == NULL || (task->tc_Node.ln_Type != NT_TASK && task->tc_Node.ln_Type != NT_PROCESS)) { Printf("UnFreeze : Address %08lx is not a valid Task structure\n", task); cleanexit(20); } } else { Printf("UnFreeze : Required Argument missing\n"); cleanexit(20); } if (!smUnFreeze(task)) { Printf("UnFreeze : Task %08lx couldn't be unfrozen.\n", task); cleanexit(10); } } cleanexit(0); } static void cleanexit(ULONG rc) { if (myrda) FreeArgs(myrda); if (DOSBase) CloseLibrary((struct Library *)DOSBase); if (SysmonBase) CloseLibrary(SysmonBase); if (wbmsg) { Forbid(); ReplyMsg((struct Message *)wbmsg); } Exit(rc); }