Main Page | Class List | File List | Class Members | File Members | Related Pages

override_example.c

Go to the documentation of this file.
00001 #include <CoreServices/CoreServices.h>
00002 #include "mach_override.h"
00003 
00004 //  Funky Protos.
00005 int original( int input );
00006 int override( int input );
00007 void* myMalloc( size_t size );
00008 
00009 //  Reentry types & globals.
00010 typedef int (*OriginalFunctionPtrType)( int );
00011 OriginalFunctionPtrType gOriginalReentry;
00012 typedef void* (*mallocFunctionPtrType)( size_t );
00013 mallocFunctionPtrType   gMalloc;
00014 
00015 int main (int argc, const char * argv[]) {
00016     //-------------------------------------------------
00017     //  Override a local function.
00018     
00019     //  Call it normally.
00020     printf( "*** normal:\n" );
00021     original( 10 );
00022     
00023     //  Override it.
00024     kern_return_t err = mach_override( "_original", NULL, &override, (void**) &gOriginalReentry );
00025     if( err )
00026         return err;
00027     
00028     //  Call it again, the same way.
00029     printf( "*** overriden:\n" );
00030     original( 10 );
00031     
00032     //-------------------------------------------------
00033     //  Override a system function.
00034     
00035     //  Override it.
00036     err = mach_override( "_malloc", NULL, &myMalloc, (void**) &gMalloc );
00037     if( err )
00038         return err;
00039     
00040     //  Call it normally.
00041     printf( "*** malloc overriden:\n" );
00042     malloc( 22 );
00043     
00044     
00045     return 0;
00046 }
00047 
00048 int original( int input ) {
00049     printf( "original input: %d\n", input );
00050     int result = input + 1;
00051     printf( "original result: %d\n", result );
00052     fflush( 0 );
00053     return result;
00054 }
00055 
00056 int override( int input ) {
00057     printf( "override input: %d\n", input );
00058     fflush( 0 );
00059     int result = (gOriginalReentry( input + 20 )) - 10;
00060     printf( "override result: %d\n", result );
00061     fflush( 0 );
00062     return result;
00063 }
00064 
00065 void* myMalloc( size_t size ) {
00066     void *result = gMalloc( size );
00067     printf( "myMalloc( size: %ld ); result: %p\n", size, result );
00068     return result;
00069 }

Generated on Sun Jun 12 22:09:33 2005 for mach_override by doxygen 1.3.4