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
|
// CPPVmtRank.cpp : dynamically obtain VMTRank from a pointer to a virtual method
#define __Meth(N) virtual int DummyMethod##N() { return 0x##N; }
#define __MethX(N) __Meth(N##0) __Meth(N##1) __Meth(N##2) __Meth(N##3) \
__Meth(N##4) __Meth(N##5) __Meth(N##6) __Meth(N##7) \
__Meth(N##8) __Meth(N##9) __Meth(N##A) __Meth(N##B) \
__Meth(N##C) __Meth(N##D) __Meth(N##E) __Meth(N##F)
#define __MethXX(N) __MethX(N##0) __MethX(N##1) __MethX(N##2) __MethX(N##3) \
__MethX(N##4) __MethX(N##5) __MethX(N##6) __MethX(N##7) \
__MethX(N##8) __MethX(N##9) __MethX(N##A) __MethX(N##B) \
__MethX(N##C) __MethX(N##D) __MethX(N##E) __MethX(N##F)
class DummyClass {
public:
__MethXX(0) __MethXX(1) __MethXX(2) __MethXX(3)
__MethXX(4) __MethXX(5) __MethXX(6) __MethXX(7)
__MethXX(8) __MethXX(9) __MethXX(a) __MethXX(b)
__MethXX(c) __MethXX(d) __MethXX(e) __MethXX(f)
///4096 DummyMethods
};
DummyClass dummyObj;
class A {
public:
virtual void Meth0();
virtual void Meth1();
virtual void Meth2();
virtual void Meth3();
virtual void Meth4();
virtual void Meth5();
virtual void Meth6();
};
template <typename T> int GetVMTRank(T t) {
int (DummyClass::*methPtr)();
*(void**)&methPtr = *(void**)&t;
return (dummyObj.*methPtr)();
}
int main() {
int Meth0_VMTRank = GetVMTRank(&A::Meth0);
int Meth6_VMTRank = GetVMTRank(&A::Meth6);
} |
Partager