Update
This commit is contained in:
		
							parent
							
								
									2f38de616e
								
							
						
					
					
						commit
						61c887f042
					
				
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @ -19,12 +19,12 @@ MMSOURCE19 = ../mmsource-1.9 | |||||||
| ### EDIT BELOW FOR OTHER PROJECTS ###
 | ### EDIT BELOW FOR OTHER PROJECTS ###
 | ||||||
| #####################################
 | #####################################
 | ||||||
| 
 | 
 | ||||||
| PROJECT = sample | PROJECT = dhooks | ||||||
| 
 | 
 | ||||||
| #Uncomment for Metamod: Source enabled extension
 | #Uncomment for Metamod: Source enabled extension
 | ||||||
| USEMETA = true | USEMETA = true | ||||||
| 
 | 
 | ||||||
| OBJECTS = sdk/smsdk_ext.cpp extension.cpp vhook.cpp ../sourcemod-central/public/jit/x86/assembler-x86.cpp | OBJECTS = sdk/smsdk_ext.cpp extension.cpp vhook.cpp $(SMSDK)/public/jit/x86/assembler-x86.cpp listeners.cpp natives.cpp vfunc_call.cpp | ||||||
| 
 | 
 | ||||||
| ##############################################
 | ##############################################
 | ||||||
| ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
 | ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
 | ||||||
|  | |||||||
| @ -53,7 +53,6 @@ void DHooksEntityListener::OnEntityDestroyed(CBaseEntity *pEntity) | |||||||
| 		DHooksManager *manager = g_pHooks.Element(i); | 		DHooksManager *manager = g_pHooks.Element(i); | ||||||
| 		if(manager->callback->entity == entity) | 		if(manager->callback->entity == entity) | ||||||
| 		{ | 		{ | ||||||
| 			META_CONPRINT("Removing 1\n"); |  | ||||||
| 			delete manager; | 			delete manager; | ||||||
| 			g_pHooks.Remove(i); | 			g_pHooks.Remove(i); | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -886,6 +886,7 @@ | |||||||
|     <ClCompile Include="..\extension.cpp" /> |     <ClCompile Include="..\extension.cpp" /> | ||||||
|     <ClCompile Include="..\listeners.cpp" /> |     <ClCompile Include="..\listeners.cpp" /> | ||||||
|     <ClCompile Include="..\natives.cpp" /> |     <ClCompile Include="..\natives.cpp" /> | ||||||
|  |     <ClCompile Include="..\vfunc_call.cpp" /> | ||||||
|     <ClCompile Include="..\vhook.cpp" /> |     <ClCompile Include="..\vhook.cpp" /> | ||||||
|     <ClCompile Include="..\sdk\smsdk_ext.cpp" /> |     <ClCompile Include="..\sdk\smsdk_ext.cpp" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| @ -893,6 +894,7 @@ | |||||||
|     <ClInclude Include="..\extension.h" /> |     <ClInclude Include="..\extension.h" /> | ||||||
|     <ClInclude Include="..\listeners.h" /> |     <ClInclude Include="..\listeners.h" /> | ||||||
|     <ClInclude Include="..\natives.h" /> |     <ClInclude Include="..\natives.h" /> | ||||||
|  |     <ClInclude Include="..\vfunc_call.h" /> | ||||||
|     <ClInclude Include="..\vhook.h" /> |     <ClInclude Include="..\vhook.h" /> | ||||||
|     <ClInclude Include="..\sdk\smsdk_config.h" /> |     <ClInclude Include="..\sdk\smsdk_config.h" /> | ||||||
|     <ClInclude Include="..\sdk\smsdk_ext.h" /> |     <ClInclude Include="..\sdk\smsdk_ext.h" /> | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ | |||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\natives.cpp" /> |     <ClCompile Include="..\natives.cpp" /> | ||||||
|     <ClCompile Include="..\listeners.cpp" /> |     <ClCompile Include="..\listeners.cpp" /> | ||||||
|  |     <ClCompile Include="..\vfunc_call.cpp" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\extension.h"> |     <ClInclude Include="..\extension.h"> | ||||||
| @ -34,6 +35,9 @@ | |||||||
|     <ClInclude Include="..\listeners.h"> |     <ClInclude Include="..\listeners.h"> | ||||||
|       <Filter>Headers</Filter> |       <Filter>Headers</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\vfunc_call.h"> | ||||||
|  |       <Filter>Headers</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Filter Include="Headers"> |     <Filter Include="Headers"> | ||||||
|  | |||||||
							
								
								
									
										122
									
								
								natives.cpp
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								natives.cpp
									
									
									
									
									
								
							| @ -93,9 +93,10 @@ cell_t Native_HookEntity(IPluginContext *pContext, const cell_t *params) | |||||||
| 
 | 
 | ||||||
| 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | ||||||
| 	{ | 	{ | ||||||
| 		if(g_pHooks.Element(i)->callback->hookType == HookType_Entity && g_pHooks.Element(i)->callback->entity == params[3] && g_pHooks.Element(i)->callback->offset == setup->offset && g_pHooks.Element(i)->callback->post == post && g_pHooks.Element(i)->remove_callback == pContext->GetFunctionById(params[4]) && g_pHooks.Element(i)->callback->plugin_callback == setup->callback) | 		DHooksManager *manager = g_pHooks.Element(i); | ||||||
|  | 		if(manager->callback->hookType == HookType_Entity && manager->callback->entity == params[3] && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[4]) && manager->callback->plugin_callback == setup->callback) | ||||||
| 		{ | 		{ | ||||||
| 			return g_pHooks.Element(i)->hookid; | 			return manager->hookid; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	CBaseEntity *pEnt = UTIL_GetCBaseEntity(params[3]); | 	CBaseEntity *pEnt = UTIL_GetCBaseEntity(params[3]); | ||||||
| @ -134,7 +135,7 @@ cell_t Native_GetParam(IPluginContext *pContext, const cell_t *params) | |||||||
| 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(params[2] > paramStruct->dg->params.Count() || params[2] < 0) | 	if(params[2] < 0 || params[2] > paramStruct->dg->params.Count()) | ||||||
| 	{ | 	{ | ||||||
| 		return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); | 		return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); | ||||||
| 	} | 	} | ||||||
| @ -170,10 +171,89 @@ cell_t Native_GetParam(IPluginContext *pContext, const cell_t *params) | |||||||
| } | } | ||||||
| cell_t Native_GetReturn(IPluginContext *pContext, const cell_t *params) | cell_t Native_GetReturn(IPluginContext *pContext, const cell_t *params) | ||||||
| { | { | ||||||
|  | 	if(params[1] == BAD_HANDLE) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	HandleError err; | ||||||
|  | 	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); | ||||||
|  | 	HookReturnStruct *returnStruct; | ||||||
|  | 
 | ||||||
|  | 	if((err = handlesys->ReadHandle(params[1], g_HookReturnHandle, &sec, (void **)&returnStruct)) != HandleError_None) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch(returnStruct->type) | ||||||
|  | 	{ | ||||||
|  | 		case ReturnType_Int: | ||||||
|  | 			return *(int *)returnStruct->orgResult; | ||||||
|  | 		case ReturnType_Bool: | ||||||
|  | 			return *(cell_t *)returnStruct->orgResult; | ||||||
|  | 		case ReturnType_CBaseEntity: | ||||||
|  | 			return gamehelpers->EntityToBCompatRef((CBaseEntity *)returnStruct->orgResult); | ||||||
|  | 		case ReturnType_Edict: | ||||||
|  | 			return gamehelpers->IndexOfEdict((edict_t *)returnStruct->orgResult); | ||||||
|  | 		case ReturnType_Float: | ||||||
|  | 			return sp_ftoc(*(float *)returnStruct->orgResult); | ||||||
|  | 		default: | ||||||
|  | 			return pContext->ThrowNativeError("Invalid param type (%i) to get",returnStruct->type); | ||||||
|  | 	} | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| cell_t Native_SetReturn(IPluginContext *pContext, const cell_t *params) | cell_t Native_SetReturn(IPluginContext *pContext, const cell_t *params) | ||||||
| { | { | ||||||
|  | 	if(params[1] == BAD_HANDLE) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	HandleError err; | ||||||
|  | 	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); | ||||||
|  | 	HookReturnStruct *returnStruct; | ||||||
|  | 
 | ||||||
|  | 	if((err = handlesys->ReadHandle(params[1], g_HookReturnHandle, &sec, (void **)&returnStruct)) != HandleError_None) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	CBaseEntity *pEnt; | ||||||
|  | 	edict_t *pEdict; | ||||||
|  | 	float *fpVal; | ||||||
|  | 	switch(returnStruct->type) | ||||||
|  | 	{ | ||||||
|  | 		case ReturnType_Int: | ||||||
|  | 			returnStruct->newResult = (void *)((int)params[2]); | ||||||
|  | 			break; | ||||||
|  | 		case ReturnType_Bool: | ||||||
|  | 			returnStruct->newResult = (void *)(params[2] != 0); | ||||||
|  | 			break; | ||||||
|  | 		case ReturnType_CBaseEntity: | ||||||
|  | 			pEnt = UTIL_GetCBaseEntity(params[2]); | ||||||
|  | 			if(!pEnt) | ||||||
|  | 			{ | ||||||
|  | 				return pContext->ThrowNativeError("Invalid entity index passed for return value"); | ||||||
|  | 			} | ||||||
|  | 			returnStruct->newResult = pEnt; | ||||||
|  | 			break; | ||||||
|  | 		case ReturnType_Edict: | ||||||
|  | 			pEdict = gamehelpers->EdictOfIndex(params[2]); | ||||||
|  | 			if(!pEdict || pEdict->IsFree()) | ||||||
|  | 			{ | ||||||
|  | 				pContext->ThrowNativeError("Invalid entity index passed for return value"); | ||||||
|  | 			} | ||||||
|  | 			returnStruct->newResult = pEdict; | ||||||
|  | 			break; | ||||||
|  | 		case ReturnType_Float: | ||||||
|  | 			fpVal = new float; | ||||||
|  | 			*fpVal = sp_ctof(params[2]); | ||||||
|  | 			returnStruct->newResult = fpVal; | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			return pContext->ThrowNativeError("Invalid param type (%i) to get",returnStruct->type); | ||||||
|  | 	} | ||||||
|  | 	returnStruct->isChanged = true; | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| /*cell_t Native_SetParam(IPluginContext *pContext, const cell_t *params);
 | /*cell_t Native_SetParam(IPluginContext *pContext, const cell_t *params);
 | ||||||
| @ -196,7 +276,7 @@ cell_t Native_GetParamString(IPluginContext *pContext, const cell_t *params) | |||||||
| 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(params[2] > paramStruct->dg->params.Count() || params[2] <= 0) | 	if(params[2] <= 0 || params[2] > paramStruct->dg->params.Count()) | ||||||
| 	{ | 	{ | ||||||
| 		return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); | 		return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); | ||||||
| 	} | 	} | ||||||
| @ -216,8 +296,42 @@ cell_t Native_GetParamString(IPluginContext *pContext, const cell_t *params) | |||||||
| } | } | ||||||
| //cell_t Native_GetReturnString(IPluginContext *pContext, const cell_t *params);
 | //cell_t Native_GetReturnString(IPluginContext *pContext, const cell_t *params);
 | ||||||
| //cell_t Native_SetReturnString(IPluginContext *pContext, const cell_t *params);
 | //cell_t Native_SetReturnString(IPluginContext *pContext, const cell_t *params);
 | ||||||
|  | 
 | ||||||
|  | //native DHookSetParamString(Handle:hParams, num, String:value[])
 | ||||||
| cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) | cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) | ||||||
| { | { | ||||||
|  | 	if(params[1] == BAD_HANDLE) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	HandleError err; | ||||||
|  | 	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); | ||||||
|  | 	HookParamsStruct *paramStruct; | ||||||
|  | 	if((err = handlesys->ReadHandle(params[1], g_HookParamsHandle, &sec, (void **)¶mStruct)) != HandleError_None) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(params[2] <= 0 || params[2] > paramStruct->dg->params.Count()) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int index = params[2] - 1; | ||||||
|  | 
 | ||||||
|  | 	char *value; | ||||||
|  | 	pContext->LocalToString(params[3], &value); | ||||||
|  | 
 | ||||||
|  | 	if(paramStruct->dg->params.Element(index).type == HookParamType_CharPtr) | ||||||
|  | 	{ | ||||||
|  | 		if(paramStruct->newParams[index] != NULL) | ||||||
|  | 			delete (char *)paramStruct->newParams[index]; | ||||||
|  | 
 | ||||||
|  | 		paramStruct->newParams[index] = new char[strlen(value)+1]; | ||||||
|  | 		strcpy((char *)paramStruct->newParams[index], value); | ||||||
|  | 		paramStruct->isChanged[index] = true; | ||||||
|  | 	} | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										121
									
								
								vfunc_call.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								vfunc_call.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | |||||||
|  | #include "vfunc_call.h" | ||||||
|  | 
 | ||||||
|  | #define PARAMINFO_SWITCH(passType) \ | ||||||
|  | 		paramInfo[i].flags = dg->params.Element(i).flag; \ | ||||||
|  | 		paramInfo[i].size = dg->params.Element(i).size; \ | ||||||
|  | 		paramInfo[i].type = passType; | ||||||
|  | 
 | ||||||
|  | #define VSTK_PARAM_SWITCH(paramType) \ | ||||||
|  | 		if(paramStruct->isChanged[i]) \ | ||||||
|  | 		{ \ | ||||||
|  | 			*(paramType *)vptr = (paramType)(paramStruct->newParams[i]); \ | ||||||
|  | 		} \ | ||||||
|  | 		else \ | ||||||
|  | 		{ \ | ||||||
|  | 			*(paramType *)vptr = (paramType)(paramStruct->orgParams[i]); \ | ||||||
|  | 		} \ | ||||||
|  | 		if(i + 1 != dg->params.Count()) \ | ||||||
|  | 		{ \ | ||||||
|  | 			vptr += dg->params.Element(i).size; \ | ||||||
|  | 		} \ | ||||||
|  | 		break; | ||||||
|  | #define VSTK_PARAM_SWITCH_FLOAT() \ | ||||||
|  | 		if(paramStruct->isChanged[i]) \ | ||||||
|  | 		{ \ | ||||||
|  | 			*(float *)vptr = *(float *)(paramStruct->newParams[i]); \ | ||||||
|  | 		} \ | ||||||
|  | 		else \ | ||||||
|  | 		{ \ | ||||||
|  | 			*(float *)vptr = *(float *)(paramStruct->orgParams[i]); \ | ||||||
|  | 		} \ | ||||||
|  | 		if(i + 1 != dg->params.Count()) \ | ||||||
|  | 		{ \ | ||||||
|  | 			vptr += dg->params.Element(i).size; \ | ||||||
|  | 		} \ | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | void *CallVFunction(DHooksCallback *dg, HookParamsStruct *paramStruct, void *iface) | ||||||
|  | { | ||||||
|  | 	PassInfo *paramInfo = NULL; | ||||||
|  | 	PassInfo returnInfo; | ||||||
|  | 
 | ||||||
|  | 	if(dg->returnType != ReturnType_Void) | ||||||
|  | 	{ | ||||||
|  | 		returnInfo.flags = dg->returnFlag; | ||||||
|  | 		returnInfo.size = sizeof(void *); | ||||||
|  | 		returnInfo.type = PassType_Basic; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ICallWrapper *pCall; | ||||||
|  | 
 | ||||||
|  | 	size_t size = GetStackArgsSize(dg); | ||||||
|  | 
 | ||||||
|  | 	unsigned char *vstk = (unsigned char *)malloc(sizeof(void *) + size); | ||||||
|  | 	unsigned char *vptr = vstk; | ||||||
|  | 
 | ||||||
|  |     *(void **)vptr = iface; | ||||||
|  | 
 | ||||||
|  | 	if(paramStruct) | ||||||
|  | 	{ | ||||||
|  | 		vptr += sizeof(void *); | ||||||
|  | 		paramInfo = (PassInfo *)malloc(sizeof(PassInfo) * dg->params.Count()); | ||||||
|  | 		for(int i = 0; i < dg->params.Count(); i++) | ||||||
|  | 		{ | ||||||
|  | 			switch(dg->params.Element(i).type) | ||||||
|  | 			{ | ||||||
|  | 				case HookParamType_Int: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(int); | ||||||
|  | 				case HookParamType_Bool: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(cell_t); | ||||||
|  | 				case HookParamType_Float: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Float); | ||||||
|  | 					VSTK_PARAM_SWITCH_FLOAT(); | ||||||
|  | 				case HookParamType_String: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Object); | ||||||
|  | 					VSTK_PARAM_SWITCH(int); | ||||||
|  | 				case HookParamType_StringPtr: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(string_t *); | ||||||
|  | 				case HookParamType_CharPtr: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(char *); | ||||||
|  | 				case HookParamType_VectorPtr: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(Vector *); | ||||||
|  | 				case HookParamType_CBaseEntity: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(CBaseEntity *); | ||||||
|  | 				case HookParamType_Edict: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(edict_t *); | ||||||
|  | 				default: | ||||||
|  | 					PARAMINFO_SWITCH(PassType_Basic); | ||||||
|  | 					VSTK_PARAM_SWITCH(void *); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void *ret = 0; | ||||||
|  | 	if(dg->returnType == ReturnType_Void) | ||||||
|  | 	{ | ||||||
|  | 		pCall = g_pBinTools->CreateVCall(dg->offset, 0, 0, NULL, paramInfo, dg->params.Count()); | ||||||
|  | 		pCall->Execute(vstk, NULL); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		pCall = g_pBinTools->CreateVCall(dg->offset, 0, 0, &returnInfo, paramInfo, dg->params.Count()); | ||||||
|  | 		pCall->Execute(vstk, &ret); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pCall->Destroy(); | ||||||
|  | 	free(vstk); | ||||||
|  | 
 | ||||||
|  | 	if(paramInfo != NULL) | ||||||
|  | 	{ | ||||||
|  | 		free(paramInfo); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								vfunc_call.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								vfunc_call.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | #ifndef _INCLUDE_VFUNC_CALL_H_ | ||||||
|  | #define _INCLUDE_VFUNC_CALL_H_ | ||||||
|  | 
 | ||||||
|  | #include "vhook.h" | ||||||
|  | 
 | ||||||
|  | void *CallVFunction(DHooksCallback *dg, HookParamsStruct *paramStruct, void *iface); | ||||||
|  | #endif | ||||||
							
								
								
									
										106
									
								
								vhook.cpp
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								vhook.cpp
									
									
									
									
									
								
							| @ -1,4 +1,5 @@ | |||||||
| #include "vhook.h" | #include "vhook.h" | ||||||
|  | #include "vfunc_call.h" | ||||||
| 
 | 
 | ||||||
| SourceHook::IHookManagerAutoGen *g_pHookManager = NULL; | SourceHook::IHookManagerAutoGen *g_pHookManager = NULL; | ||||||
| 
 | 
 | ||||||
| @ -39,13 +40,9 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem | |||||||
| 	{ | 	{ | ||||||
| 		protoInfo.SetReturnType(0, SourceHook::PassInfo::PassType_Unknown, 0, NULL, NULL, NULL, NULL); | 		protoInfo.SetReturnType(0, SourceHook::PassInfo::PassType_Unknown, 0, NULL, NULL, NULL, NULL); | ||||||
| 	} | 	} | ||||||
| 	else if(this->callback->returnType == ReturnType_Float) |  | ||||||
| 	{ |  | ||||||
| 		protoInfo.SetReturnType(sizeof(float), SourceHook::PassInfo::PassType_Float, 0, NULL, NULL, NULL, NULL); |  | ||||||
| 	} |  | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		protoInfo.SetReturnType(sizeof(void *), SourceHook::PassInfo::PassType_Basic, 0, NULL, NULL, NULL, NULL); | 		protoInfo.SetReturnType(sizeof(void *), SourceHook::PassInfo::PassType_Basic, setup->returnFlag, NULL, NULL, NULL, NULL); | ||||||
| 	} | 	} | ||||||
| 	HookManagerPubFunc hook = g_pHookManager->MakeHookMan(protoInfo, 0, this->callback->offset); | 	HookManagerPubFunc hook = g_pHookManager->MakeHookMan(protoInfo, 0, this->callback->offset); | ||||||
| 
 | 
 | ||||||
| @ -82,10 +79,9 @@ SourceHook::PassInfo::PassType GetParamTypePassType(HookParamType type) | |||||||
| 	switch(type) | 	switch(type) | ||||||
| 	{ | 	{ | ||||||
| 		case HookParamType_Float: | 		case HookParamType_Float: | ||||||
| 			return SourceHook::PassInfo::PassType::PassType_Float; | 			return SourceHook::PassInfo::PassType_Float; | ||||||
| 		default: |  | ||||||
| 			return SourceHook::PassInfo::PassType::PassType_Basic; |  | ||||||
| 	} | 	} | ||||||
|  | 	return SourceHook::PassInfo::PassType_Basic; | ||||||
| } | } | ||||||
| size_t GetStackArgsSize(DHooksCallback *dg) | size_t GetStackArgsSize(DHooksCallback *dg) | ||||||
| { | { | ||||||
| @ -102,10 +98,12 @@ HookParamsStruct *GetParamStruct(DHooksCallback *dg, void **argStack, size_t arg | |||||||
| 	res->dg = dg; | 	res->dg = dg; | ||||||
| 	res->orgParams = (void **)malloc(argStackSize); | 	res->orgParams = (void **)malloc(argStackSize); | ||||||
| 	res->newParams = (void **)malloc(argStackSize); | 	res->newParams = (void **)malloc(argStackSize); | ||||||
|  | 	res->isChanged = (bool *)malloc(dg->params.Count() * sizeof(bool)); | ||||||
| 	memcpy(res->orgParams, argStack, argStackSize); | 	memcpy(res->orgParams, argStack, argStackSize); | ||||||
| 	for(int i = 0; i < dg->params.Count(); i++) | 	for(int i = 0; i < dg->params.Count(); i++) | ||||||
| 	{ | 	{ | ||||||
| 		res->newParams[i] = NULL; | 		res->newParams[i] = NULL; | ||||||
|  | 		res->isChanged[i] = false; | ||||||
| 	} | 	} | ||||||
| 	return res; | 	return res; | ||||||
| } | } | ||||||
| @ -114,8 +112,32 @@ HookReturnStruct *GetReturnStruct(DHooksCallback *dg, const void *result) | |||||||
| 	HookReturnStruct *res = new HookReturnStruct(); | 	HookReturnStruct *res = new HookReturnStruct(); | ||||||
| 	res->isChanged = false; | 	res->isChanged = false; | ||||||
| 	res->type = dg->returnType; | 	res->type = dg->returnType; | ||||||
| 	res->orgResult = &result; | 	res->newResult = NULL; | ||||||
| 	res->newResult = 0; | 
 | ||||||
|  | 	float *fpVal = NULL; | ||||||
|  | 
 | ||||||
|  | 	if(result && dg->post) | ||||||
|  | 	{ | ||||||
|  | 		switch(dg->returnType) | ||||||
|  | 		{ | ||||||
|  | 			//ReturnType_String,
 | ||||||
|  | 			//ReturnType_Vector,
 | ||||||
|  | 			case ReturnType_Int: | ||||||
|  | 			case ReturnType_Bool: | ||||||
|  | 				res->orgResult = (int *)result; | ||||||
|  | 				break; | ||||||
|  | 			case ReturnType_Float: | ||||||
|  | 				res->orgResult = new float; | ||||||
|  | 				*fpVal = *(float *)result; | ||||||
|  | 				res->orgResult = fpVal; | ||||||
|  | 			default: | ||||||
|  | 				res->orgResult = (void *)result; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		res->orgResult = NULL; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return res; | 	return res; | ||||||
| } | } | ||||||
| @ -128,15 +150,23 @@ cell_t GetThisPtr(void *iface, ThisPointerType type) | |||||||
| 
 | 
 | ||||||
| 	return (cell_t)iface; | 	return (cell_t)iface; | ||||||
| } | } | ||||||
|  | 
 | ||||||
| #ifndef __linux__ | #ifndef __linux__ | ||||||
| void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | ||||||
|  | #else | ||||||
|  | void *Callback(DHooksCallback *dg, void **argStack) | ||||||
|  | #endif | ||||||
| { | { | ||||||
| 	HookReturnStruct *returnStruct = NULL; | 	HookReturnStruct *returnStruct = NULL; | ||||||
| 	HookParamsStruct *paramStruct = NULL; | 	HookParamsStruct *paramStruct = NULL; | ||||||
| 	Handle_t rHndl; | 	Handle_t rHndl; | ||||||
| 	Handle_t pHndl; | 	Handle_t pHndl; | ||||||
| 
 | 
 | ||||||
|  | 	#ifndef __linux__ | ||||||
| 	*argsizep = GetStackArgsSize(dg); | 	*argsizep = GetStackArgsSize(dg); | ||||||
|  | 	#else | ||||||
|  | 	size_t argsize = GetStackArgsSize(dg); | ||||||
|  | 	#endif | ||||||
| 
 | 
 | ||||||
| 	if(dg->thisType == ThisPointer_CBaseEntity || dg->thisType == ThisPointer_Address) | 	if(dg->thisType == ThisPointer_CBaseEntity || dg->thisType == ThisPointer_Address) | ||||||
| 	{ | 	{ | ||||||
| @ -157,9 +187,16 @@ void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | |||||||
| 		} | 		} | ||||||
| 		dg->plugin_callback->PushCell(rHndl); | 		dg->plugin_callback->PushCell(rHndl); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	#ifndef __linux__ | ||||||
| 	if(*argsizep > 0) | 	if(*argsizep > 0) | ||||||
| 	{ | 	{ | ||||||
| 		paramStruct = GetParamStruct(dg, argStack, *argsizep); | 		paramStruct = GetParamStruct(dg, argStack, *argsizep); | ||||||
|  | 	#else | ||||||
|  | 	if(argsize > 0) | ||||||
|  | 	{ | ||||||
|  | 		paramStruct = GetParamStruct(dg, argStack, argsize); | ||||||
|  | 	#endif | ||||||
| 		pHndl = handlesys->CreateHandle(g_HookParamsHandle, paramStruct, dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->GetIdentity(), myself->GetIdentity(), NULL); | 		pHndl = handlesys->CreateHandle(g_HookParamsHandle, paramStruct, dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->GetIdentity(), myself->GetIdentity(), NULL); | ||||||
| 		if(!pHndl) | 		if(!pHndl) | ||||||
| 		{ | 		{ | ||||||
| @ -180,32 +217,24 @@ void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | |||||||
| 	dg->plugin_callback->Execute(&result); | 	dg->plugin_callback->Execute(&result); | ||||||
| 
 | 
 | ||||||
| 	void *ret = g_SHPtr->GetOverrideRetPtr(); | 	void *ret = g_SHPtr->GetOverrideRetPtr(); | ||||||
| 	void *res = 0; | 	ret = 0; | ||||||
| 
 |  | ||||||
| 	switch((MRESReturn)result) | 	switch((MRESReturn)result) | ||||||
| 	{ | 	{ | ||||||
| 		case MRES_Handled: | 		case MRES_Handled: | ||||||
| 		case MRES_ChangedHandled: | 		case MRES_ChangedHandled: | ||||||
| 			g_SHPtr->DoRecall(); | 			g_SHPtr->DoRecall(); | ||||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||||
| 			//ret = CallVFunction(dg, argStack, g_SHPtr->GetIfacePtr());
 | 			ret = CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||||
| 			memcpy(res, ret, sizeof(void *)); |  | ||||||
| 			break; | 			break; | ||||||
| 		case MRES_ChangedOverride: | 		case MRES_ChangedOverride: | ||||||
| 			g_SHPtr->DoRecall(); | 			g_SHPtr->DoRecall(); | ||||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||||
| 			//CallVFunction(dg, argStack, g_SHPtr->GetIfacePtr());
 | 			ret = CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||||
| 			if(dg->returnType != ReturnType_Void) | 			if(dg->returnType != ReturnType_Void) | ||||||
| 			{ | 			{ | ||||||
| 				if(returnStruct->isChanged) | 				if(returnStruct->isChanged) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy(ret, returnStruct->newResult, sizeof(void *)); | 					ret = returnStruct->newResult; | ||||||
| 					memcpy(res, returnStruct->newResult, sizeof(void *)); |  | ||||||
| 				} |  | ||||||
| 				else if(dg->post) |  | ||||||
| 				{ |  | ||||||
| 					memcpy(ret, returnStruct->orgResult, sizeof(void *)); |  | ||||||
| 					memcpy(res, returnStruct->orgResult, sizeof(void *)); |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| @ -215,13 +244,11 @@ void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | |||||||
| 			{ | 			{ | ||||||
| 				if(returnStruct->isChanged) | 				if(returnStruct->isChanged) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy(ret, returnStruct->newResult, sizeof(void *)); | 					ret = returnStruct->newResult; | ||||||
| 					memcpy(res, returnStruct->newResult, sizeof(void *)); |  | ||||||
| 				} | 				} | ||||||
| 				else if(dg->post) | 				else if(dg->post) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy(ret, returnStruct->orgResult, sizeof(void *)); | 					ret = (void *)returnStruct->orgResult; | ||||||
| 					memcpy(res, returnStruct->orgResult, sizeof(void *)); |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| @ -231,13 +258,11 @@ void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | |||||||
| 			{ | 			{ | ||||||
| 				if(returnStruct->isChanged) | 				if(returnStruct->isChanged) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy(ret, returnStruct->newResult, sizeof(void *)); | 					ret = returnStruct->newResult; | ||||||
| 					memcpy(res, returnStruct->newResult, sizeof(void *)); |  | ||||||
| 				} | 				} | ||||||
| 				else if(dg->post) | 				else if(dg->post) | ||||||
| 				{ | 				{ | ||||||
| 					memcpy(ret, returnStruct->orgResult, sizeof(void *)); | 					ret = returnStruct->orgResult; | ||||||
| 					memcpy(res, returnStruct->orgResult, sizeof(void *)); |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| @ -257,24 +282,5 @@ void *Callback(DHooksCallback *dg, void **argStack, size_t *argsizep) | |||||||
| 		handlesys->FreeHandle(pHndl, &sec); | 		handlesys->FreeHandle(pHndl, &sec); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return res; | 	return ret; | ||||||
| } | } | ||||||
| #else |  | ||||||
| void *Callback(DHooksCallback *dg, void **argStack) |  | ||||||
| { |  | ||||||
| 	if(dg->returnType == ReturnType_Void) |  | ||||||
| 	{ |  | ||||||
| 		META_CONPRINTF("String is %s\n", argStack[0]); |  | ||||||
| 		g_SHPtr->SetRes(MRES_IGNORED); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		//META_CONPRINTF("Entity %i\n", gamehelpers->ReferenceToIndex(gamehelpers->EntityToBCompatRef((CBaseEntity *)g_SHPtr->GetIfacePtr())));
 |  | ||||||
| 		g_SHPtr->SetRes(MRES_SUPERCEDE); |  | ||||||
| 		void *ret = g_SHPtr->GetOverrideRetPtr(); |  | ||||||
| 		ret = (void *)false; |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  | |||||||
							
								
								
									
										57
									
								
								vhook.h
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								vhook.h
									
									
									
									
									
								
							| @ -68,8 +68,32 @@ struct ParamInfo | |||||||
| 	SourceHook::PassInfo::PassType pass_type; | 	SourceHook::PassInfo::PassType pass_type; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct HookReturnStruct | class HookReturnStruct | ||||||
| { | { | ||||||
|  | public: | ||||||
|  | 	~HookReturnStruct() | ||||||
|  | 	{ | ||||||
|  | 		if(this->isChanged && this->newResult) | ||||||
|  | 		{ | ||||||
|  | 			if(this->type == ReturnType_CharPtr) | ||||||
|  | 			{ | ||||||
|  | 				delete (char *)this->newResult; | ||||||
|  | 			} | ||||||
|  | 			else if(this->type == ReturnType_VectorPtr) | ||||||
|  | 			{ | ||||||
|  | 				delete (Vector *)this->newResult; | ||||||
|  | 			} | ||||||
|  | 			else if(this->type == ReturnType_Float) | ||||||
|  | 			{ | ||||||
|  | 				if(this->orgResult) | ||||||
|  | 				{ | ||||||
|  | 					free(this->orgResult); | ||||||
|  | 				} | ||||||
|  | 				free(this->newResult); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | public: | ||||||
| 	ReturnType type; | 	ReturnType type; | ||||||
| 	bool isChanged; | 	bool isChanged; | ||||||
| 	void *orgResult; | 	void *orgResult; | ||||||
| @ -129,9 +153,9 @@ static void *GenerateThunk(ReturnType type) | |||||||
| 	masm.lea(eax, Operand(ebp, 12)); | 	masm.lea(eax, Operand(ebp, 12)); | ||||||
| 	masm.push(eax); | 	masm.push(eax); | ||||||
| 	masm.push(Operand(ebp, 8)); | 	masm.push(Operand(ebp, 8)); | ||||||
| 	if(type == ReturnType_Float) | 	/*if(type == ReturnType_Float)
 | ||||||
| 		masm.call(ExternalAddress((void *)Callback_float)); | 		masm.call(ExternalAddress((void *)Callback_float)); | ||||||
| 	else | 	else*/ | ||||||
| 		masm.call(ExternalAddress((void *)Callback)); | 		masm.call(ExternalAddress((void *)Callback)); | ||||||
| 	masm.addl(esp, 8); | 	masm.addl(esp, 8); | ||||||
| 	masm.pop(ebp); | 	masm.pop(ebp); | ||||||
| @ -191,22 +215,41 @@ public: | |||||||
| 		this->orgParams = NULL; | 		this->orgParams = NULL; | ||||||
| 		this->newParams = NULL; | 		this->newParams = NULL; | ||||||
| 		this->dg = NULL; | 		this->dg = NULL; | ||||||
|  | 		this->isChanged = NULL; | ||||||
| 	} | 	} | ||||||
| 	~HookParamsStruct() | 	~HookParamsStruct() | ||||||
| 	{ | 	{ | ||||||
| 		if(this->orgParams != NULL) | 		if(this->orgParams != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			delete this->orgParams; | 			free(this->orgParams); | ||||||
|  | 		} | ||||||
|  | 		if(this->isChanged != NULL) | ||||||
|  | 		{ | ||||||
|  | 			free(this->isChanged); | ||||||
| 		} | 		} | ||||||
| 		if(this->newParams != NULL) | 		if(this->newParams != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			delete this->newParams; | 			for(int i = dg->params.Count() - 1; i >= 0 ; i--) | ||||||
|  | 			{ | ||||||
|  | 				if(this->newParams[i] == NULL) | ||||||
|  | 					continue; | ||||||
|  | 
 | ||||||
|  | 				if(dg->params.Element(i).type == HookParamType_VectorPtr) | ||||||
|  | 				{ | ||||||
|  | 					delete (Vector *)this->newParams[i]; | ||||||
|  | 				} | ||||||
|  | 				else if(dg->params.Element(i).type == HookParamType_CharPtr) | ||||||
|  | 				{ | ||||||
|  | 					delete (char *)this->newParams[i]; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			free(this->newParams); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| public: | public: | ||||||
| 	//CUtlVector<int> cleanup;
 |  | ||||||
| 	void **orgParams; | 	void **orgParams; | ||||||
| 	void **newParams; | 	void **newParams; | ||||||
|  | 	bool *isChanged; | ||||||
| 	DHooksCallback *dg; | 	DHooksCallback *dg; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -255,6 +298,8 @@ public: | |||||||
| 	IPluginFunction *remove_callback; | 	IPluginFunction *remove_callback; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | size_t GetStackArgsSize(DHooksCallback *dg); | ||||||
|  | 
 | ||||||
| extern IBinTools *g_pBinTools; | extern IBinTools *g_pBinTools; | ||||||
| extern HandleType_t g_HookParamsHandle; | extern HandleType_t g_HookParamsHandle; | ||||||
| extern HandleType_t g_HookReturnHandle; | extern HandleType_t g_HookReturnHandle; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user