[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

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

    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]