3232// ============================================================================
3333// DynamicHooks
3434#include " convention.h"
35+ #include " conventions/x86MsCdecl.h"
36+ #include " conventions/x86MsThiscall.h"
37+ #include " conventions/x86MsStdcall.h"
38+ #include " conventions/x86GccCdecl.h"
39+ #include " conventions/x86GccThiscall.h"
40+
41+ // Memory
42+ #include " memory_function.h"
3543
3644// Utilities
3745#include " memory_utilities.h"
@@ -48,14 +56,55 @@ using namespace boost::python;
4856class ICallingConventionWrapper : public ICallingConvention , public wrapper <ICallingConvention>
4957{
5058public:
51- ICallingConventionWrapper (object oArgTypes, DataType_t returnType, int iAlignment=4 )
59+ ICallingConventionWrapper (object oArgTypes, DataType_t returnType, int iAlignment=4 , Convention_t eDefaultConv= CONV_CUSTOM )
5260 :ICallingConvention(ObjectToDataTypeVector(oArgTypes), returnType, iAlignment)
5361 {
62+ #ifdef _WIN32
63+ switch (eDefaultConv)
64+ {
65+ case CONV_CUSTOM :
66+ break ;
67+ case CONV_CDECL :
68+ m_pCallingConvention = new x86MsCdecl (m_vecArgTypes, m_returnType, m_iAlignment);
69+ break ;
70+ case CONV_THISCALL :
71+ m_pCallingConvention = new x86MsThiscall (m_vecArgTypes, m_returnType, m_iAlignment);
72+ break ;
73+ case CONV_STDCALL :
74+ m_pCallingConvention = new x86MsStdcall (m_vecArgTypes, m_returnType, m_iAlignment);
75+ break ;
76+ default :
77+ BOOST_RAISE_EXCEPTION (PyExc_ValueError, " Unsupported calling convention." )
78+ }
79+ #else
80+ switch (eDefaultConv)
81+ {
82+ case CONV_CUSTOM :
83+ break ;
84+ case CONV_CDECL :
85+ m_pCallingConvention = new x86GccCdecl (m_vecArgTypes, m_returnType, m_iAlignment);
86+ break ;
87+ case CONV_THISCALL :
88+ m_pCallingConvention = new x86GccThiscall (m_vecArgTypes, m_returnType, m_iAlignment);
89+ break ;
90+ default :
91+ BOOST_RAISE_EXCEPTION (PyExc_ValueError, " Unsupported calling convention." )
92+ }
93+ #endif
94+ }
95+
96+ ~ICallingConventionWrapper ()
97+ {
98+ delete m_pCallingConvention;
99+ m_pCallingConvention = nullptr ;
54100 }
55101
56102 virtual std::list<Register_t> GetRegisters ()
57103 {
58104 override get_registers = get_override (" get_registers" );
105+ if (!get_registers && m_pCallingConvention) {
106+ return m_pCallingConvention->GetRegisters ();
107+ }
59108 CHECK_OVERRIDE (get_registers);
60109
61110 object registers = get_registers ();
@@ -71,47 +120,60 @@ class ICallingConventionWrapper: public ICallingConvention, public wrapper<ICall
71120 virtual int GetPopSize ()
72121 {
73122 override get_pop_size = get_override (" get_pop_size" );
123+ if (!get_pop_size && m_pCallingConvention) {
124+ return m_pCallingConvention->GetPopSize ();
125+ }
74126 CHECK_OVERRIDE (get_pop_size);
127+
75128 return get_pop_size ();
76129 }
77-
78- virtual void * GetArgumentPtr (int iIndex, CRegisters* pRegisters)
79- {
80- CPointer* ptr = extract<CPointer*>(GetArgumentPtrWrapper (iIndex, pRegisters));
81- return (void *) ptr->m_ulAddr ;
82- }
83130
84- object GetArgumentPtrWrapper (int iIndex, CRegisters* pRegisters)
131+ virtual void * GetArgumentPtr (int iIndex, CRegisters* pRegisters)
85132 {
86133 override get_argument_ptr = get_override (" get_argument_ptr" );
134+ if (!get_argument_ptr && m_pCallingConvention) {
135+ return m_pCallingConvention->GetArgumentPtr (iIndex, pRegisters);
136+ }
87137 CHECK_OVERRIDE (get_argument_ptr);
88- return get_argument_ptr (iIndex, ptr (pRegisters));
138+
139+ object argument_ptr = get_argument_ptr (iIndex, ptr (pRegisters));
140+ CPointer* _ptr = extract<CPointer*>(argument_ptr);
141+ return (void *) _ptr->m_ulAddr ;
89142 }
90143
91144 virtual void ArgumentPtrChanged (int iIndex, CRegisters* pRegisters, void * pArgumentPtr)
92145 {
93146 override argument_ptr_changed = get_override (" argument_ptr_changed" );
147+ if (!argument_ptr_changed && m_pCallingConvention) {
148+ m_pCallingConvention->ArgumentPtrChanged (iIndex, pRegisters, pArgumentPtr);
149+ return ;
150+ }
94151 CHECK_OVERRIDE (argument_ptr_changed);
95152 argument_ptr_changed (iIndex, ptr (pRegisters), CPointer ((unsigned long ) pArgumentPtr));
96153 }
97154
98155 virtual void * GetReturnPtr (CRegisters* pRegisters)
99- {
100- CPointer* ptr = extract<CPointer*>(GetReturnPtrWrapper (pRegisters));
101- return (void *) ptr->m_ulAddr ;
102- }
103-
104- object GetReturnPtrWrapper (CRegisters* pRegisters)
105156 {
106157 override get_return_ptr = get_override (" get_return_ptr" );
107- CHECK_OVERRIDE (get_return_ptr);
108- return get_return_ptr (ptr (pRegisters));
158+ if (!get_return_ptr && m_pCallingConvention) {
159+ return m_pCallingConvention->GetReturnPtr (pRegisters);
160+ }
161+ CHECK_OVERRIDE (get_return_ptr)
162+
163+ object return_ptr = get_return_ptr (ptr (pRegisters));
164+ CPointer* _ptr = extract<CPointer*>(return_ptr);
165+ return (void *) _ptr->m_ulAddr ;
109166 }
110167
111168 virtual void ReturnPtrChanged (CRegisters* pRegisters, void * pReturnPtr)
112169 {
113170 override return_ptr_changed = get_override (" return_ptr_changed" );
171+ if (!return_ptr_changed && m_pCallingConvention) {
172+ m_pCallingConvention->ReturnPtrChanged (pRegisters, pReturnPtr);
173+ return ;
174+ }
114175 CHECK_OVERRIDE (return_ptr_changed);
176+
115177 return_ptr_changed (ptr (pRegisters), CPointer ((unsigned long ) pReturnPtr));
116178 }
117179
@@ -125,6 +187,9 @@ class ICallingConventionWrapper: public ICallingConvention, public wrapper<ICall
125187
126188 return tuple (argumentTypes);
127189 }
190+
191+ public:
192+ ICallingConvention* m_pCallingConvention = nullptr ;
128193};
129194
130195
0 commit comments