mac-rom/ProcessMgr/Data.h

1008 lines
38 KiB
C

/*
File: Data.h
Contains: Structures and externs of Process Manager global data
Written by: Erich Ringewald
Copyright: © 1986-1992 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<45> 12/4/92 DRF Added nativeFPR storage area in PCB. Fixed up some #includes.
<44> 11/25/92 DRF Added additional PCB field for tracking the applicationÕs code
fragment manager context. Changes for <44> and <43> are
conditionalized under PsychicTV.
<43> 11/25/92 DRF Added some #includes for PowerPC Code Fragment Manager.
<42> 8/26/92 DTY Change ModSquadÕs funky conditional to use #ifdefs like everyone
else.
<41> 8/26/92 DTY Roll in latest changes for A/UX.
<40> 8/17/92 hjcr Adding support for OCE's "defer drag" feature. Conditionally
compiled under MODSQUAD
<39> 8/4/92 KST Added comments for the TSM change.
<38> 6/22/92 DTY #1033275 <csd>: Change the 16-1 to a 15 because of some compiler
idiosyncracies.
<37> 6/12/92 pvh #1032359: Added QUAD_ALIGN and QUADALIGN_MASK macros for 16 byte
alignment on '040 Macs.
<36> 3/30/92 DTY #1025416,<DDG>: Add skiaExists global.
<35> 3/25/92 DTY #1024114,<pvh>: Add c_PEntryFromProcessSerialNumber to the
OSDispatch table. Check out the comment in OSDispatch.c, version
12 about why this routine is being added.
<34> 2/18/92 DTY #1021226: Switch emMessageManagerGlobals again.
<33> 1/11/92 YK Two more calls and two more gloabls for TSM. NewTSMLayerOwner to
get the event for the floating window. RouteEventToSWM to do the
bottom line input.
<32> 11/22/91 DTY Add a semaphore, allocateGMBlkInSysHeap, which tells GMBlk to
automatically go to the System heap for memory instead of
mucking about with Process Manager memory first. This is a 7-Up
fix to prevent fragmentation of the Process Manager heap when an
'obit' event is sent.
<31> 10/16/91 YK Added InlineAware dispatch entry.
<30> 10/15/91 YK Added global data and dispatch entries for supporting the Text
Service Manager.
<29> 10/9/91 YK Added IMLayer(LayerPtr :global), NewFloatLayer and
DisposeFloatLayer (traps) all for supporting input windows for
text services. Particularly, FEP's (input methods).
<28> 10/4/91 JSM Change PsychoticFarmerOrLater to TheFuture.
<27> 9/22/91 DTY Change PsychoticFarmerAndLater to PsychoticFarmerOrLater.
<26> 9/16/91 DFH Removed INITSR (#define to 0x2000). Added initialProcessSR.
Needed for NuKernel.
<25> 9/13/91 DTY Conditionalise previous change so it doesnÕt get built for
CubeE. (ItÕll get built for PsychoticFarmerAndLater.)
<24> 6/4/91 DFH Added emMessageManagerGlobals to PCB.
<23> 3/22/91 DFH jmp,WS#DFH-910322a: Fixed FPUUserRegs defintion to use
"extended96" for type of FP registers. Was using plain
"extended", which is only 80 bits (SANE-style) rather than 96
bits (Motorola-style). This caused ReadWriteProcessFPURegs to
return less than the full complement of registers. This doesn't
effect any other code.
<22> 2/25/91 DFH DC,WS#DFH-910225a: Added p_scrapIsNotFromLaunch.
<21> 2/21/91 DFH dba,#82504, #82681, #83168, #83182, #83207: HiNewHandle rolled
into ProcessMgrHiNewHandle. Changed prototype. Added
SysZoneFloatSizes.
<20> 2/9/91 JWM DFH,#79583:Restart and Shutdown don't work in low memory
conditions. A new routine was defined -- GMBlk. It is modeled
after ProcessMgrHiNewHandle but checks the system heap if
ProcessMgrHiNewHandle returns a null handle.
<19> 1/28/91 DFH JSM,#81425: Removed inhibit_DAs global and PopUpMenuSelect
patch.
<18> 1/21/91 DFH (KSM) Process Menu is now called Application Menu.
<17> 1/15/91 DFH (VL) Conditionalize out the AUX fields in PEntry.
<16> 1/14/91 DFH (dba) Make system mode per process.
<15> 1/14/91 DFH (JDR) Conditionalize out AUX support.
<14> 1/10/91 DFH (JDR) Added p_preventFirstSysBeepPatch.
<13> 1/8/91 DFH (rdd) Got rid of pErrantProcess since it is no longer needed.
<12> 12/20/90 DFH (dba) Removed obsolete dispatch TWKill. Replaced it with
GetNextHighLevelEvent.
<11> 12/18/90 DFH Added GetScrap patch.
<10> 12/17/90 DFH Touched up Aliases.h include.
<9> 12/14/90 DFH Added kernelMode.
<8> 12/10/90 DFH Moved process icon info from PCB to PEntry.
<7> 12/5/90 DFH Added AUXIsPresent and AUX fields in PEntry. Moved VBLDesc and
DCEDesc here from SysMisc.h.
<6> 11/26/90 DFH Removed trespass() macro.
<5> 11/6/90 DFH Renamed emAppleEventsGlobal to emAppleEvents.
<4> 11/5/90 DFH Correct names for TEMPTOPMEM and TEMPDISPOSEHANDLE.
<3> 11/1/90 DFH Added prototype for DebuggerMsg().
<0> 9/2/86 ELR New Today.
*/
#ifndef __DATA__
#define __DATA__
/* Pointer to process entry */
typedef struct PEntry *PEntryPtr;
/* Non-unique process identifier */
typedef short ProcessID;
#define MAX_PROCESSID (0x7FFF)
#include <menus.h>
#ifndef __EVENTS__
#include <events.h>
#endif
#ifndef __MEMORY__
#include <memory.h>
#endif
#ifndef __ALIASES__
#include <Aliases.h>
#endif
#ifndef __SANE__
#include <Sane.h>
#endif
#ifndef __SYSMISC__
#include "SysMisc.h"
#endif
#ifndef __HLIST__
#include "HList.h"
#endif
#ifndef __OSDISPATCHPRIVATE__
#include "OSDispatchPrivate.h"
#endif
#ifndef __PROCESSES__
#include <Processes.h>
#endif
#ifndef __EPPCPRIVATE__
#include "EppcPrivate.h"
#endif
#ifndef __PUPPET__
#include "Puppet.h"
#endif
#ifndef __SCRAPCOERCION__
#include "ScrapCoercion.h"
#endif
#if PsychicTV
#include <CodeFragments.h>
#include <CodeFragmentsTrap.h>
#endif PsychicTV
/************************************************************************************
* Generally useful things, not dependant on Process Mgr *
************************************************************************************/
/* Shortened names for some types */
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned long u_long;
typedef unsigned long u_size;
/* Word-sized Boolean values */
#define wTrue (0x0100)
#define wFalse (0x0000)
/* Macro for easy access to QuickDraw data */
#ifdef __QUICKDRAW__
#define GET_BOUNDS(pBits) (((pBits)->rowBytes < 0) \
? &((**((BitMap ***) (pBits)))->bounds) \
: &((pBits)->bounds))
#endif
/* Macros to get tiny pascal strings */
#define ONE_CHAR_STRING(ch1) (((1)<<8) + ch1)
#define TWO_CHAR_STRING(ch1, ch2) (((2)<<24) + ((ch1)<<16) + ((ch2)<<8))
#define THREE_CHAR_STRING(ch1, ch2, ch3) (((3)<<24) + ((ch1)<<16) + ((ch2)<<8) + ch3)
/* Macro to look up a particular byte in a pascal string */
#define StringByte(pStr, byteIndex) (*((char *) pStr + byteIndex + 1))
/* Cute macros for type conversions */
#define TWO_CHARS_TO_SHORT(ch1,ch2) (((ch1)<<8)+(ch2))
#define SET_PT(pPt,x,y) (*((long *) (pPt)) = (y)*0x10000 + (x))
#define PT_TO_PT(pPtSrc,pPtDst) (*((long *) (pPtDst)) = *((long *) (pPtSrc)))
#define LONG_TO_PT(theLong,pPtDst) (*((long *) (pPtDst)) = (theLong))
#define PT_AS_LONG(pPtSrc) (*((long *) (pPtSrc)))
#define SET_RECT(pRect, x_ulh, y_ulh, x_lrh, y_lrh) \
SET_PT(&(pRect)->top, (x_ulh), (y_ulh)), SET_PT(&(pRect)->bottom, (x_lrh), (y_lrh))
/* Masks and a macro to ensure alignment of counts and addresses. Word alignment is
* required by the 68000 for non-byte pointer refereneces. Note that the result of
* WORD_ALIGN is the same as the original if the original was already word-aligned.
* Long alignment is for 68020 (and up) efficiency in general, and is a requirement
* of blocks in a 32-bit mode heap.
*
* QUAD_ALIGN added to be parallel with 68040 memory manager overpatch. // <37>
*/
#define QUADALIGN_MASK 0xFFFFFFF0 // <37>
#define LONGALIGN_MASK 0xFFFFFFFC
#define WORDALIGN_MASK 0xFFFFFFFE
#define QUAD_ALIGN(value) (value = ((value + 15) & QUADALIGN_MASK)) // <37>
#define LONG_ALIGN(value) (value = ((value + sizeof(long) - 1) & LONGALIGN_MASK))
#define WORD_ALIGN(value) (value = ((value + sizeof(short) - 1) & WORDALIGN_MASK))
#define LONG_ALIGNED(value) (((value) & (sizeof(long) - 1)) == 0)
#define WORD_ALIGNED(value) (((value) & (sizeof(short) - 1)) == 0)
/* Largest value for an unsigned field of any size */
#define MAXVALUE (0xFFFFFFFF)
/* Prototypes for utility routines */
void _DataInit(void);
Handle ProcessMgrHiNewHandle(u_size size, Ptr lockPtr);
Handle ProcessMgrNewHandle(u_size);
Handle GMBlk(u_size logicalSize, OSErr *error);
void MemClear(Ptr, unsigned long);
StringPtr StripLeadingNulls(StringPtr);
Handle NewMungedString(StringPtr, StringPtr);
typedef short (*RelStringGluePtr)(StringPtr pStr1, StringPtr pStr2);
StringPtr StrInStrList(Ptr, Ptr, short, RelStringGluePtr);
Handle GetRsrcHdlMatchingFirstLongword(long, long);
short GetIconIDFromBundle(OSType, unsigned long);
Boolean OptionKeyIsDown(void);
unsigned short disable(void);
void spl(unsigned short);
/************************************************************************************
* Process Mgr structure prototypes and access macros *
************************************************************************************/
/*
* Secondary process information structures.
*/
/* Printer type strings */
#define PRTYPE_STRING_SIZE 32
typedef Str31 PrTypeString, *PrTypeStringPtr, **PrTypeStringHandle;
/* Info specifying one directory */
typedef struct AppWDRec
{
short awdVolume;
unsigned long awdDirID;
} AppWDRec, *AppWDRecPtr;
/* List of directory specifiers. */
typedef struct AppWDList
{
short wdlCount;
AppWDRec wdlDirectories[0];
} AppWDList, *AppWDListPtr, **AppWDListHdl;
/* VBL descriptor */
typedef struct VBLDesc {
VBLTask *v_eladdr;
char *v_addr;
short v_count;
} VBLDesc, *VBLDescPtr, **VBLDescHdl;
/* Driver/DA descriptor */
typedef struct DCEDesc {
short d_unit;
Handle d_handle;
} DCEDesc, *DCEDescPtr, **DCEDescHdl;
/* Auxiliary process information in relocatable block */
/* ScriptMgrKeyGetSet.a is depending on the offset of currenta5 in this record. */
/* If you change this record, be sure to update ScriptMgrKeyGetSet.a <#39> */
typedef struct PCB
{
/* OS lomem */
short sysevtmask;
short bootvol;
Ptr switchdata;
char *defvcbptr;
WDCB defaultwdcb;
short defvrefnum;
Ptr pmsphook;
void (*fsqueuehook)();
short dserrcode;
/* Toolbox lomem */
char *stklowpt;
char *appllimit;
THz applzone;
unsigned long currenta5;
Str31 curapname;
LayerPtr curlayer;
Handle topmaphandle;
short curmap;
Handle menucinfo;
short sfsavedisk;
long curdirstore;
/* switched ExpandMem */
Ptr emScriptAppGlobals; /* Script Mgr stuff to be zeroed, switched */
long emAppleEvents; /* AppleEvent Mgr stuff to be zeroed, switched */
Handle emEditionMgrPerApp; /* Edition Mgr stuff to be zeroed, switched */
long emMessageManagerGlobals; /* Message Mgr stuff to be zeroed, switched */
/* process specific fields */
VBLDescHdl vblvars; /* VBLs switched out last time */
DCEDescHdl dces; /* drivers switched out last time */
Handle applPatchTable; /* registry of patches by application */
short applPatchCount; /* count of traps patched */
Ptr appSystemEventPatch; /* Special overlay patch, if needed */
Ptr appRecoverHandlePatch; /* Special overlay patch, if needed */
Handle puppetstringhdl; /* process' custom puppet string information */
PrTypeString localPrTypeString; /* name of printer type */
char enablePrTypeChanges; /* Can this proc change printer types if chooser does? */
short p_fileRefNum; /* resource file refnum */
short p_vrefnum; /* WD for parent directory of app file */
short p_appVolume; /* Volume for p_vrefnum */
long p_appDirID; /* Directory for p_vrefnum */
AppWDListHdl p_appWDList; /* WDs to open after launch */
unsigned long launchDate; /* TICKS at time of launch */
HListHdl p_PseudoEvtQHList; /* pseudo event queue */
ProcPtr p_gzproc; /* pointer to his appl zone grow zone proc */
HListHdl tempMemHListHdl; /* list of all the temporary handles for this process */
short p_daResource; /* DA resource number if this is DA handler */
#if PsychicTV
FragContextID fragContext; /* <44> CodeFragMgr context for this process */
unsigned long nativeFPRStorage[18*2]; /* <45> Storage for 18 64 bit floating point registers */
#endif
} PCB;
/* Define the descriptors for the Apple menu items that applications can add.
* IMPORTANT: aiNext must be in 0th long of the record so that the insertion
* code in AddAppleMenuItem works. aiNameStorage is at the end so we can put
* the (variable length) name there.
*/
typedef struct AppleItem
{
struct AppleItem **aiNext; /* list link (DO NOT MOVE) */
Handle aiIcon; /* item icon handle */
PEntryPtr aiProcess; /* process that installed this entry */
long aiRefCon; /* identifier to send to aiProcess */
short aiScript; /* script code (international) */
Style aiStyle; /* text styles */
char aiMark; /* item mark character */
StringHandle aiHelpString; /* descriptive string */
unsigned char aiNameStorage[]; /* item text */
} AppleItem, *AppleItemPtr, **AppleItemHdl;
/* Machine register context */
typedef struct SaveRegs /* general registers */
{
unsigned long d2,d3,d4,d5,d6,d7;
unsigned long a2,a3,a4,a5,a6;
unsigned short sr;
unsigned long pc;
} SaveRegs;
typedef struct FPUUserRegs /* floating pointer registers */
{
unsigned long fpcr, fpsr, fpiar;
extended96 fp0, fp1, fp2, fp3, fp4, fp5, fp6, fp7;
} FPUUserRegs;
typedef struct FPUFrame /* frame for FSAVE/FRESTORE instructions */
{
char isFullFPUFrame;
FPUUserRegs fpuUserRegs;
} FPUFrame;
/* This is the format of the register context save area pushed on the stack
* by the process switching routines (SwitchAllRegs and SwitchCPURegs).
*/
typedef struct AllRegs /* altogether now */
{
SaveRegs saveRegs;
unsigned long tmp1, tmp2;
FPUFrame fpuFrame;
} AllRegs;
/* Initial value in process context */
#define INITRET userret /* process' return address from main routine */
/* Primary process information structure */
/* ScriptMgrKeyGetSet.a is depending on the offset of p_pcb in this record. */
/* If you change this record, be sure to update ScriptMgrKeyGetSet.a <#39> */
typedef struct PEntry
{
short p_state; /* process state */
ProcessID p_mypid; /* the process id */
long p_type; /* type of task (usually APPL) */
/* NOTE: _Open patch assumes offset of p_signature field is 8 */
long p_signature; /* signature of application */
unsigned short p_nameScript; /* script code from app file name */
Boolean p_scrapIsNotFromLaunch; /* whether we've tried to MoveScrap() */
#ifdef DEBUG
unsigned long p_tattoo; /* telltale field */
#endif DEBUG
unsigned long p_version; /* version of application, for MicroSoft */
PEntryPtr p_NextProcess; /* link to next process on system */
PEntryPtr p_NextProcessInState; /* next process in same state list */
PEntryPtr p_PrevProcessInState; /* previous process in same state list */
PEntryPtr p_nextQueuedFrontProcess; /* next process in pFrontProcessQueue */
ProcessSerialNumber p_serialNumber; /* serial number (unique since startup) */
THz p_zone; /* pointer to application heap */
THz *p_zoneh; /* Handle to minor zone */
PEntryPtr nextAppleMenuProc; /* next process in all the apple menus */
PEntryPtr nextApplicationMenuProc; /* next process in Application Menu */
unsigned long p_taskmode; /* tasks created mode */
Boolean p_isfirstbackevt; /* is this the first background event? */
Boolean p_preventFirstSysBeepPatch; /* for HyperCard 1.2.5 */
unsigned short p_waitnexteventlevel; /* (how many levels deep) is the proc inside a _WaitNextEvent call */
PEntryPtr p_dadProcess; /* PEntryPtr to my dad */
unsigned long p_size; /* size of his world */
unsigned long p_ssize; /* size of his stack */
char *p_wptr; /* a phony window ptr */
PCB **p_pcb; /* Handle to process control block */
unsigned long p_sp; /* Saved stack pointer */
short p_eventmask; /* The process' event mask */
char p_haseditcmdkeys; /* whether or not the process can do cuts and copies */
unsigned char p_updatechances; /* remaining chances to complete BG updates */
short p_cutcopycount; /* how many cut or copies is he consistent with? */
HListHdl p_applemenuhlisthdl; /* handle to list of this guy's apple menus or nil if none */
Handle p_hideCurrentStr; /* handle to application menu front app hide item text */
Handle iconCacheHdl; /* application icon family cache */
short iconResourceID; /* application icon resource ID */
LayerPtr p_layer; /* pointer to my layer */
unsigned long p_slices; /* # of times process has CPU */
unsigned long p_wakeuptime; /* TICKS at which to wake this process */
unsigned long p_activeTime; /* Sum of ticks in possession of CPU */
short p_condemned; /* whether someone is killing this process */
unsigned short p_systemModeLevel; /* non-zero if system is its own client */
PuppetVars p_puppetvars; /* puppet-string related variables */
Handle p_lmemtool; /* handle to toolbox mem to be switched */
EPPCBlk eppcBlk; /* High Level Event control block */
#ifdef HAS_AUX_PROCESSMGR
short aux_waitproc; /* AUX process we're waiting to attach */
short aux_realpid; /* AUX native pid, not related to the MF pid */
short wakeup_flag; /* Process needs to leave GNE/EA early */
#endif HAS_AUX_PROCESSMGR
Handle p_fakeDAHandle; /* BS handle for FullPaint and MacDraw II */
LayerPtr p_floatLayer; /* For text services floating windows */
Boolean p_inlineAware; /* Flag for the Text Services Manager */
PEntryPtr *p_HandleForThisPEntry; /* == RecoverHandle(*(this_PEntry)) */
} PEntry;
/* External declarations for PEntry locators */
#define HighestkProcess (2)
#define LowestNonSystemPSN (8*1024)
#define EqualPSNConst(X, A) (((A)->lowLongOfPSN == (X)) && ((A)->highLongOfPSN == 0))
#define SetPSN(X, dst) {(dst)->highLongOfPSN = 0; (dst)->lowLongOfPSN = (X);}
#define IsGreaterPSN(src, dst) \
(((src)->highLongOfPSN != (dst)->highLongOfPSN) ? \
((src)->highLongOfPSN > (dst)->highLongOfPSN) \
: ((src)->lowLongOfPSN > (dst)->lowLongOfPSN))
extern Boolean EqualPSN(ProcessSerialNumberPtr, ProcessSerialNumberPtr);
extern PEntryPtr PEntryFromPSN(ProcessSerialNumberPtr);
extern PEntryPtr PEntryFromPID(ProcessID);
extern PEntryPtr PEntryFromFileSpec(FSSpecPtr, StringPtr);
#ifdef MODSQUAD
// Drag.h is not yet in the project. These definitions belong there
#define _DragDispatch 0xABED
#define gestaltDragMgrVersion 'drag' /* drag manager version */
pascal Boolean IsDragAware(WindowPtr, ProcessSerialNumber*)
= { 0x303C, 0x040F, _DragDispatch };
#define bgMouseDown 16
#define DRAG_DONE (0)
#define DRAG_INIT (1)
#define DRAG_IGNORED (2)
#endif
/* Process states (values of p_state) */
#define PRSLEEPING (0) /* on sleep queue, passing the time */
#define PRREADY (1) /* ready to go */
#define PRNULL (2) /* the last guy you'd want to switch in */
#define PRBACKRUN (3) /* sliced in for some extracurricular time */
#define PRRUN (4) /* frontmost user process */
#define PRUPDATE (5) /* current, but only here for an update visit */
#define PRMOVING (6) /* moving from ready to RUNNING as foreground */
#define PRPUPPET (7) /* getting events from the scratchpad event list */
#ifdef MODSQUAD
#define PRSTARTDRAG (8) /* waiting for a start drag call */
#endif
/* Special values of other fields */
#ifdef DEBUG
#define BRAND 'MOM '
#define IsProcessEntry(pProc) (pProc->p_tattoo == BRAND)
#endif DEBUG
/* The file type for Finder or a Finder-replacement */
#define FINDERS_TYPE 'FNDR'
#define IS_FINDER(pProc) (pProc->p_type == FINDERS_TYPE)
/* Data type for supporting the Text Service Manager. */
typedef struct FakeKeyRecord
{
long message; /* We need these two fields of the EventRecord */
short modifiers;
} FakeKeyRecord, *FakeKeyPtr, **FakeKeyHandle;
/************************************************************************************
* Process Mgr global data prototypes and external declarations *
************************************************************************************/
/* Macros for general heap setting in our patches/routines. Many heap operations
* on the SYSZONE or ProcessMgrZone can cause the Process Mgr heap to grow or shrink, which
* will result in a new value in ProcessMgrZone. We must be careful when setting THEZONE
* around such operations: the saved value is obsolete if it had been ProcessMgrZone, and
* ProcessMgrZone moved. The solution is to NOT save and restore THEZONE if it is initially
* equal to ProcessMgrZone. Any change to ProcessMgrZone will be reflected automatically by
* THEZONE.
* NOTE: These macros are not needed in some special cases, like when a) you know
* THEZONE != ProcessMgrZone to begin with, or b) you know the heap operations can not
* cause SYSZONE or ProcessMgrZone to change size.
* NOTE: Assumes a5 == PROCESSMGRGLOBALS
*/
#define SafeSetZone(saveZone, tempZone) \
{ if ((saveZone = THEZONE) == ProcessMgrZone) saveZone = nil; THEZONE = tempZone; }
#define SafeRestoreZone(saveZone) { if (saveZone != nil) THEZONE = saveZone; }
/* External declarations for global data */
extern PEntry NullProcess;
#define pNullProcess (&NullProcess)
#define pProcessList pNullProcess->p_NextProcess
#ifdef HAS_AUX_PROCESSMGR
extern Boolean AUXIsPresent;
#endif HAS_AUX_PROCESSMGR
extern unsigned long ProcessNumberSource;
extern ProcessID ProcessIDSource;
extern short nbacks;
extern short remnulls;
extern short initialProcessSR;
extern PEntryPtr pCurrentProcess;
extern PEntryPtr pFrontProcess;
extern PEntryPtr pNewFrontProcess;
extern PEntryPtr pFrontProcessQueue;
extern PEntryPtr pLastBGProcess;
extern PEntryPtr pShellProcess;
extern PEntryPtr pDebugProcess;
extern PEntryPtr pSleepingStateList;
extern PEntryPtr pDyingStateList;
extern Boolean ShellWasFinderType;
extern LayerPtr MFLayer;
extern LayerPtr IMLayer;
extern LayerPtr desklayer;
extern PEntryPtr desklayerowner;
extern unsigned long lastswitch;
extern unsigned long nextswitch;
extern short cutCopyCount;
extern short coercionState;
extern short dont_switch;
extern Boolean napOver;
#ifdef MODSQUAD
extern short gDragState;
extern Boolean gDragMgrIsAvailable;
extern EventRecord gDragEvent;
extern PEntryPtr gFrontDragProcess;
#endif
extern MyScrapInfo srcMyScrapInfo;
extern short nullTimeout;
extern AppleItemHdl FirstAppleItem;
extern Handle hGenericAppIconSuite;
extern Handle hGenericDAIconSuite;
extern Handle standardMenuDefProcRsrc;
extern MenuHandle ApplicationMenuHdl;
extern StringHandle hHideCurrent;
extern THz ProcessMgrZone;
extern HListHdl SystemTempMemHList;
extern short kernelMode;
extern char *kernelstack;
extern unsigned long kernelstackbase;
extern short kernelbusy;
extern Boolean In32BitMode;
extern unsigned long initLocationZero;
extern Ptr initMemTop;
extern Ptr initFSQueueHook;
extern Ptr initCurStackBase;
extern Handle appleMenuDefProcRsrc;
extern Ptr switchTabPtr;
extern u_size lmemToolDataSize;
extern Boolean IsOldDebugger;
extern Ptr oldExceptionVectors[];
extern Ptr debugEntryRoutine;
extern Ptr debugExitRoutine;
extern Ptr debugToAppRoutine;
extern char debugControlKeyCode;
extern short debugKeyTryCount;
extern OSErr ppcInitErr;
extern MFmsgBlkPtr pSystemQuitAllMsg;
extern Boolean allocateGMBlkInSysHeap;
extern Boolean Colorized;
extern Boolean MachineHasFPU;
extern Boolean MachineHasMacPlusKbd;
extern unsigned short fakeKeyCount;
extern FakeKeyHandle fakeKeyHandle;
extern unsigned short dontGetFakeKey;
extern PEntryPtr tsmLayerOwner;
extern Boolean routeEvent;
extern Boolean skiaExists; // <36>
/************************************************************************************
* OSDispatch dispatch table
************************************************************************************/
/* Entry to record a single OSDispatch dispatch table entry */
typedef struct OSDispatchEntry {
void (*dispatchAddr)();
short dispatchDepth;
short dispatchRetSize;
} OSDispatchEntry;
/* Dispatch table itself */
extern struct OSDispatchEntry OSDispatchTable[];
/* Dispatch numbers for specific routines */
#define _IDRequestScratchSwitchTask (0x0000)
#define _IDGetActiveTaskInfo (0x0001)
#define _IDGetSwitchInfo (0x0002)
#define _IDCancelSwitch (0x0003)
#define GETLAYERID (0x0004)
#define LCALCVISID (0x0005)
#define LCVBEHINDID (0x0006)
#define LPAINTBEHINDID (0x0007)
#define LCLIPABOVEID (0x0008)
#define LPAINTONEID (0x0009)
#define LAYERINSERTID (0x000A)
#define LAYERDELETEID (0x000B)
#define MAKETOPLAYERID (0x000C)
#define LAYERCLOSEID (0x000D)
#define LAYERINITID (0x000E)
#define LAYERFINDID (0x000F)
#define KERNELLAUNCHID (0x0010)
#define TWFGSWITCHID (0x0011)
#define GETNEXTHIGHLEVELEVENTID (0x0012)
#define TWGETPIDID (0x0013)
#define NEWDESKTOPLAYEROWNERID (0x0014)
#define TEMPMAXMEMID (0x0015)
#define TEMPTOPMEMID (0x0016)
#define TWGETPROCINFOID (0x0017)
#define TEMPFREEMEMID (0x0018)
#define DISABLESWITCHINGID (0x0019)
#define ENABLESWITCHINGID (0x001A)
#define TWPOSTPSEUDOID (0x001B)
#define SLEEPPROCESSID (0x001C)
#define TEMPNEWHANDLEID (0x001D)
#define TEMPHLOCKID (0x001E)
#define TEMPHUNLOCKID (0x001F)
#define TEMPDISPOSEHANDLEID (0x0020)
#define LNEWWINDOWID (0x0021)
#define LCLOSEWINDOWID (0x0022)
#define LGETAUXWINID (0x0023)
#define TWPOSTALLPSEUDOID (0x0024)
#define LCOLORINVALRECTID (0x0025)
#define SETSTDFILEDIRID (0x0026)
#define GETPRTYPESTRINGSID (0x0027)
#define SETPRTYPESTRINGSID (0x0028)
#define BACKGROUNDNOTIFYID (0x0029)
#define LSHOWHIDEID (0x002A)
#define LGETNEXTLAYER (0x002B)
#define GETPROCESSTRAPADDRESSID (0x002C)
#define SETPROCESSTRAPADDRESSID (0x002D)
#define READWRITEPROCESSMEMORYID (0x002E)
#define READWRITEPROCESSFPUREGSID (0x002F)
#define REGISTERDEBUGGERID (0x0030)
#define ADDAPPLEMENUITEMID (0x0031)
#define DELETEAPPLEMENUITEMID (0x0032)
#define ACCEPTHIGHLEVELEVENTID (0x0033)
#define POSTHIGHLEVELEVENTID (0x0034)
#define GETSERIALNUMBERFROMPORTNAMESID (0x0035)
#define LAUNCHDESKACCESSORYID (0x0036)
#define GETCURRENTPROCESSID (0x0037)
#define GETNEXTPROCESSID (0x0038)
#define GETPROCESSFROMLAYERID (0x0039)
#define GETPROCESSINFORMATIONID (0x003A)
#define SETFRONTPROCESSID (0x003B)
#define WAKEUPPROCESSID (0x003C)
#define SAMEPROCESSID (0x003D)
#define GETAUXMENUITEMID (0x003E)
#define GETSYSTEMCLIENTPROCESSID (0x003F)
#define BEGINSYSTEMMODEID (0x0040)
#define ENDSYSTEMMODEID (0x0041)
#define REQUESTVOLUMENOTIFICATIONID (0x0042)
#define DECLINEVOLUMENOTIFICATIONID (0x0043)
#define KILLPROCESSID (0x0044)
#define GETSPECIFICHIGHLEVELEVENTID (0x0045)
#define GETPORTNAMEFROMPSNID (0x0046)
#define SYSZONEFLOATSIZESID (0x0047)
#define NEWFLOATLAYERID (0x0048)
#define DISPOSEFLOATLAYERID (0x0049)
#define POSTFAKEKEYDOWNID (0x004A)
#define POSTTEXTID (0x004B)
#define INLINEAWAREID (0x004C)
#define NEWTSMLAYEROWNERID (0x004D)
#define ROUTEEVENTTOSWMID (0x004E)
#define PENTRYFROMPROCESSSERIALNUMBERID (0x004F)
#ifdef MODSQUAD
#define ACCEPTDRAGID (0x0050)
#endif
/* Stack depth (number of bytes of parameters) for specific routines */
#define REQUESTSCRATCHSWITCHDEPTH ((2*2)+(2*4))
#define GETACTIVETASKINFODEPTH ((1*2)+(1*4))
#define GETSWITCHINFODEPTH ((0*2)+(1*4))
#define CANCELSWITCHDEPTH ((0*2)+(0*4))
#define GETLAYERDEPTH (0*4)
#define LCALCVISDEPTH (2*4)
#define LCVBEHINDDEPTH (3*4)
#define LPAINTBEHINDDEPTH (3*4)
#define LCLIPABOVEDEPTH (2*4)
#define LPAINTONEDEPTH (3*4)
#define LAYERINSERTDEPTH (2*4)
#define LAYERDELETEDEPTH (1*4)
#define MAKETOPLAYERDEPTH (1*4)
#define LAYERCLOSEDEPTH (1*4)
#define LAYERINITDEPTH (0*4)
#define LAYERFINDDEPTH (1*4)
#define KERNELLAUNCHDEPTH (1*4)
#define TWFGSWITCHDEPTH (1*2)
#define GETNEXTHIGHLEVELEVENTDEPTH ((2*2)+(1*4))
#define TWGETPIDDEPTH (0)
#define NEWDESKTOPLAYEROWNERDEPTH (2*4)
#define TEMPMAXMEMDEPTH (4)
#define TEMPTOPMEMDEPTH (0)
#define TWGETPROCINFODEPTH ((1*2)+(1*4))
#define TEMPFREEMEMDEPTH (0)
#define DISABLESWITCHINGDEPTH (0*4)
#define ENABLESWITCHINGDEPTH (0*4)
#define TWPOSTPSEUDODEPTH (2+4+2)
#define SLEEPPROCESSDEPTH (4)
#define TEMPNEWHANDLEDEPTH (2*4)
#define TEMPHLOCKDEPTH (2*4)
#define TEMPHUNLOCKDEPTH (2*4)
#define TEMPDISPOSEHANDLEDEPTH (2*4)
#define LNEWWINDOWDEPTH (1*4)
#define LCLOSEWINDOWDEPTH (1*4)
#define LGETAUXWINDEPTH (3*4)
#define TWPOSTALLPSEUDODEPTH (3*4+2)
#define LCOLORINVALRECTDEPTH (4+2+2)
#define SETSTDFILEDIRDEPTH (2+2+4)
#define GETPRTYPESTRINGSDEPTH (4)
#define SETPRTYPESTRINGSDEPTH (6)
#define BACKGROUNDNOTIFYDEPTH (4)
#define LSHOWHIDEDEPTH (4+2)
#define LGETNEXTLAYERDEPTH (4+2)
#define GETPROCESSTRAPADDRESSDEPTH (4+4+2+2)
#define SETPROCESSTRAPADDRESSDEPTH (4+4+2+2)
#define READWRITEPROCESSMEMORYDEPTH (4+4+4+4+2)
#define READWRITEPROCESSFPUREGSDEPTH (4+4+2)
#define REGISTERDEBUGGERDEPTH (4+4+4+4+2)
#define ADDAPPLEMENUITEMDEPTH (4+2+4+2+4)
#define DELETEAPPLEMENUITEMDEPTH (4)
#define ACCEPTHIGHLEVELEVENTDEPTH (4*4)
#define POSTHIGHLEVELEVENTDEPTH (6*4)
#define GETSERIALNUMBERFROMPORTNAMEDEPTH (2*4)
#define LAUNCHDESKACCESSORYDEPTH (2*4)
#define GETCURRENTPROCESSDEPTH (1*4)
#define GETNEXTPROCESSDEPTH (1*4)
#define GETPROCESSFROMLAYERDEPTH (2*4)
#define GETPROCESSINFORMATIONDEPTH (2*4)
#define SETFRONTPROCESSDEPTH (1*4)
#define WAKEUPPROCESSDEPTH (1*4)
#define SAMEPROCESSDEPTH (2*4 + 1*2)
#define GETAUXMENUITEMDEPTH (4*4)
#define GETSYSTEMCLIENTPROCESSDEPTH (1*4)
#define BEGINSYSTEMMODEDEPTH (2*4)
#define ENDSYSTEMMODEDEPTH (2*4)
#define REQUESTVOLUMENOTIFICATIONDEPTH (2*4)
#define DECLINEVOLUMENOTIFICATIONDEPTH (2*4)
#define KILLPROCESSDEPTH (1*4)
#define GETSPECIFICHIGHLEVELEVENTDEPTH (2*4+1*2)
#define GETPORTNAMEFROMPSNDEPTH (2*4)
#define SYSZONEFLOATSIZESDEPTH (2*4)
#define NEWFLOATLAYERDEPTH (4)
#define DISPOSEFLOATLAYERDEPTH (4)
#define POSTFAKEKEYDOWNDEPTH (4)
#define POSTTEXTDEPTH (4+2)
#define INLINEAWAREDEPTH (4+2)
#define NEWTSMLAYEROWNERDEPTH (4)
#define ROUTEEVENTTOSWMDEPTH (2)
#define PENTRYFROMPROCESSSERIALNUMBERDEPTH (4)
#ifdef MODSQUAD
#define ACCEPTDRAGDEPTH (0)
#endif
/* Size of return value for specific routines */
#define REQUESTSCRATCHSWITCHRETSIZE (0)
#define GETACTIVETASKINFORETSIZE (2)
#define GETSWITCHINFORETSIZE (0)
#define CANCELSWITCHRETSIZE (0)
#define GETLAYERRETSIZE (1*4)
#define LCALCVISRETSIZE (0*4)
#define LCVBEHINDRETSIZE (0*4)
#define LPAINTBEHINDRETSIZE (0*4)
#define LCLIPABOVERETSIZE (0*4)
#define LPAINTONERETSIZE (0*4)
#define LAYERINSERTRETSIZE (0*4)
#define LAYERDELETERETSIZE (0*4)
#define MAKETOPLAYERRETSIZE (0*4)
#define LAYERCLOSERETSIZE (0*4)
#define LAYERINITRETSIZE (0*4)
#define LAYERFINDRETSIZE (1*4)
#define KERNELLAUNCHRETSIZE (2)
#define TWFGSWITCHRETSIZE (4)
#define GETNEXTHIGHLEVELEVENTRETSIZE (2)
#define TWGETPIDRETSIZE (2)
#define NEWDESKTOPLAYEROWNERRETSIZE (2)
#define TEMPMAXMEMSIZE (4)
#define TEMPTOPMEMSIZE (4)
#define TWGETPROCINFOSIZE (4)
#define TEMPFREEMEMSIZE (4)
#define DISABLESWITCHINGSIZE (0)
#define ENABLESWITCHINGSIZE (0)
#define TWPOSTPSEUDORETSIZE (0)
#define SLEEPPROCESSRETSIZE (0)
#define TEMPNEWHANDLESIZE (4)
#define TEMPHLOCKSIZE (0)
#define TEMPHUNLOCKSIZE (0)
#define TEMPDISPOSEHANDLESIZE (0)
#define LNEWWINDOWRETSIZE (0)
#define LCLOSEWINDOWRETSIZE (0)
#define LGETAUXWINRETSIZE (2)
#define TWPOSTALLPSEUDORETSIZE (2)
#define LCOLORINVALRECTRETSIZE (0)
#define SETSTDFILEDIRRETSIZE (0)
#define GETPRTYPESTRINGSRETSIZE (2)
#define SETPRTYPESTRINGSRETSIZE (0)
#define BACKGROUNDNOTIFYRETSIZE (0)
#define LSHOWHIDERETSIZE (0)
#define LGETNEXTLAYERRETSIZE (4)
#define GETPROCESSTRAPADDRESSRETSIZE (2)
#define SETPROCESSTRAPADDRESSRETSIZE (2)
#define READWRITEPROCESSMEMORYRETSIZE (2)
#define READWRITEPROCESSFPUREGSRETSIZE (2)
#define REGISTERDEBUGGERRETSIZE (2)
#define ADDAPPLEMENUITEMRETSIZE (2)
#define DELETEAPPLEMENUITEMRETSIZE (2)
#define ACCEPTHIGHLEVELEVENTRETSIZE (2)
#define POSTHIGHLEVELEVENTRETSIZE (2)
#define GETSERIALNUMBERFROMPORTNAMERETSIZE (2)
#define LAUNCHDESKACCESSORYSIZE (2)
#define GETCURRENTPROCESSRETSIZE (2)
#define GETNEXTPROCESSRETSIZE (2)
#define GETPROCESSFROMLAYERRETSIZE (2)
#define GETPROCESSINFORMATIONRETSIZE (2)
#define SETFRONTPROCESSRETSIZE (2)
#define WAKEUPPROCESSRETSIZE (2)
#define SAMEPROCESSRETSIZE (2)
#define GETAUXMENUITEMRETSIZE (2)
#define GETSYSTEMCLIENTPROCESSRETSIZE (2)
#define BEGINSYSTEMMODERETSIZE (2)
#define ENDSYSTEMMODERETSIZE (2)
#define REQUESTVOLUMENOTIFICATIONRETSIZE (2)
#define DECLINEVOLUMENOTIFICATIONRETSIZE (2)
#define KILLPROCESSRETSIZE (2)
#define GETSPECIFICHIGHLEVELEVENTRETSIZE (2)
#define GETPORTNAMEFROMPSNRETSIZE (2)
#define SYSZONEFLOATSIZESRETSIZE (2)
#define NEWFLOATLAYERRETSIZE (2)
#define DISPOSEFLOATLAYERRETSIZE (2)
#define POSTFAKEKEYDOWNSIZE (2)
#define POSTTEXTSIZE (2)
#define INLINEAWARESIZE (2)
#define NEWTSMLAYEROWNERSIZE (2)
#define ROUTEEVENTTOSWMSIZE (2)
#define PENTRYFROMPROCESSSERIALNUMBERSIZE (4)
#ifdef MODSQUAD
#define ACCEPTDRAGSIZE (2)
#endif
/************************************************************************************
* Patch Table
************************************************************************************/
/* Indices into the saved trap array (patchtrap).
* ***NOTE: Mark all new traps (i.e. the ones you don't expect to already
* exist with ISNEWTRAP in the oldtrap field in each entry of the patchtraps[] array.
*/
#define ISOLDTRAP ((Ptr)(0))
#define ISNEWTRAP ((Ptr)(-1)) /* Specially defined (by us) traps */
#define FIRST_TRAP (0)
/* NOTE: Changes here need to also happen to tables in Data.c and Data.a */
/* First define all traps that are in ROM 78 only */
#define FIRST_ROM78_TRAP (FIRST_TRAP+0)
#define HANDTOHAND (FIRST_ROM78_TRAP+0)
#define LAST_ROM78_TRAP (HANDTOHAND)
/* Now define all ROM 75 traps */
#define FIRST_ROM75_TRAP (LAST_ROM78_TRAP+1)
#define ADDRESMENU (FIRST_ROM75_TRAP+0)
#define CHECKLOAD (FIRST_ROM75_TRAP+1)
#define CLOSE (FIRST_ROM75_TRAP+2)
#define DISPOSHANDLE (FIRST_ROM75_TRAP+3)
#define DRAWMENUBAR (FIRST_ROM75_TRAP+4)
#define EJECT (FIRST_ROM75_TRAP+5)
#define EVENTAVAIL (FIRST_ROM75_TRAP+6)
#define EXITTOSHELL (FIRST_ROM75_TRAP+7)
#define GETNAMEDRESOURCE (FIRST_ROM75_TRAP+8)
#define GETNEXTEVENT (FIRST_ROM75_TRAP+9)
#define GETRESATTRS (FIRST_ROM75_TRAP+10)
#define GETRESOURCE (FIRST_ROM75_TRAP+11)
#define GETSCRAP (FIRST_ROM75_TRAP+12)
#define GETVOL (FIRST_ROM75_TRAP+13)
#define GETVOLINFO (FIRST_ROM75_TRAP+14)
#define HANDLEZONE (FIRST_ROM75_TRAP+15)
#define HFSDISPATCH (FIRST_ROM75_TRAP+16)
#define INITWINDOWS (FIRST_ROM75_TRAP+17)
#define LAUNCH (FIRST_ROM75_TRAP+18)
#define MENUKEY (FIRST_ROM75_TRAP+19)
#define MENUSELECT (FIRST_ROM75_TRAP+20)
#define MOUNTVOL (FIRST_ROM75_TRAP+21)
#define NEWHANDLE (FIRST_ROM75_TRAP+22)
#define OFFLINE (FIRST_ROM75_TRAP+23)
#define OPEN (FIRST_ROM75_TRAP+24)
#define OPENDESKACC (FIRST_ROM75_TRAP+25)
#define OPENRF (FIRST_ROM75_TRAP+26)
#define OSDISPATCH (FIRST_ROM75_TRAP+27)
#define OSRESERVED (FIRST_ROM75_TRAP+28)
#define PACK3 (FIRST_ROM75_TRAP+29)
#define POSTEVENT (FIRST_ROM75_TRAP+30)
#define PUTSCRAP (FIRST_ROM75_TRAP+31)
#define RDRVRINSTALL (FIRST_ROM75_TRAP+32)
#define REALLOCHANDLE (FIRST_ROM75_TRAP+33)
#define RECOVERHANDLE (FIRST_ROM75_TRAP+34)
#define RELEASERESOURCE (FIRST_ROM75_TRAP+35)
#define SETCURSOR (FIRST_ROM75_TRAP+36)
#define SETGROWZONE (FIRST_ROM75_TRAP+37)
#define SIZERSRC (FIRST_ROM75_TRAP+38)
#define STILLDOWN (FIRST_ROM75_TRAP+39)
#define SYSEDIT (FIRST_ROM75_TRAP+40)
#define SYSERROR (FIRST_ROM75_TRAP+41)
#define SYSTEMCLICK (FIRST_ROM75_TRAP+42)
#define SYSTEMEVENT (FIRST_ROM75_TRAP+43)
#define SYSTEMMENU (FIRST_ROM75_TRAP+44)
#define SYSTEMTASK (FIRST_ROM75_TRAP+45)
#define UNMOUNTVOL (FIRST_ROM75_TRAP+46)
#define UPDATERESFILE (FIRST_ROM75_TRAP+47)
#define WAITMOUSEUP (FIRST_ROM75_TRAP+48)
#define WAITNEXTEVENT (FIRST_ROM75_TRAP+49)
#define WAKEUP (FIRST_ROM75_TRAP+50)
#define ZEROSCRAP (FIRST_ROM75_TRAP+51)
#define LAST_ROM75_TRAP (ZEROSCRAP)
/* Patch SetTrapAddress last so we don't use patched version to make our patches */
#define SETTRAPADDRESS (LAST_ROM75_TRAP+1)
/* Entry to record a single trap patch */
typedef struct PatchEntry {
unsigned short trapnum;
unsigned short traptype;
pascal void (*newtrap)();
pascal void (*oldtrap)();
} PatchEntry, *PatchEntryPtr, **PatchEntryHdl;
/* The trap array itself */
extern PatchEntry patchtraps[];
#ifdef DEBUG
/* This is debugging stuff; it don't have to be pretty (and it ain't) */
void DebuggerMsg(char *, int, char *);
#define NO_MESSAGE_ID nil
#define ASSERTION_FAILURE_ID ((Ptr) -1)
#define db() { \
unsigned long dbOldA5; \
dbOldA5 = ProcessMgrA5SimpleSetup(); \
DebuggerMsg(__FILE__, __LINE__, NO_MESSAGE_ID); \
A5SimpleRestore(dbOldA5); }
#define dbmsg(msg) { \
unsigned long dbOldA5; \
dbOldA5 = ProcessMgrA5SimpleSetup(); \
DebuggerMsg(__FILE__, __LINE__, msg); \
A5SimpleRestore(dbOldA5); }
#define assert(assertion) \
{if (!(assertion)) { \
unsigned long dbOldA5; \
dbOldA5 = ProcessMgrA5SimpleSetup(); \
DebuggerMsg(__FILE__, __LINE__, ASSERTION_FAILURE_ID); \
A5SimpleRestore(dbOldA5); } }
#else
#define db()
#define dbmsg(msg)
#define assert(assertion)
#endif DEBUG
#endif __DATA__