An application passes a custom function in the form of a callback Hook
(from <utility/hooks.h>):
/* Standard hook structure */
struct Hook
{
struct MinNode h_MinNode;
ULONG (*h_Entry)(); /* stub function entry point */
ULONG (*h_SubEntry)(); /* the custom function entry point */
VOID *h_Data; /* owner specific */
};
h_MinNode - This field is reserved for use by the module that will
call the Hook.
h_Entry - This is the address of the Hook stub. When the OS calls
a callback function, it puts parameters for the callback function
in CPU registers A0, A1, and A2. This makes it tough for higher
level language programmers to use a callback function because most
higher level languages don't have a way to manipulate CPU registers
directly. The solution is a stub function which first copies the
parameters from the CPU registers to a place where a high level
language function can get to them. The stub function then calls
the callback function. Typically, the stub pushes the registers
onto the stack in a specific order and the high level language
callback function pops them off the stack.
h_SubEntry - This is the address of the actual callback function
that the application has defined. The stub calls this function.
h_Data - This field is for the application to use. It could point
to a global storage structure that the callback function utilizes.
There is only one function defined in utility.library for callback
functions.
ULONG CallHookPkt(struct Hook *hook, VOID *object, VOID *paramPkt);
A0 A2 A1
This function invokes a standard callback Hook function.
[Back to Amiga Developer Docs]