Sytuacja jest bardzo prosta. Mamy sobie jakąś funkcje np. void foo(void) i chciałbym pobrać adres wyżej wymienionej funkcji aby potem skopiować go przy pomocy dajmy to memcpy_s(). Moje pytanie brzmi jak osiągnąć ten cel, bo na chwile obecną nie znalazłem interesującego mnie materiału, który mógłby mnie nakierować?
Żeby móc skopiować przez memcpy adres funkcji to musisz na początku go gdzieś zapisać, podobnie jak z adresem tablicy, ponieważ memcpy kopiuje z jakiegoś miejsca w pamięci do drugiego X bajtów, a adres funkcji nie jest nigdzie przechowywany (tzn. kompilator może go jakoś wyznaczyć jak z niego korzystasz, ale nie jest on zapisany w jakimś miejscu w pamięci). Przykład: http://ideone.com/ehpmP
To bardzo ciekawe co mówisz zważywszy na to, że w C++ o ile mnie pamięć nie myli robi się to tak:
DWORD addr = (DWORD)foo;
memcpy(bez_znaczenia, &addr, 8);
Z tego co na chwile obecną się doszukałem to tylko coś takiego:
void* addr = (void*&)foo;
Odpal ten przykładzik i przeanalizuj.
#include<iostream>
using namespace std;
int add(int a,int b) { return a+b; }
int sub(int a,int b) { return a-b; }
int mul(int a,int b) { return a*b; }
typedef int FUN(int a,int b);
void go(FUN *fun,int a,int b)
{
cout<<fun(a,b)<<endl;
}
int main()
{
go(add,50,20);
go(sub,50,20);
go(mul,50,20);
cout<<endl;
FUN *Tb[]={add,sub,mul};
for(int i=0;i<3;++i) cout<<Tb[i](5,2)<<endl;
cout<<endl;
int (*ptr)(int a,int b)=add;
//Fun *ptr=add; // to samo co wyżej
cout<<ptr(50,20)<<endl;
ptr=sub;
cout<<ptr(50,20)<<endl;
ptr=mul;
cout<<ptr(50,20)<<endl;
cin.get();
return 0;
}
Czy na pewno chcesz gdzieś kopiować adres tej memcpy?
Dziękuje za przykład, przeanalizowałem pod dbg i zrozumiałem. Odpowiadając na pytanie: tak, potrzebuję ten adres ponieważ jest on mi potrzebny do wstawki asm aby coś zpatchować/zrobić obejście - jak zwał tak zwał.