/* Replacement for LOADWB ENDCLI >nil: use Lettuce-C V5.04 don't link with "c.o", it's not neccessary! don't use GO, there seems to be a serious bug in the lettuce package which causes a CXERR25 on LC2. Freeware, © 1989 by Oliver Wagner Landsberge 5 4322 Sprockhövel West Germany All Rights Reserved! Dieses Programm darf nicht von juristischen Personen genutzt werden, die auf der "Schwarzen Liste" der PD-Anbieter stehen. */ #include #include /* this structure is the msg send to the newly created "workbench.task" process to start up. LockList is not used in this context. Please, don't use in any other code - this is undocumented!!!! All this information has been gathered by analyzing the original CBM "LoadWB" (by the way: LoadWB is a C-programm which has got all the necessary startup stuff to be run from - Workbench :-) and the ARP "EndCLI" using the demonstration version of "ReSource", an interactive disassembler. */ struct wbgo { struct Message wbm; struct Locklist *locks; long debug; }; /* proto */ void main(void); void main() { /* open DOS */ struct Library *DOSBase=OldOpenLibrary("dos.library"); /* find the Workbench in ROM */ struct Resident *wbres=FindResident("workbench.task"); /* my process */ struct Process *pr=(struct Process*)FindTask(0); /* my CLI */ struct CommandLineInterface *mycli=(struct CommandLineInterface*)(BADDR(pr->pr_CLI)); /* CLI-Output (must be closed for EndCLI */ BPTR cfh=mycli->cli_CurrentInput; BPTR sfh=mycli->cli_StandardInput; struct FileHandle *mfh=(struct FileHandle*)BADDR(sfh); /* start workbench task */ struct Port *newproc=CreateProc("workbench.task",0,((long)wbres+0x2a)>>2,5000); /* my very own process msg-port */ struct Port *myport=&pr->pr_MsgPort; /* startup message */ struct wbgo wbmsg; /* initialize startup message */ wbmsg.wbm.mn_ReplyPort=myport; /* not used, for additional information only */ wbmsg.locks=0; wbmsg.debug=0; /* send Msg and wait for reply */ PutMsg(newproc,&wbmsg); WaitPort(myport); GetMsg(myport); /* EndCLI */ /* close Input() and Output(), Batch-file */ mfh->fh_Pos=mfh->fh_End; mfh->fh_End=0; if(sfh!=cfh) { mycli->cli_CurrentInput=sfh; Close(cfh); } /* cancel CLI */ mycli->cli_Background=-1; Exit(0); }