// Klasse, um an eine Rückrufadresse eine benutzerspezifische Adresse
// zu liefern; Anwendungsbeispiel siehe THUNK.H - h#s 12/05
#define WIN32_LEAN_AND_MEAN
#include "Thunk.h"
// _cdecl-Version
CThunk::MakeCdecl(LPVOID FuncPtr, PVOID Arg) {
#ifdef _M_IX86
code[0] = 0x68; // push Arg ; Objekt-Zeiger vorn hinzufügen
*(PDWORD)(code+1) = (DWORD)Arg; // (Returnadresse bleibt liegen)
code[5] = 0xE8; // call FuncPtr ; Fkt. mit 2 Parametern mehr aufrufen
*(PDWORD)(code+6) = (DWORD)FuncPtr - (DWORD)(code+10);
code[10] = 0x59; // pop ecx ; Objekt-Zeiger entfernen
code[11] = 0xC3; // ret ; Aufrufer räumt den Rest vom Stack auf
#else
# error Nicht unterstützte Plattform! Ggf. Kode hier einfügen!
#endif
}
// _stdcall-Version
CThunk::MakeStdcall(LPVOID FuncPtr, PVOID Arg) {
#ifdef _M_IX86
code[0] = 0x59; // pop ecx ; Returnadresse vom Stack
code[1] = 0x68; // push Arg ; Objekt-Zeiger vorn hinzufügen
*(PDWORD)(code+2) = (DWORD)Arg;
code[6] = 0x51; // push ecx ; Returnadresse auf Stack
code[7] = 0xE9; // jmp FuncPtr ; Fkt. mit 1 Parameter mehr anspringen
*(PDWORD)(code+8) = (DWORD)FuncPtr - (DWORD)(code+12);
#else
# error Nicht unterstützte Plattform! Ggf. Kode hier einfügen!
#endif
}
Detected encoding: ANSI (CP1252) | 4
|
|