Patching a Trap
Patching a Trap
// Patching a trap
// An example of patching the GetNewDialog() trap. This patch
// does nothing but call the real GetNewDialog() trap.
#include
// Assumes inclusion of
#define _GetNewDialog 0xA97C
/* save regs not p reserved by THINK C */
#define SaveRegs()
asm { movem.l a0-a1/d0-d2,-(sp) }
/* restore regs not p reserved by THINK C */
#define RestoreRegs()
asm { movem.l (sp)+,a0-a1/d0-d2 }
typedef pascal DialogPtr (*GetNewDialogProcPtr) ( short, Ptr, WindowPtr);
GetNewDialogProcPtr gOldGetNewDialog;
extern void GetNewDialogJmp(void);
static pascal DialogPtr GetNewDialogHook( short dlogID, Ptr storage,
WindowPtr behind)
{
DialogPtr dlogPtr;
SaveRegs();
SetUpA4();
dlogPtr = gOldGetNewDialog(dlogID, storage, behind);
RestoreA4();
RestoreRegs();
return dlogPtr;
}
static void InstallPatch(void)
{
gOldGetNewDialog =
(GetNewDialogProcPtr)NGetTrapAddress(_GetNewDialog);
NSetTrapAddress((long)GetNewDialogHook,
_GetNewDialog);
}