I saw "I have a different kind of idea for the analysis of THUNK in C ". The original code is as follows: #pragma pack (push, 1) // structure to store the machine code thunk {char m_jmp; // Op code of jmp instruction unsigned long m_relproc; // relative jmp
}; # prgma pack (POP)
// this Type of Structure CAN Contain THUNK CODE, Which Can Be Executed on The Fly. Let's Take a Look At The Simple Case In Which We Are Going to Execute Our Required Function by Thunk.
// Program 77
#include
#include
Using namespace std;
Class C;
C * g_pc = NULL;
TYPEDEF VOID (* PFUN) ();
Class C
{
PUBLIC: INT A; INT B; Float Bbj; Thunk M_thunk;
// virtual void g () {};
Void Init (PFUN PFUN, VOID * PTHIS)
{
// Op code of jump instruction
m_thunk.m_jmp = 0xE9;
// Address of the appriate function
/ * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ade
& m_thunk, sizeof (m_thunk));
}
// this is co Call Back Function
Static void calbackfun ()
{
C * pc = g_pc; // initilize the thunk
PC-> Init (staticfun, pc); // Get The Address of Thunk Code
PFUN PFUN = (PFUN) & (PC-> m_thunk); // Start Executing Thunk Code Which Will Call Staticfun
PFUN ();
Cout << "C :: CallbackFun" << Endl;
}
Static void staticfun ()
{
Cout << "c :: staticfun" << Endl;
}
}
int main ()
{
C Objc; g_pc = & objc; C :: CallbackFun (); return 0;}