Home > other >  Incompatible pointer types assigning to 'int (*)(int, int, int, int, int)' from 'int
Incompatible pointer types assigning to 'int (*)(int, int, int, int, int)' from 'int

Time:09-09

I have this pointer to an orgFunction takes 5 int as input and returns int, and orgfunctionhook takes the same args and return:

int (*orgFunction)(int a1, int a2 , int a3 , int a4, int a5);

int orgFunctionHook(int a1, int a2 , int a3 , int a4, int a5)
{
  // do something..
  return orgFunction(a1,a2,a3,a4,a5);
}

void Load(){
    orgFunction = (int*)HookFunction((char*)"something", 0x50000, (void*)orgFunctionHook);
}

And the HookFunction takes 3 args, const char, an address for my original function, and some hook

for ease this is the definition for it:

void* HookFunction(char* path, uint64_t vaddr, void* replace);

it returns a void*, my function i want to use it return int, once i use it in the Load()

I get this error:

" Incompatible pointer types assigning to 'int (*)(int, int, int, int, int)' from 'int *' "

My attempt to solve it was to declare it like this:

void Load(){
    void * orgFunction = (int*)HookFunction((char*)"something", 0x50000, (void*)orgFunctionHook);
}

but this makes a problem in the run time it when it runs the orgFunctionHook, the pointer address to the function orgFunction will be assinged as 0x0 ( EMPTY )

Is there could be another solution to pass this without losing the pointer to the origin function?

EDIT: Forgot to mention, that I can't change anything related to the HookFunction, its return or paramters remain the same.

CodePudding user response:

You're casting to the wrong type. As mentioned in the error message, the function pointer has type int (*)(int,int,int,int,int) but you're attempting to assign an expression of type int * to it. These types are incompatible.

The proper way to do this would be to create a typedef for the function pointer type:

typedef int (*ftype)(int, int, int, int, int);

Then you declare your function pointer with this type:

ftype orgFunction;

And similarly with HookFunction:

ftype HookFunction(char* path, uint64_t vaddr, ftype replace);

Then your Load function would look like this:

void Load(){
    orgFunction = HookFunction((char*)"something", 0x50000, orgFunctionHook);
}

If you can't modify HookFunction, then just use the typedef in the call:

void Load(){
    orgFunction = (ftype)HookFunction((char*)"something", 0x50000, (void *)orgFunctionHook);
}
  • Related