5 #define WordSize sizeof(void*)
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)
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))
16 #define LODWORD(l) ((uint32_t)(((uint64_t)(l)) & 0xffffffff))
17 #define HIDWORD(l) ((uint32_t)((((uint64_t)(l)) >> 32) & 0xffffffff))
20 #define SET_BIT(v, b) v |= (1ull << b)
21 #define RESET_BIT(v, b) v &= ~(1ull << b)
30 #define BitScanForwardT _BitScanForward64
31 #define BitScanReverseT _BitScanReverse64
32 #define BitTestAndSetT _bittestandset64
33 #define BitTestAndResetT _bittestandreset64
35 #define SET_JUMP(_src,_dst) *(uintptr_t*)(_src) = 0x25FF; *(uintptr_t*)((_src) + 6) = (uintptr_t)_dst;
42 #define BitScanForwardT _BitScanForward
43 #define BitScanReverseT _BitScanReverse
44 #define BitTestAndSetT _bittestandset
45 #define BitTestAndResetT _bittestandreset
47 #define SET_JUMP(_src,_dst) *(uint8_t*)(_src) = 0xE9; *(uintptr_t*)((_src) + 1) = (uintptr_t)(_dst) - (uintptr_t)(_src) - 5
51 inline e operator |(e a1, e a2) { \
52 return static_cast<e>(static_cast<int>(a1) | static_cast<int>(a2)); \
55 inline e operator |= (e& a1, e a2) { \
56 return a1 = a1 | a2; \
59 inline e operator &(e a1, e a2) { \
60 return static_cast<e>(static_cast<int>(a1)& static_cast<int>(a2)); \
63 inline e operator &= (e& a1, e a2) { \
64 return a1 = a1 & a2; \
67 inline e operator ~(e a1) { \
68 return static_cast<e>(~static_cast<int>(a1)); \
76 template<
typename _Tgt,
typename _Src>
77 inline _Tgt brutal_cast(
const _Src& src )
79 static_assert(
sizeof( _Tgt ) ==
sizeof( _Src ),
"Operand size mismatch");
80 union _u { _Src s; _Tgt t; } u;
86 inline size_t Align(
size_t val,
size_t alignment )
88 return (val % alignment == 0) ? val : (val / alignment + 1) * alignment;
92 #define LAST_STATUS_OFS (0x598 + 0x197 * WordSize)
98 inline NTSTATUS LastNtStatus()
100 return *(NTSTATUS*)((
unsigned char*)NtCurrentTeb() + LAST_STATUS_OFS);
108 inline NTSTATUS LastNtStatus( NTSTATUS status )
110 return *(NTSTATUS*)((
unsigned char*)NtCurrentTeb() + LAST_STATUS_OFS) = status;
113 #define EMIT(a) __asm __emit (a)
116 #define X64_Start_with_CS(_cs) \
118 EMIT(0x6A) EMIT(_cs) \
119 EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) \
120 EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(5) \
125 #define X64_End_with_CS(_cs) \
127 EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) \
128 EMIT(0xC7) EMIT(0x44) EMIT(0x24) EMIT(4) EMIT(_cs) EMIT(0) EMIT(0) EMIT(0) \
129 EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(0xD) \
136 #define X64_Start() X64_Start_with_CS(0x33)
137 #define X64_End() X64_End_with_CS(0x23)
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))