Je voudrais thunk (en ajustant la pile) fonction __stdcall. Par exemple, un appelant pense est a un pointeur vers une fonction de rappel avec le prototype suivant:Thunking __stdcall fonction avec ajustement de la pile
int Func(int a);
Je voudrais écrire un thunk (qui sera passé comme un rappel) qui ajuste l'appel à la fonction suivante prototype:
int Func(char* ptr, int a);
Je sais que quand mon thunk sera appelée que la mise en page de la pile est:
------------------
| a |
------------------
| return address | <-- Top of the stack
------------------
J'aimerais régler le collé à:
------------------
| a |
------------------
------------------
| ptr |
------------------
| return address | <-- Top of the stack
------------------
puis faire un saut par rapport à la fonction correspondante (de cette façon lorsque la fonction appelée retour de la pile est équilibrée)
Voici ma dernière thunk qui fonctionne (bien sûr, il doit être emballé et dynamique chargée à la mémoire exécutable), Kudo à Jester pour aider avec le code hexadécimal d'assemblage pour les instructions nécessaires!
struct Thunk
{
BYTE m_popRet;
BYTE m_pushPtr;
DWORD m_ptr;
BYTE m_pushRet;
BYTE m_jmp;
DWORD m_relProc;
BOOL Init(DWORD_PTR proc, void* ptr)
{
m_popRet = 0x58;
m_pushPtr = 0x68;
m_ptr = PtrToUlong(ptr);
m_pushRet = 0x50;
m_jmp = 0xE9;
m_relProc = DWORD((INT_PTR)proc - ((INT_PTR)this + sizeof Thunk));
return TRUE;
}
}
La question semble intéressante, mais je ne comprends pas ce qui est demandé. Puisque vous avez déterminé cela, vous pourriez vouloir éditer la question. – anatolyg
@anatolyg ne sais pas ce qui a besoin d'éclaircir? Il a dit qu'il voulait créer une fonction de thunk qui peut être passée comme un callback avec le prototype 'int Func (int a);' et qui devrait ensuite appeler une autre fonction 'int Func (char * ptr, int a); vous devez changer la disposition de la pile selon les diagrammes OP fournis. Il veut essentiellement créer un int thunk (int a) {return proc (ptr, a); } ' – Jester
SO la question était" quel est le problème avec mon code "et la réponse est" alignement ", non? – anatolyg