extensions/bintools/CallWrapper.cpp
changeset 2504 74fea7db93e4
parent 2289 44045ead61cd
child 2714 f9b9ae8234f0
     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 +}