Below is something I believe I mentioned recently. This time I just found
the mail and enclose it.
BGK


The technique I use (example is of patching DmOpenDatabase, stripped of
error checking) is:

// My global data.

typedef struct {
various global data
} GlobalsType, *GlobalsPtr;

// Special structure used to create a snippet of code, which gets called
// as the patched routine, sets up the global ptr, and then jumps to the
// real patch code.

typedef struct {
Word opCodes[3];
VoidPtr codeP;
GlobalsPtr globalsP;
} PatchType, *PatchPtr;

// Snippet of patch installation code.

GlobalsPtr gP = (GlobalsPtr)MemPtrNew(sizeof(GlobalsType));
MemPtrSetOwner(gP, 0);

PatchPtr openDBPatch = (PatchPtr)MemPtrNew(sizeof(PatchType));
MemPtrSetOwner(openDBPatch, 0);

// set up code to do move.l *+8,a0 followed by jmp instruction.

openDBPatch->opCodes[0] = 0x207A;
openDBPatch->opCodes[1] = 0x0008;
openDBPatch->opCodes[2] = 0x4EF9;

openDBPatch->globalsP = gP;
openDBPatch->codeP = DmOpenDatabasePatch;

SysSetTrapAddress(sysTrapDmOpenDatabase, openDBPatch);

// DmOpenDatabase patch. This gets called with the pointer to
// globals in register a0.

static DmOpenRef
DmOpenDatabasePatch(UInt cardNo, LocalID dbID, UInt mode)
{
GlobalsPtr gP = GetGlobals();

// do stuff in the patch code.
}

// Return a pointer to our globals. Since they get passed to us in A0,
// and we're returning the GlobalsPtr result in A0, we don't need to
// do anything expect help the compiler generate appropriate code.

static inline asm GlobalsPtr
GetGlobals(void)
{
} // GetGlobals

>An even better approach would be to just allocate the extra needed
>space on the front of your "globals" chunk so you only allocate one
>chunk.  This will probably require some clever inline assembly to put
>it all together, but it is possible.  Probably would make for a good
>tech note since it solves the issue of having access to globals in
>code that runs at interrupt time.

To do this, you'd put a PatchType record at the beginning of the
GlobalsType record, and do only one allocation - plus the first opcode
would need to change to load the address of the instruction into A0. I had
them separated since I was patching several different traps, all of whom
wanted to share the same global pointer.

-- Ken

-----Original Message-----
From: Todd L. Cignetti <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Date: Thursday, August 19, 1999 12:11 PM
Subject: How to save data from *any* patched API call? (Hack/patch related)


>Greetings,
>
>I understand that some API's should not be patched, but I need to do it
>anyway, for a school project.  Let's say I wanted to make an ordered list
of
>every system call that occurred, as it occurred.  I could patch every
>individual system call, in HackMaster fashion, to update a log database,
and
>then call the regular system call.  More simply, I could replace the trap
15
>handler with a new handler that would log each system call to a database,
>and then jump to the regular trap 15 handler.
>
>The problem is where to store the log?  The Feature manager is not
>re-entrant (probably not a good place to write a big log anyway).  I would
>guess the database functions are not re-entrant either.
>
>Is there a good way to save this data?  Is there any possible way to save
>data from *any* patched API call?  Would allocating a big hunk of dynamic
>ram work? (I know it would be rude, possibly even evil, but would it work
>for this toy school project?)
>
>-Todd
>
>
>
>This post was sortof related, so I included it:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Post from 7/23/99:
>At 5:29 PM +0000 1999/07/23, [EMAIL PROTECTED] wrote:
>>Does Palm have a list of which traps should "absolutly not" be trapped ?
>>It would be very helpfull to have something to reference when writting
>>trap code.
>
>They're listed in Appendix A of the Palm OS documentation under the heading
>"System Use Only Functions". Not listed there, however, are all APIs
>beginning with 'Hwr' and 'Prv' which are also very much off-limits.
>
>Also note there may be issues with trap patches installed from HackMaster
>hacks for otherwise seemingly legitimately patchable public APIs, due to
the
>need to call the feature manager from within the trap patch to obtain the
>call-through address.
>
>For example, if the patched API is ever called from within an interrupt
>service routine, system kernel timer, or pre-emptive background thread (to
>name a few). The feature manager is not re-entrant for these cases, so
>FtrGet will eventually crash the device, which could possibly destroy the
>user's data depending on which API had been patched.
>
>This list is obviously incomplete, but it's a start. Hope the info helps!
>
>Regards,
>
>Jim Schram
>3Com/Palm Computing
>Partner Engineering
>
>
>

Reply via email to