openmohaa/code/cgame_hook/asm.h

184 lines
6.3 KiB
C
Raw Normal View History

2016-03-27 11:49:47 +02:00
#ifndef __ASM_H__
#define __ASM_H__
#if defined ( CGAME_DLL )
#define _CGAME_CODE() if(1)
#else
#define _CGAME_CODE() if(0)
#endif
#if defined ( WIN32 )
#define _LINUX_CODE() if(0)
#define WIN32_CODE() if(1)
#else
#define _CGAME_CODE() if(0)
#define _LINUX_CODE() if(1)
#define WIN32_CODE() if(0)
#endif
#ifdef WIN32
#define NAKED __declspec(naked)
#else
#define NAKED
#endif
#ifdef __GNUC__
#define JMPTO( addr ) asm("leave;mov %0, %%edx;jmp *%%edx;" : : "g"((DWORD)addr) )
#define JMPTO_DIRECT( addr ) asm("movl %0, %%edx;jmp *%%edx;" : : "g"((DWORD)addr) )
#define CALL( addr ) asm("movl %0, %%edx;call *%%edx;" : : "g"((DWORD)addr) ) //{ DWORD address_CALL = (DWORD) addr; __asm__ __volatile__("movl %0, %%edx;call *%%edx;" : : "g"(address_CALL) ); }
#define PUSH( addr ) asm("pushl %0;" : : "g"(*(DWORD *)&addr) ) //{ DWORD address_PUSH = (DWORD) addr; __asm__ __volatile__("push %0;" :: "g"(address_PUSH)); }
#define POP( addr ) asm("popl %0;" : : "g"(*(DWORD *)&addr) ) //{ DWORD address_PUSH = (DWORD) addr; __asm__ __volatile__("push %0;" :: "g"(address_PUSH)); }
#ifndef WIN32
#define SET_CLASS( addr ) asm("movl %0, %%eax; movl %%eax, (%%esp);" : : "g"((DWORD)addr) ) // asm("movl %0, %%ecx;" : : "g"(addr) ) //{ DWORD address_SET_CLASS = (DWORD) addr; __asm__ __volatile__("movl %0, %%ecx;" : : "g"(address_SET_CLASS) ); }
#define GET_CLASS( var ) asm("movl %%esp, %0;" : "=r"(var) )
#else
#define SET_CLASS( addr ) asm("movl %0, %%ecx;" : : "g"((DWORD)addr) ) // asm("movl %0, %%ecx;" : : "g"(addr) ) //{ DWORD address_SET_CLASS = (DWORD) addr; __asm__ __volatile__("movl %0, %%ecx;" : : "g"(address_SET_CLASS) ); }
#define GET_CLASS( var ) asm("movl %%ecx, %0;" : "=r"(var) )
#endif
#define MAKE_JUMPER( declaration, gamex86_address, fgameded_symbol, cgamex86_address ) declaration {} //asm( ".globl " #fgameded_symbol "\n\t" #fgameded_symbol ":\n\tmovl _" #fgameded_symbol "_, %edx;jmp *%edx;" )
#else
#define JMPTO( addr ) { _asm leave _asm mov edx, addr _asm jmp edx }
#define JMPTO_DIRECT( addr ) { _asm mov edx, addr _asm jmp edx }
#define CALL( addr ) { _asm mov edx, addr _asm call edx }
#define PUSH( addr ) { _asm push addr }
#define POP( addr ) { _asm pop addr }
#define SET_CLASS( addr ) { _asm mov ecx, addr }
#define GET_CLASS( var ) { _asm mov var, ecx }
#define MAKE_JUMPER( declaration, gamex86_address, fgameded_symbol, cgamex86_address ) \
__declspec(naked) declaration { JMPTO_DIRECT_WIN32( gamex86_address) JMPTO_DIRECT_CGAME( cgamex86_address ) }
#endif
#if defined ( _UBER_SDK )
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) 0
#define MP_STRING( gamex86, fgameded, cgamex86 ) 0
#endif
#if defined ( CGAME_DLL )
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) cgamex86
#define MP_STRING( gamex86, fgameded, cgamex86 ) cgamex86
#define JMPTO_CGAME(addr) JMPTO(addr)
#define JMPTO_DIRECT_CGAME(addr) JMPTO_DIRECT(addr)
#if defined( SPEARHEAD ) || defined( SH )
#define JMPTO_SH_CGAME(addr) JMPTO(addr)
#define JMPTO_SH_DIRECT_GAME(addr) JMPTO_DIRECT(addr)
#else
#define JMPTO_SH_CGAME(addr)
#define JMPTO_SH_DIRECT_GAME(addr)
#endif
#if defined( BREAKTHROUGH ) || defined( BT )
#define JMPTO_BT_CGAME(addr) JMPTO(addr)
#define JMPTO_BT_DIRECT_GAME(addr) JMPTO_DIRECT(addr)
#else
#define JMPTO_BT_CGAME(addr)
#define JMPTO_BT_DIRECT_GAME(addr)
#endif
#define CALL_CGAME(addr) CALL(addr)
#else
#define JMPTO_CGAME(addr)
#define JMPTO_DIRECT_CGAME(addr)
#define CALL_CGAME(addr) CALL(addr)
#define JMPTO_SH_CGAME(addr)
#define JMPTO_SH_DIRECT_GAME(addr)
#define JMPTO_BT_CGAME(addr)
#define JMPTO_BT_DIRECT_GAME(addr)
#endif
#if !defined( SPEARHEAD ) && !defined( SH )
#define JMPTO_SH_WIN32(addr)
#define JMPTO_SH_DIRECT_WIN32(addr)
#define JMPTO_SH_LINUX(addr)
#define JMPTO_SH_DIRECT_LINUX(addr)
#endif
#if !defined( BREAKTHROUGH ) && !defined( BT )
#define JMPTO_BT_WIN32(addr)
#define JMPTO_BT_DIRECT_WIN32(addr)
#define JMPTO_BT_LINUX(addr)
#define JMPTO_BT_DIRECT_LINUX(addr)
#endif
#if defined ( WIN32 )
#if defined( GAME_DLL )
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) gamex86
#define MP_STRING( gamex86, fgameded, cgamex86 ) gamex86
#define CALL_WIN32(addr) CALL(addr)
#define JMPTO_WIN32(addr) JMPTO(addr)
#define JMPTO_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
#if defined( SPEARHEAD ) || defined( SH )
#define JMPTO_SH_WIN32(addr) JMPTO(addr)
#define JMPTO_SH_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
#endif
#if defined( BREAKTHROUGH ) || defined( BT )
#define JMPTO_BT_WIN32(addr) JMPTO(addr)
#define JMPTO_BT_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
#endif
#else
#define CALL_WIN32(addr)
#define JMPTO_WIN32(addr)
#define JMPTO_DIRECT_WIN32(addr)
#define JMPTO_SH_WIN32(addr)
#define JMPTO_SH_DIRECT_WIN32(addr)
#define JMPTO_BT_WIN32(addr)
#define JMPTO_BT_DIRECT_WIN32(addr)
#endif
#define JMPTO_LINUX(addr)
#define JMPTO_DIRECT_LINUX(addr)
#define JMPTO_SH_LINUX(addr)
#define JMPTO_SH_DIRECT_LINUX(addr)
#define JMPTO_BT_LINUX(addr)
#define JMPTO_BT_DIRECT_LINUX(addr)
#define CALL_LINUX(addr)
#define SET_CLASS_LINUX( addr )
#define SET_CLASS_WIN32( addr ) SET_CLASS( addr )
#else
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) fgameded
#define MP_STRING( gamex86, fgameded, cgamex86 ) fgameded
#define JMPTO_CLIENT(addr)
#define JMPTO_LINUX(addr) JMPTO(addr)
#define JMPTO_WIN32(addr)
#define JMPTO_DIRECT_CLIENT(addr)
#define JMPTO_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
#define JMPTO_DIRECT_WIN32(addr)
#if defined( SPEARHEAD ) || defined( SH )
#define JMPTO_SH_LINUX(addr) JMPTO(addr)
#define JMPTO_SH_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
#endif
#if defined( BREAKTHROUGH ) || defined( BT )
#define JMPTO_BT_LINUX(addr) JMPTO(addr)
#define JMPTO_BT_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
#endif
#define CALL_LINUX(addr) CALL(addr)
#define CALL_WIN32(addr)
#define SET_CLASS_LINUX( addr ) SET_CLASS( addr )
#define SET_CLASS_WIN32( addr )
#endif
#define MP_CODE( gamex86, fgameded, cgamex86 ) MP_NUMBER( gamex86, fgameded, cgamex86 )
#ifndef WIN32
extern void* dl_fgame_sym( const char *symbol );
#define SYMBOL_DECLARE( symbol ) DWORD _##symbol##_ = (DWORD)dl_fgame_sym( #symbol ) //void* symbol = dlsym( hmod, #symbol )
#define SYMBOL_GET( symbol ) _##symbol##_
#else
#define SYMBOL_DECLARE( symbol )
#define SYMBOL_GET( symbol ) 0
#endif
#define SYM( symbol ) SYMBOL_GET( symbol )
#endif /* __ASM_H__ */