1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include "stdafx.h"
#ifdef X86
int callFn(const void *fnPtr, int p) {
Nat oldEsi = 0xDEADBEEF, oldEdi = 0xFEBA1298, oldEbx = 0x81732A98, oldEbp;
Nat newEsi, newEdi, newEbx, newEbp;
int rv;
__asm {
mov edi, oldEdi;
mov esi, oldEsi;
mov ebx, oldEbx;
mov oldEbp, ebp;
push p;
call fnPtr;
add esp, 4;
mov rv, eax;
mov newEbp, ebp;
mov newEbx, ebx;
mov newEsi, esi;
mov newEdi, edi;
}
assert(oldEbp == newEbp);
assert(oldEbx == newEbx);
assert(oldEsi == newEsi);
assert(oldEdi == newEdi);
return rv;
}
int64 callFn(const void *fnPtr, int64 p) {
Nat oldEsi = 0xDEADBEEF, oldEdi = 0xFEBA1298, oldEbx = 0x81732A98, oldEbp;
Nat newEsi, newEdi, newEbx, newEbp;
int ph = p >> 32;
int pl = p & 0xFFFFFFFF;
nat rvh;
nat rvl;
__asm {
mov edi, oldEdi;
mov esi, oldEsi;
mov ebx, oldEbx;
mov oldEbp, ebp;
push ph;
push pl;
call fnPtr;
add esp, 8;
mov rvl, eax;
mov rvh, edx;
mov newEbp, ebp;
mov newEbx, ebx;
mov newEsi, esi;
mov newEdi, edi;
}
assert(oldEbp == newEbp);
assert(oldEbx == newEbx);
assert(oldEsi == newEsi);
assert(oldEdi == newEdi);
nat64 r = (nat64(rvh) << 32) | nat64(rvl);
return r;
}
#elif (defined(X64) || defined(ARM64))
#include "CheckCall64.h"
int callFn(const void *fnPtr, int p) {
Reg64 before = defaultReg64();
Reg64 after = defaultReg64();
int result = (int)checkCall(fnPtr, p, &after);
if (!(before == after))
throw AssertionException(WIDEN(__FILE__), __LINE__, L"before == after", ::toS(before) + L" <=> " + ::toS(after));
return result;
}
int64 callFn(const void *fnPtr, int64 p) {
Reg64 before = defaultReg64();
Reg64 after = defaultReg64();
size_t result = checkCall(fnPtr, p, &after);
if (!(before == after))
throw AssertionException(WIDEN(__FILE__), __LINE__, L"before == after", ::toS(before) + L" <=> " + ::toS(after));
return result;
}
#endif
|