mirror of
https://github.com/sslab-gatech/winnie
synced 2026-06-08 17:35:47 +00:00
74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
/**
|
|
*
|
|
* WOW64Ext Library
|
|
*
|
|
* Copyright (c) 2014 ReWolf
|
|
* http://blog.rewolf.pl/
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published
|
|
* by the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#define EMIT(a) __asm __emit (a)
|
|
|
|
#define X64_Start_with_CS(_cs) \
|
|
{ \
|
|
EMIT(0x6A) EMIT(_cs) /* push _cs */ \
|
|
EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) /* call $+5 */ \
|
|
EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(5) /* add dword [esp], 5 */ \
|
|
EMIT(0xCB) /* retf */ \
|
|
}
|
|
|
|
#define X64_End_with_CS(_cs) \
|
|
{ \
|
|
EMIT(0xE8) EMIT(0) EMIT(0) EMIT(0) EMIT(0) /* call $+5 */ \
|
|
EMIT(0xC7) EMIT(0x44) EMIT(0x24) EMIT(4) EMIT(_cs) EMIT(0) EMIT(0) EMIT(0) /* mov dword [rsp + 4], _cs */ \
|
|
EMIT(0x83) EMIT(4) EMIT(0x24) EMIT(0xD) /* add dword [rsp], 0xD */ \
|
|
EMIT(0xCB) /* retf */ \
|
|
}
|
|
|
|
#define X64_Start() X64_Start_with_CS(0x33)
|
|
#define X64_End() X64_End_with_CS(0x23)
|
|
|
|
#define _RAX 0
|
|
#define _RCX 1
|
|
#define _RDX 2
|
|
#define _RBX 3
|
|
#define _RSP 4
|
|
#define _RBP 5
|
|
#define _RSI 6
|
|
#define _RDI 7
|
|
#define _R8 8
|
|
#define _R9 9
|
|
#define _R10 10
|
|
#define _R11 11
|
|
#define _R12 12
|
|
#define _R13 13
|
|
#define _R14 14
|
|
#define _R15 15
|
|
|
|
#define X64_Push(r) EMIT(0x48 | ((r) >> 3)) EMIT(0x50 | ((r) & 7))
|
|
#define X64_Pop(r) EMIT(0x48 | ((r) >> 3)) EMIT(0x58 | ((r) & 7))
|
|
|
|
#define REX_W EMIT(0x48) __asm
|
|
|
|
//to fool M$ inline asm compiler I'm using 2 DWORDs instead of DWORD64
|
|
//use of DWORD64 will generate wrong 'pop word ptr[]' and it will break stack
|
|
union reg64
|
|
{
|
|
DWORD64 v;
|
|
DWORD dw[2];
|
|
};
|