Spellforce-Spell-framework
Loading...
Searching...
No Matches
sf_asi.h
Go to the documentation of this file.
1#pragma once
2
3#define WIN32_LEAN_AND_MEAN
4#include <windows.h>
5
6namespace ASI
7{
9{
10 SF_154 = 154,
11 SF_161 = 161,
12 SF_BETA = 162
13};
14
17{
22 {
23 }
24 MemoryRegion(int off, int len)
25 {
26 memory_offset = off;
27 memory_length = len;
28 }
29};
30
31struct Pointer
32{
33 void *ptr;
35 {
36 }
37 Pointer(int val)
38 {
39 ptr = (void *)val;
40 }
41 Pointer(unsigned int val)
42 {
43 ptr = (void *)val;
44 }
45 Pointer(const Pointer &p)
46 {
47 ptr = p.ptr;
48 }
49 Pointer(void *p)
50 {
51 ptr = p;
52 }
53 inline Pointer operator[](int offset)
54 {
55 return *this + offset;
56 }
57 inline Pointer operator+(int offset)
58 {
59 return Pointer((int)ptr + offset);
60 }
61 inline Pointer operator-(int offset)
62 {
63 return Pointer((int)ptr - offset);
64 }
65 inline Pointer Follow()
66 {
67 return Pointer((int)(*(void **)ptr));
68 }
70 {
71 return Pointer((int)(*(void **)ptr));
72 }
73 inline bool operator==(Pointer p)
74 {
75 return ptr == p.ptr;
76 }
77 inline bool operator!=(Pointer p)
78 {
79 return ptr != p.ptr;
80 }
81 template <class T>
82 inline T &AsRef()
83 {
84 return *(T *)ptr;
85 }
86 template <class T>
87 inline operator T()
88 {
89 return *(T *)ptr;
90 }
91};
92
94{
95public:
97{
98 data = 0;
99 size = 0;
100}
101FakeStack(int _size)
102{
103 data = new char[_size];
104 size = _size;
105}
107{
108 if (data != 0)
109 delete[] data;
110}
112{
113 return ASI::Pointer(data + (size - offset));
114}
115
116private:
117char *data;
118int size;
119};
120
121// start of game code, above this is probably stack?
122extern unsigned int GAME_BASE;
123// pointer to game window is statically allocated in game exe under address GAME_BASE + WINDOW_OFFSET
124extern int WINDOW_OFFSET;
125// pointer to appmain, the entire game starts from this position in exe
126extern unsigned int APPMAIN_OFFSET;
127
128bool BeginRewrite(MemoryRegion &mem_region);
129bool EndRewrite(MemoryRegion &mem_region);
130
131bool Init(HMODULE lib_module);
132bool __stdcall CheckSFVersion(SF_Version sf_version);
133
135inline int AddrOf(int offset)
136{
137 return GAME_BASE + offset;
138}
139template <unsigned int Addr, typename ... Args>
140inline void CallGlobalProc(Args... vals)
141{
142 ((void(__stdcall *)(Args...))(Addr))(vals ...);
143}
144
145template <unsigned int Addr, typename Result, typename ... Args>
146inline Result CallGlobalFunc(Args... vals)
147{
148 return ((Result(__stdcall *)(Args...))(Addr))(vals ...);
149}
150
151template <unsigned int Addr, typename ... Args>
152inline void CallGlobalCDeclProc(Args... vals)
153{
154 ((void(__cdecl *)(Args...))(Addr))(vals ...);
155}
156
157template <unsigned int Addr, typename Result, typename ... Args>
158inline Result CallGlobalCDeclFunc(Args... vals)
159{
160 return ((Result(__cdecl *)(Args...))(ASI::AddrOf(Addr)))(vals ...);
161}
162
163template <unsigned int Addr, typename ... Args>
164inline void CallClassProc(ASI::Pointer _this, Args... vals)
165{
166 ((void(__thiscall *)(void *, Args...))(Addr))(_this.ptr, vals ...);
167}
168
169template <unsigned int Addr, typename Result, typename ... Args>
170inline Result CallClassFunc(ASI::Pointer _this, Args... vals)
171{
172 return ((Result(__thiscall *)(void *,
173 Args...))(ASI::AddrOf(Addr)))(_this.ptr,
174 vals ...);
175}
176
177template <unsigned int Offset, typename ... Args>
178inline void CallClassVirtualProc(ASI::Pointer _this, Args... vals)
179{
180 ((void(__thiscall *)(void *, Args...))(*((*_this)[Offset])))(_this.ptr,
181 vals ...);
182}
183
184template <unsigned int Offset, typename Result, typename ... Args>
185inline Result CallClassVirtualFunc(ASI::Pointer _this, Args... vals)
186{
187 return ((Result(__thiscall *)(void *,
188 Args...))(*((*_this)[Offset])))(_this.ptr,
189 vals ...);
190}
191
192template <typename ... Args>
193inline void CallAsClassProc(void *FPtr, ASI::Pointer _this, Args... vals)
194{
195 ((void(__thiscall *)(void *, Args...))(FPtr))(_this.ptr, vals ...);
196}
197
198template <typename Result, typename ... Args>
199inline Result CallAsClassFunc(void *FPtr, ASI::Pointer _this, Args... vals)
200{
201 return ((Result(__thiscall *)(void *, Args...))(FPtr))(_this.ptr, vals ...);
202}
203}
ASI::Pointer operator[](int offset)
Definition sf_asi.h:111
FakeStack(int _size)
Definition sf_asi.h:101
Definition sf_asi.cpp:4
int AddrOf(int offset)
returns "real" virtual address of given memory offset
Definition sf_asi.h:135
Result CallGlobalCDeclFunc(Args... vals)
Definition sf_asi.h:158
void CallClassVirtualProc(ASI::Pointer _this, Args... vals)
Definition sf_asi.h:178
SF_Version
Definition sf_asi.h:9
@ SF_161
Definition sf_asi.h:11
@ SF_154
Definition sf_asi.h:10
@ SF_BETA
Definition sf_asi.h:12
bool __stdcall CheckSFVersion(SF_Version sf_version)
check version of the game that was hooked into
Definition sf_asi.cpp:54
bool BeginRewrite(MemoryRegion &mem_region)
allows rewriting code in a given memory region by overwriting permissions for that memory region
Definition sf_asi.cpp:6
unsigned int APPMAIN_OFFSET
Definition sf_asi.cpp:28
int WINDOW_OFFSET
Definition sf_asi.cpp:27
void CallGlobalCDeclProc(Args... vals)
Definition sf_asi.h:152
Result CallGlobalFunc(Args... vals)
Definition sf_asi.h:146
bool EndRewrite(MemoryRegion &mem_region)
ends rewriting by restoring old permissions in a given memory region
Definition sf_asi.cpp:14
unsigned int GAME_BASE
Definition sf_asi.cpp:26
Result CallClassFunc(ASI::Pointer _this, Args... vals)
Definition sf_asi.h:170
Result CallAsClassFunc(void *FPtr, ASI::Pointer _this, Args... vals)
Definition sf_asi.h:199
bool Init(HMODULE lib_module)
required for everything to work... why?
Definition sf_asi.cpp:35
Result CallClassVirtualFunc(ASI::Pointer _this, Args... vals)
Definition sf_asi.h:185
void CallGlobalProc(Args... vals)
Definition sf_asi.h:140
void CallAsClassProc(void *FPtr, ASI::Pointer _this, Args... vals)
Definition sf_asi.h:193
void CallClassProc(ASI::Pointer _this, Args... vals)
Definition sf_asi.h:164
MemoryRegion is used for rewriting code in a given memory block.
Definition sf_asi.h:17
DWORD old_reg_perm
Definition sf_asi.h:20
MemoryRegion(int off, int len)
Definition sf_asi.h:24
Pointer operator*()
Definition sf_asi.h:69
Pointer(void *p)
Definition sf_asi.h:49
Pointer operator-(int offset)
Definition sf_asi.h:61
T & AsRef()
Definition sf_asi.h:82
bool operator==(Pointer p)
Definition sf_asi.h:73
Pointer operator+(int offset)
Definition sf_asi.h:57
bool operator!=(Pointer p)
Definition sf_asi.h:77
Pointer Follow()
Definition sf_asi.h:65
Pointer operator[](int offset)
Definition sf_asi.h:53
Pointer(unsigned int val)
Definition sf_asi.h:41
Pointer(const Pointer &p)
Definition sf_asi.h:45
Pointer(int val)
Definition sf_asi.h:37
void * ptr
Definition sf_asi.h:33