Я нашел решение: делаем указатель -
глобальной переменной. А не локальной, как у нас было до этого.
void (*gFunPtr)(int) = (void(*)(int)) ((int*)f+3); // Глобальная переменная
И, тогда в функции foo2 :
void foo2(int a)
{
void (*fptr)(int) = gFunPtr;
...
}
В release-сборке это присваивание будет выглядеть так:
mov eax,[000403024]
...
В свою очередь, по адресу 00403024 (это адрес нашей глобальной переменной gFunPtr) мы видим:
6C104000
Как известно у нас обратный порядок байт - следовательно
в переменной gFunPtr содержится значение 0040106C. А это не что иное как:
00401060(адрес функции f) + С (3 * sizeof int)
Все получилось!)