1.1 --- a/extensions/bintools/CallWrapper.cpp Wed Jan 07 22:55:40 2009 -0500
1.2 +++ b/extensions/bintools/CallWrapper.cpp Thu Jan 08 18:17:17 2009 +1300
1.3 @@ -31,40 +31,46 @@
1.4
1.5 #include "extension.h"
1.6 #include "CallWrapper.h"
1.7 +#include "CallMaker.h"
1.8
1.9 -CallWrapper::CallWrapper(CallConvention cv, const PassInfo *paramInfo, const PassInfo *retInfo, unsigned int numParams)
1.10 +CallWrapper::CallWrapper(const SourceHook::ProtoInfo *protoInfo)
1.11 {
1.12 - m_Cv = cv;
1.13 + m_AddrCodeBase = NULL;
1.14 + m_AddrCallee = NULL;
1.15 +
1.16 + unsigned int argnum = protoInfo->numOfParams;
1.17
1.18 - if (numParams)
1.19 + m_Info = *protoInfo;
1.20 + m_Info.paramsPassInfo = new SourceHook::PassInfo[argnum + 1];
1.21 + memcpy((void *)m_Info.paramsPassInfo, protoInfo->paramsPassInfo, sizeof(SourceHook::PassInfo) * (argnum+1));
1.22 +
1.23 + if (argnum)
1.24 {
1.25 - m_Params = new PassEncode[numParams];
1.26 - for (size_t i=0; i<numParams; i++)
1.27 + m_Params = new PassEncode[argnum];
1.28 + for (size_t i=0; i<argnum; i++)
1.29 {
1.30 - m_Params[i].info = paramInfo[i];
1.31 + GetSMPassInfo(&(m_Params[i].info), &(m_Info.paramsPassInfo[i+1]));
1.32 }
1.33 } else {
1.34 m_Params = NULL;
1.35 }
1.36
1.37 - if (retInfo)
1.38 + if (m_Info.retPassInfo.size != 0)
1.39 {
1.40 m_RetParam = new PassInfo;
1.41 - *m_RetParam = *retInfo;
1.42 + GetSMPassInfo(m_RetParam, &(m_Info.retPassInfo));
1.43 } else {
1.44 m_RetParam = NULL;
1.45 }
1.46
1.47 - m_NumParams = numParams;
1.48 -
1.49 /* Calculate virtual stack offsets for each parameter */
1.50 size_t offs = 0;
1.51
1.52 - if (cv == CallConv_ThisCall)
1.53 + if (m_Info.convention == SourceHook::ProtoInfo::CallConv_ThisCall)
1.54 {
1.55 offs += sizeof(void *);
1.56 }
1.57 - for (size_t i=0; i<numParams; i++)
1.58 + for (size_t i=0; i<argnum; i++)
1.59 {
1.60 m_Params[i].offset = offs;
1.61 offs += m_Params[i].info.size;
1.62 @@ -75,22 +81,34 @@
1.63 {
1.64 delete [] m_Params;
1.65 delete m_RetParam;
1.66 - g_SPEngine->FreePageMemory(m_Addrs[ADDR_CODEBASE]);
1.67 + delete [] m_Info.paramsPassInfo;
1.68 }
1.69
1.70 void CallWrapper::Destroy()
1.71 {
1.72 + if (m_AddrCodeBase != NULL)
1.73 + {
1.74 + g_SPEngine->FreePageMemory(m_AddrCodeBase);
1.75 + m_AddrCodeBase = NULL;
1.76 + }
1.77 +
1.78 delete this;
1.79 }
1.80
1.81 CallConvention CallWrapper::GetCallConvention()
1.82 {
1.83 - return m_Cv;
1.84 + /* Need to convert to a SourceMod convention for bcompat */
1.85 + return GetSMCallConvention((SourceHook::ProtoInfo::CallConvention)m_Info.convention);
1.86 }
1.87
1.88 const PassEncode *CallWrapper::GetParamInfo(unsigned int num)
1.89 {
1.90 - return (num+1 > m_NumParams) ? NULL : &m_Params[num];
1.91 + if (num + 1 > GetParamCount() || num < 0)
1.92 + {
1.93 + return NULL;
1.94 + }
1.95 +
1.96 + return &m_Params[num];
1.97 }
1.98
1.99 const PassInfo *CallWrapper::GetReturnInfo()
1.100 @@ -100,12 +118,69 @@
1.101
1.102 unsigned int CallWrapper::GetParamCount()
1.103 {
1.104 - return m_NumParams;
1.105 + return m_Info.numOfParams;
1.106 }
1.107
1.108 void CallWrapper::Execute(void *vParamStack, void *retBuffer)
1.109 {
1.110 typedef void (*CALL_EXECUTE)(void *, void *);
1.111 - CALL_EXECUTE fn = (CALL_EXECUTE)m_Addrs[ADDR_CODEBASE];
1.112 + CALL_EXECUTE fn = (CALL_EXECUTE)GetCodeBaseAddr();
1.113 fn(vParamStack, retBuffer);
1.114 }
1.115 +
1.116 +void CallWrapper::SetMemFuncInfo(const SourceHook::MemFuncInfo *funcInfo)
1.117 +{
1.118 + m_FuncInfo = *funcInfo;
1.119 +}
1.120 +
1.121 +SourceHook::MemFuncInfo *CallWrapper::GetMemFuncInfo()
1.122 +{
1.123 + return &m_FuncInfo;
1.124 +}
1.125 +
1.126 +void CallWrapper::SetCalleeAddr(void *addr)
1.127 +{
1.128 + m_AddrCallee = addr;
1.129 +}
1.130 +
1.131 +void CallWrapper::SetCodeBaseAddr(void *addr)
1.132 +{
1.133 + m_AddrCodeBase = addr;
1.134 +}
1.135 +
1.136 +void *CallWrapper::GetCalleeAddr()
1.137 +{
1.138 + return m_AddrCallee;
1.139 +}
1.140 +
1.141 +void *CallWrapper::GetCodeBaseAddr()
1.142 +{
1.143 + return m_AddrCodeBase;
1.144 +}
1.145 +
1.146 +const SourceHook::PassInfo *CallWrapper::GetSHReturnInfo()
1.147 +{
1.148 + return &(m_Info.retPassInfo);
1.149 +}
1.150 +
1.151 +SourceHook::ProtoInfo::CallConvention CallWrapper::GetSHCallConvention()
1.152 +{
1.153 + return (SourceHook::ProtoInfo::CallConvention)m_Info.convention;
1.154 +}
1.155 +
1.156 +const SourceHook::PassInfo * CallWrapper::GetSHParamInfo(unsigned int num)
1.157 +{
1.158 + if (num + 1 > GetParamCount() || num < 0)
1.159 + {
1.160 + return NULL;
1.161 + }
1.162 +
1.163 + return &(m_Info.paramsPassInfo[num+1]);
1.164 +}
1.165 +
1.166 +unsigned int CallWrapper::GetParamOffset(unsigned int num)
1.167 +{
1.168 + assert(num <= GetParamCount() && num > 0);
1.169 +
1.170 + return m_Params[num].offset;
1.171 +}