/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#include "inc/arch.hh"
#ifdef _WINDOWS
void null_function() {}
w32 MSVC_p[20];
w32 MSVC_params=0;
void (*MSVC_func)()=&null_function;
static char FP_SAVE[120];
typedef void (*func0)(void);
typedef void (*func1)(w32 a);
typedef void (*func2)(w32 a,w32 b);
typedef void (*func3)(w32 a,w32 b,w32 c);
typedef void (*func4)(w32 a,w32 b,w32 c,w32 d);
typedef void (*func5)(w32 a,w32 b,w32 c,w32 d,w32 e);
void MSVC_exec()
{
__asm {
pushfd
pushad
fsave FP_SAVE
frstor FP_SAVE
push ebp
mov ebp, esp
push ecx
push ebx
push esi
push edi
}
switch (MSVC_params)
{
case 1: (*((func1)MSVC_func))(MSVC_p[0]); break;
case 2: (*((func2)MSVC_func))(MSVC_p[0],MSVC_p[1]); break;
case 3: (*((func3)MSVC_func))(MSVC_p[0],MSVC_p[1],MSVC_p[2]); break;
case 4: (*((func4)MSVC_func))(MSVC_p[0],MSVC_p[1],MSVC_p[2],MSVC_p[3]); break;
case 5: (*((func5)MSVC_func))(MSVC_p[0],MSVC_p[1],MSVC_p[2],MSVC_p[3],MSVC_p[4]); break;
default:(*((func0)MSVC_func))(); break;
}
MSVC_func = &null_function;
MSVC_params = 0;
__asm {
pop edi
pop esi
pop ebx
pop ecx
mov esp, ebp
pop ebp
frstor FP_SAVE
popad
popfd
}
}
#endif