![[Contents]](../images/toc_d.gif) 
![[Index]](../images/index_d.gif) 
![[Help]](../images/help_d.gif) 
![[Retrace]](../images/retrace_d.gif) 
![[Browse <]](../images/prev.gif) 
![[Browse >]](../images/next.gif) 
/* hooks1.c
 * Simple hook example
 * Copyright (C) 1991-1999 Amiga, Inc.
 *
 */
#include <exec/types.h>
#include <exec/libraries.h>
#include <utility/hooks.h>
#include <clib/exec_protos.h>
#include <clib/utility_protos.h>
extern struct Library *SysBase;
struct Library *UtilityBase;
#define ASM     __asm
#define REG(x)  register __ ## x
/* This function converts register-parameter Hook calling
 * convention into standard C conventions.  It requires a C
 * compiler that supports registerized parameters, such as
 * SAS/C 5.xx or greater.
 */
ULONG ASM
hookEntry(REG(a0) struct Hook *h, REG(a2) VOID *o, REG(a1) VOID *msg)
{
    return ((*h->h_SubEntry)(h, o, msg));
}
/* This simple function is used to initialize a Hook */
VOID InitHook (struct Hook *h, ULONG (*func)(), VOID *data)
{
    /* Make sure a pointer was passed */
    if (h)
    {
        /* Fill in the Hook fields */
        h->h_Entry = (ULONG (*)()) hookEntry;
        h->h_SubEntry = func;
        h->h_Data = data;
    }
}
/* This function only prints out a message to the serial port indicating that
 * we are inside the callback function.  Note that we cannot use printf() or
 * any other functions that use standard I/O with any of the system modules that
 * support callback Hooks, because there is no guarantee that there would
 * be a valid Output() channel. */
ULONG MyFunction (struct Hook *h, VOID *o, VOID *msg)
{
    /* Obtain access to the global data segment */
    geta4();
    /* Debugging function to send a string to the serial port */
    KPrintF("Inside MyFunction()\n");
    return (1);
}
int main (int argc, char **argv)
{
    struct Hook h;
    /* Open the utility library */
    if (UtilityBase = OpenLibrary ("utility.library", 36))
    {
        /* Initialize the callback Hook */
        InitHook (&h, MyFunction, NULL);
        /* Use the utility library function to invoke the Hook */
        CallHookPkt (&h, NULL, NULL);
        /* Close utility library now that we're done with it */
        CloseLibrary (UtilityBase);
    }
    else
    {
        /* Display an error message */
        printf ("Couldn't open utility.library\n");
    }
}
[Back to Amiga Developer Docs]