BlackBone
Windows memory hacking library
 All Classes Functions
Macro.h
1 #pragma once
2 #include "../Config.h"
3 
4 // Architecture-dependent pointer size
5 #define WordSize sizeof(void*)
6 
7 // Rebase address
8 #define MAKE_PTR(T, pRVA, base) (T)((ptr_t)pRVA + (ptr_t)base)
9 #define REBASE(pRVA, baseOld, baseNew) ((ptr_t)pRVA - (ptr_t)baseOld + (ptr_t)baseNew)
10 #define REBASE2(T, rva, baseOld, baseNew) (T)((size_t)rva - (size_t)baseOld + (size_t)baseNew)
11 
12 // Field offset info
13 #define FIELD_OFFSET2(type, field) ((LONG)(LONG_PTR)&(((type)0)->field))
14 #define GET_FIELD_PTR(entry, field) (size_t)((uint8_t*)entry + FIELD_OFFSET2(decltype(entry), field))
15 
16 #define LODWORD(l) ((uint32_t)(((uint64_t)(l)) & 0xffffffff))
17 #define HIDWORD(l) ((uint32_t)((((uint64_t)(l)) >> 32) & 0xffffffff))
18 
19 // Set or reset particular bit
20 #define SET_BIT(v, b) v |= (1ull << b)
21 #define RESET_BIT(v, b) v &= ~(1ull << b)
22 
23 // Register aliases
24 #ifdef USE64
25 #define NAX Rax
26 #define NSP Rsp
27 #define NIP Rip
28 #define NDI Rdi
29 
30 #define BitScanForwardT _BitScanForward64
31 #define BitScanReverseT _BitScanReverse64
32 #define BitTestAndSetT _bittestandset64
33 #define BitTestAndResetT _bittestandreset64
34 
35 #define SET_JUMP(_src,_dst) *(uintptr_t*)(_src) = 0x25FF; *(uintptr_t*)((_src) + 6) = (uintptr_t)_dst;
36 #else
37 #define NAX Eax
38 #define NSP Esp
39 #define NIP Eip
40 #define NDI Edi
41 
42 #define BitScanForwardT _BitScanForward
43 #define BitScanReverseT _BitScanReverse
44 #define BitTestAndSetT _bittestandset
45 #define BitTestAndResetT _bittestandreset
46 
47 #define SET_JUMP(_src,_dst) *(uint8_t*)(_src) = 0xE9; *(uintptr_t*)((_src) + 1) = (uintptr_t)(_dst) - (uintptr_t)(_src) - 5
48 #endif
49 
50 #define ENUM_OPS(e) \
51  inline e operator |(e a1, e a2) { \
52  return static_cast<e>(static_cast<int>(a1) | static_cast<int>(a2)); \
53  } \
54  \
55  inline e operator |= (e& a1, e a2) { \
56  return a1 = a1 | a2; \
57  } \
58  \
59  inline e operator &(e a1, e a2) { \
60  return static_cast<e>(static_cast<int>(a1)& static_cast<int>(a2)); \
61  } \
62  \
63  inline e operator &= (e& a1, e a2) { \
64  return a1 = a1 & a2; \
65  } \
66  \
67  inline e operator ~(e a1) { \
68  return static_cast<e>(~static_cast<int>(a1)); \
69  }
70 
71 
72 template<int s>
74 
75 // Type-unsafe cast.
76 template<typename _Tgt, typename _Src>
77 inline _Tgt brutal_cast( const _Src& src )
78 {
79  static_assert(sizeof( _Tgt ) == sizeof( _Src ), "Operand size mismatch");
80  union _u { _Src s; _Tgt t; } u;
81  u.s = src;
82  return u.t;
83 }
84 
85 // Align value
86 inline size_t Align( size_t val, size_t alignment )
87 {
88  return (val % alignment == 0) ? val : (val / alignment + 1) * alignment;
89 }
90 
91 // Offset of 'LastStatus' field in TEB
92 #define LAST_STATUS_OFS (0x598 + 0x197 * WordSize)
93 
98 inline NTSTATUS LastNtStatus()
99 {
100  return *(NTSTATUS*)((unsigned char*)NtCurrentTeb() + LAST_STATUS_OFS);
101 }
102 
108 inline NTSTATUS LastNtStatus( NTSTATUS status )
109 {
110  return *(NTSTATUS*)((unsigned char*)NtCurrentTeb() + LAST_STATUS_OFS) = status;
111 }
112 
113 #define EMIT(a) __asm __emit (a)
114 
115 // Switch processor to long mode
116 #define X64_Start_with_CS(_cs) \
117  { \
118  EMIT(0x6A) EMIT(_cs) /* push _cs */ \
119  EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) /* call $+5 */ \
120  EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(5) /* add dword [esp], 5 */ \
121  EMIT(0xCB) /* retf */ \
122  }
123 
124 // Switch processor to WOW64 mode
125 #define X64_End_with_CS(_cs) \
126  { \
127  EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) /* call $+5 */ \
128  EMIT(0xC7) EMIT(0x44) EMIT(0x24) EMIT(4) EMIT(_cs) EMIT(0) EMIT(0) EMIT(0) /* mov dword [rsp + 4], _cs */ \
129  EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(0xD) /* add dword [rsp], 0xD */ \
130  EMIT(0xCB) /* retf */ \
131  }
132 
133 //
134 // 64bit assembly helpers
135 //
136 #define X64_Start() X64_Start_with_CS(0x33)
137 #define X64_End() X64_End_with_CS(0x23)
138 
139 #define _RAX 0
140 #define _RCX 1
141 #define _RDX 2
142 #define _RBX 3
143 #define _RSP 4
144 #define _RBP 5
145 #define _RSI 6
146 #define _RDI 7
147 #define _R8 8
148 #define _R9 9
149 #define _R10 10
150 #define _R11 11
151 #define _R12 12
152 #define _R13 13
153 #define _R14 14
154 #define _R15 15
155 
156 #define X64_Push(r) EMIT(0x48 | ((r) >> 3)) EMIT(0x50 | ((r) & 7))
157 #define X64_Pop(r) EMIT(0x48 | ((r) >> 3)) EMIT(0x58 | ((r) & 7))
Definition: Macro.h:73