Add more natives, Fix using deprecated functions, Add support for float returns, Fix more callback return stuff.
This commit is contained in:
		
							parent
							
								
									07f7869d10
								
							
						
					
					
						commit
						6a47b6f1ef
					
				| @ -11,12 +11,12 @@ ISDKHooks *g_pSDKHooks; | ||||
| ISDKTools *g_pSDKTools; | ||||
| DHooksEntityListener *g_pEntityListener = NULL; | ||||
| 
 | ||||
| bool g_bAllowGamerules = true; | ||||
| 
 | ||||
| HandleType_t g_HookSetupHandle = 0; | ||||
| HandleType_t g_HookParamsHandle = 0; | ||||
| HandleType_t g_HookReturnHandle = 0; | ||||
| 
 | ||||
| SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false); | ||||
| 
 | ||||
| bool DHooks::SDK_OnLoad(char *error, size_t maxlength, bool late) | ||||
| { | ||||
| 	HandleError err; | ||||
| @ -47,6 +47,10 @@ bool DHooks::SDK_OnLoad(char *error, size_t maxlength, bool late) | ||||
| 	plsys->AddPluginsListener(this); | ||||
| 	sharesys->AddNatives(myself, g_Natives); | ||||
| 
 | ||||
| 	g_pEntityListener = new DHooksEntityListener(); | ||||
| 
 | ||||
| 	SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, gamedll, g_pEntityListener, &DHooksEntityListener::LevelShutdown, false); | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| @ -69,18 +73,9 @@ void DHooks::OnHandleDestroy(HandleType_t type, void *object) | ||||
| void DHooks::SDK_OnAllLoaded() | ||||
| { | ||||
| 	SM_GET_LATE_IFACE(SDKTOOLS, g_pSDKTools); | ||||
| 
 | ||||
| 	if(g_pSDKTools->GetInterfaceVersion() < 2) | ||||
| 	{ | ||||
| 		//<psychonic> THIS ISN'T DA LIMBO STICK. LOW IS BAD
 | ||||
| 		g_bAllowGamerules = false; | ||||
| 		smutils->LogError(myself, "SDKTools interface is outdated. DHookGamerules native disabled."); | ||||
| 	} | ||||
| 
 | ||||
| 	SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools); | ||||
| 	SM_GET_LATE_IFACE(SDKHOOKS, g_pSDKHooks); | ||||
| 
 | ||||
| 	g_pEntityListener = new DHooksEntityListener(); | ||||
| 	g_pSDKHooks->AddEntityListener(g_pEntityListener); | ||||
| } | ||||
| 
 | ||||
| @ -91,6 +86,7 @@ void DHooks::SDK_OnUnload() | ||||
| 	{ | ||||
| 		g_pEntityListener->CleanupListeners(NULL); | ||||
| 		g_pSDKHooks->RemoveEntityListener(g_pEntityListener); | ||||
| 		SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, gamedll, g_pEntityListener, &DHooksEntityListener::LevelShutdown, false); | ||||
| 		delete g_pEntityListener; | ||||
| 	} | ||||
| 	plsys->RemovePluginsListener(this); | ||||
|  | ||||
| @ -51,9 +51,9 @@ | ||||
| class DHooks : public SDKExtension, public ISMEntityListener, public IPluginsListener, public IHandleTypeDispatch | ||||
| { | ||||
| public: | ||||
| 	void OnHandleDestroy(HandleType_t type, void *object); | ||||
| 	virtual void OnHandleDestroy(HandleType_t type, void *object); | ||||
| public: //IPluginsListener
 | ||||
| 	void OnPluginUnloaded(IPlugin *plugin); | ||||
| 	virtual void OnPluginUnloaded(IPlugin *plugin); | ||||
| public: | ||||
| 	/**
 | ||||
| 	 * @brief This is called after the initial loading sequence has been processed. | ||||
|  | ||||
| @ -5,11 +5,24 @@ using namespace SourceHook; | ||||
| 
 | ||||
| CUtlVector<EntityListener> g_EntityListeners; | ||||
| 
 | ||||
| void DHooksEntityListener::LevelShutdown() | ||||
| { | ||||
| 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | ||||
| 	{ | ||||
| 		DHooksManager *manager = g_pHooks.Element(i); | ||||
| 		if(manager->callback->hookType == HookType_GameRules) | ||||
| 		{ | ||||
| 			delete manager; | ||||
| 			g_pHooks.Remove(i); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void DHooksEntityListener::CleanupListeners(IPluginContext *pContext) | ||||
| { | ||||
| 	for(int i = g_EntityListeners.Count() -1; i >= 0; i--) | ||||
| 	{ | ||||
| 		if(pContext == NULL || pContext == g_EntityListeners.Element(i).callback->GetParentContext()) | ||||
| 		if(pContext == NULL || pContext == g_EntityListeners.Element(i).callback->GetParentRuntime()->GetDefaultContext()) | ||||
| 		{ | ||||
| 			g_EntityListeners.Remove(i); | ||||
| 		} | ||||
|  | ||||
| @ -7,9 +7,10 @@ | ||||
| class DHooksEntityListener : public ISMEntityListener | ||||
| { | ||||
| public: | ||||
| 	void OnEntityCreated(CBaseEntity *pEntity, const char *classname); | ||||
| 	void OnEntityDestroyed(CBaseEntity *pEntity); | ||||
| 	virtual void OnEntityCreated(CBaseEntity *pEntity, const char *classname); | ||||
| 	virtual void OnEntityDestroyed(CBaseEntity *pEntity); | ||||
| 	void CleanupListeners(IPluginContext *func); | ||||
| 	virtual void LevelShutdown(); | ||||
| }; | ||||
| 
 | ||||
| enum ListenType | ||||
|  | ||||
							
								
								
									
										203
									
								
								natives.cpp
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								natives.cpp
									
									
									
									
									
								
							| @ -36,7 +36,7 @@ cell_t Native_CreateHook(IPluginContext *pContext, const cell_t *params) | ||||
| 
 | ||||
| 	return hndl; | ||||
| } | ||||
| //native bool:DHookAddParam(Handle:setup, HookParamType:type);
 | ||||
| //native bool:DHookAddParam(Handle:setup, HookParamType:type); OLD
 | ||||
| //native bool:DHookAddParam(Handle:setup, HookParamType:type, size=-1, flag=-1);
 | ||||
| cell_t Native_AddParam(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| @ -121,8 +121,124 @@ cell_t Native_HookEntity(IPluginContext *pContext, const cell_t *params) | ||||
| 
 | ||||
| 	return manager->hookid; | ||||
| } | ||||
| /*cell_t Native_HookGamerules(IPluginContext *pContext, const cell_t *params);
 | ||||
| cell_t Native_RemoveHookID(IPluginContext *pContext, const cell_t *params);*/ | ||||
| // native DHookGamerules(Handle:setup, bool:post, DHookRemovalCB:removalcb);
 | ||||
| cell_t Native_HookGamerules(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()); | ||||
| 	HookSetup *setup; | ||||
| 
 | ||||
| 	if((err = handlesys->ReadHandle(params[1], g_HookSetupHandle, &sec, (void **)&setup)) != HandleError_None) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||
| 	} | ||||
| 	if(setup->hookType != HookType_GameRules) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Hook is not a gamerules hook"); | ||||
| 	} | ||||
| 
 | ||||
| 	bool post = params[2] != 0; | ||||
| 
 | ||||
| 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | ||||
| 	{ | ||||
| 		DHooksManager *manager = g_pHooks.Element(i); | ||||
| 		if(manager->callback->hookType == HookType_GameRules && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[3]) && manager->callback->plugin_callback == setup->callback) | ||||
| 		{ | ||||
| 			return manager->hookid; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void *rules = g_pSDKTools->GetGameRules(); | ||||
| 
 | ||||
| 	if(!rules) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Could not get game rules pointer"); | ||||
| 	} | ||||
| 
 | ||||
| 	DHooksManager *manager = new DHooksManager(setup, rules, pContext->GetFunctionById(params[3]), post); | ||||
| 
 | ||||
| 	if(!manager->hookid) | ||||
| 	{ | ||||
| 		delete manager; | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	g_pHooks.AddToTail(manager); | ||||
| 
 | ||||
| 	return manager->hookid; | ||||
| } | ||||
| // DHookRaw(Handle:setup, bool:post, Address:addr, DHookRemovalCB:removalcb);
 | ||||
| cell_t Native_HookRaw(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()); | ||||
| 	HookSetup *setup; | ||||
| 
 | ||||
| 	if((err = handlesys->ReadHandle(params[1], g_HookSetupHandle, &sec, (void **)&setup)) != HandleError_None) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||
| 	} | ||||
| 	if(setup->hookType != HookType_Raw) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Hook is not a gamerules hook"); | ||||
| 	} | ||||
| 
 | ||||
| 	bool post = params[2] != 0; | ||||
| 
 | ||||
| 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | ||||
| 	{ | ||||
| 		DHooksManager *manager = g_pHooks.Element(i); | ||||
| 		if(manager->callback->hookType == HookType_Raw && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[3]) && manager->callback->plugin_callback == setup->callback) | ||||
| 		{ | ||||
| 			return manager->hookid; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void *iface = (void *)(params[3]); | ||||
| 
 | ||||
| 	if(!iface) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Invalid address passed"); | ||||
| 	} | ||||
| 
 | ||||
| 	DHooksManager *manager = new DHooksManager(setup, iface, pContext->GetFunctionById(params[3]), post); | ||||
| 
 | ||||
| 	if(!manager->hookid) | ||||
| 	{ | ||||
| 		delete manager; | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	g_pHooks.AddToTail(manager); | ||||
| 
 | ||||
| 	return manager->hookid; | ||||
| } | ||||
| // native bool:DHookRemoveHookID(hookid);
 | ||||
| cell_t Native_RemoveHookID(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	for(int i = g_pHooks.Count() -1; i >= 0; i--) | ||||
| 	{ | ||||
| 		DHooksManager *manager = g_pHooks.Element(i); | ||||
| 		if(manager->hookid == params[1] && manager->callback->plugin_callback->GetParentRuntime()->GetDefaultContext() == pContext) | ||||
| 		{ | ||||
| 			delete manager; | ||||
| 			g_pHooks.Remove(i); | ||||
| 			return 1; | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| // native any:DHookGetParam(Handle:hParams, num);
 | ||||
| cell_t Native_GetParam(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	if(params[1] == BAD_HANDLE) | ||||
| @ -172,6 +288,71 @@ cell_t Native_GetParam(IPluginContext *pContext, const cell_t *params) | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| // native DHookSetParam(Handle:hParams, param, any:value)
 | ||||
| cell_t Native_SetParam(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; | ||||
| 
 | ||||
| 	switch(paramStruct->dg->params.Element(index).type) | ||||
| 	{ | ||||
| 		case HookParamType_Int: | ||||
| 			paramStruct->newParams[index] = (void *)params[3]; | ||||
| 			break; | ||||
| 		case HookParamType_Bool: | ||||
| 			paramStruct->newParams[index] = (void *)(params[3] ? 1 : 0); | ||||
| 			break; | ||||
| 		case HookParamType_CBaseEntity: | ||||
| 		{ | ||||
| 			CBaseEntity *pEnt = UTIL_GetCBaseEntity(params[2]); | ||||
| 			if(!pEnt) | ||||
| 			{ | ||||
| 				return pContext->ThrowNativeError("Invalid entity index passed for param value"); | ||||
| 			} | ||||
| 			paramStruct->newParams[index] = pEnt; | ||||
| 			break; | ||||
| 		} | ||||
| 		case HookParamType_Edict: | ||||
| 		{ | ||||
| 			edict_t *pEdict = gamehelpers->EdictOfIndex(params[2]); | ||||
| 			if(!pEdict || pEdict->IsFree()) | ||||
| 			{ | ||||
| 				pContext->ThrowNativeError("Invalid entity index passed for param value"); | ||||
| 			} | ||||
| 			paramStruct->newParams[index] = pEdict; | ||||
| 			break; | ||||
| 		} | ||||
| 		case HookParamType_Float: | ||||
| 			paramStruct->newParams[index] = new float; | ||||
| 			*(float *)paramStruct->newParams[index] = sp_ctof(params[3]); | ||||
| 			break; | ||||
| 		default: | ||||
| 			return pContext->ThrowNativeError("Invalid param type (%i) to set", paramStruct->dg->params.Element(index).type); | ||||
| 	} | ||||
| 
 | ||||
| 	paramStruct->isChanged[index] = true; | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| // native any:DHookGetReturn(Handle:hReturn);
 | ||||
| cell_t Native_GetReturn(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	if(params[1] == BAD_HANDLE) | ||||
| @ -205,6 +386,7 @@ cell_t Native_GetReturn(IPluginContext *pContext, const cell_t *params) | ||||
| 	} | ||||
| 	return 1; | ||||
| } | ||||
| // native DHookSetReturn(Handle:hReturn, any:value)
 | ||||
| cell_t Native_SetReturn(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	if(params[1] == BAD_HANDLE) | ||||
| @ -258,11 +440,12 @@ cell_t Native_SetReturn(IPluginContext *pContext, const cell_t *params) | ||||
| 	returnStruct->isChanged = true; | ||||
| 	return 1; | ||||
| } | ||||
| /*cell_t Native_SetParam(IPluginContext *pContext, const cell_t *params);
 | ||||
| cell_t Native_GetParamVector(IPluginContext *pContext, const cell_t *params); | ||||
| /*cell_t Native_GetParamVector(IPluginContext *pContext, const cell_t *params);
 | ||||
| cell_t Native_GetReturnVector(IPluginContext *pContext, const cell_t *params); | ||||
| cell_t Native_SetReturnVector(IPluginContext *pContext, const cell_t *params); | ||||
| cell_t Native_SetParamVector(IPluginContext *pContext, const cell_t *params);*/ | ||||
| 
 | ||||
| // native DHookGetParamString(Handle:hParams, num, String:buffer[], size)
 | ||||
| cell_t Native_GetParamString(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	if(params[1] == BAD_HANDLE) | ||||
| @ -327,7 +510,7 @@ cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) | ||||
| 
 | ||||
| 	if(paramStruct->dg->params.Element(index).type == HookParamType_CharPtr) | ||||
| 	{ | ||||
| 		if(paramStruct->newParams[index] != NULL) | ||||
| 		if((char *)paramStruct->newParams[index] != NULL && paramStruct->isChanged[index]) | ||||
| 			delete (char *)paramStruct->newParams[index]; | ||||
| 
 | ||||
| 		paramStruct->newParams[index] = new char[strlen(value)+1]; | ||||
| @ -342,14 +525,14 @@ sp_nativeinfo_t g_Natives[] = | ||||
| 	{"DHookCreate",							Native_CreateHook}, | ||||
| 	{"DHookAddParam",						Native_AddParam}, | ||||
| 	{"DHookEntity",							Native_HookEntity}, | ||||
| 	/*{"DHookGamerules",						Native_HookGamerules},
 | ||||
| 	{"DHookGamerules",						Native_HookGamerules}, | ||||
| 	{"DHookRaw",							Native_HookRaw}, | ||||
| 	{"DHookRemoveHookID",					Native_RemoveHookID},*/ | ||||
| 	{"DHookRemoveHookID",					Native_RemoveHookID}, | ||||
| 	{"DHookGetParam",						Native_GetParam}, | ||||
| 	{"DHookGetReturn",						Native_GetReturn}, | ||||
| 	{"DHookSetReturn",						Native_SetReturn}, | ||||
| 	/*{"DHookSetParam",						Native_SetParam},
 | ||||
| 	{"DHookGetParamVector",					Native_GetParamVector}, | ||||
| 	{"DHookSetParam",						Native_SetParam}, | ||||
| 	/*{"DHookGetParamVector",					Native_GetParamVector},
 | ||||
| 	{"DHookGetReturnVector",				Native_GetReturnVector}, | ||||
| 	{"DHookSetReturnVector",				Native_SetReturnVector}, | ||||
| 	{"DHookSetParamVector",					Native_SetParamVector},*/ | ||||
|  | ||||
| @ -3,8 +3,7 @@ | ||||
| 
 | ||||
| #include "extension.h" | ||||
| #include "vhook.h" | ||||
| 
 | ||||
| extern bool g_bAllowGamerules; | ||||
| extern ISDKTools *g_pSDKTools; | ||||
| extern HandleType_t g_HookSetupHandle; | ||||
| extern HandleType_t g_HookParamsHandle; | ||||
| extern HandleType_t g_HookReturnHandle; | ||||
|  | ||||
							
								
								
									
										229
									
								
								vhook.cpp
									
									
									
									
									
								
							
							
						
						
									
										229
									
								
								vhook.cpp
									
									
									
									
									
								
							| @ -19,6 +19,7 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem | ||||
| 	this->callback->post = post; | ||||
| 	this->callback->hookType = setup->hookType; | ||||
| 	this->callback->params = setup->params; | ||||
| 	this->addr = 0; | ||||
| 
 | ||||
| 	if(this->callback->hookType == HookType_Entity) | ||||
| 	{ | ||||
| @ -26,6 +27,10 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		if(this->callback->hookType == HookType_Raw) | ||||
| 		{ | ||||
| 			this->addr = (intptr_t)iface; | ||||
| 		} | ||||
| 		this->callback->entity = -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -40,10 +45,14 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem | ||||
| 	{ | ||||
| 		protoInfo.SetReturnType(0, SourceHook::PassInfo::PassType_Unknown, 0, NULL, NULL, NULL, NULL); | ||||
| 	} | ||||
| 	else | ||||
| 	else if(this->callback->returnType != ReturnType_Float) | ||||
| 	{ | ||||
| 		protoInfo.SetReturnType(sizeof(void *), SourceHook::PassInfo::PassType_Basic, setup->returnFlag, NULL, NULL, NULL, NULL); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		protoInfo.SetReturnType(sizeof(void *), SourceHook::PassInfo::PassType_Float, setup->returnFlag, NULL, NULL, NULL, NULL); | ||||
| 	} | ||||
| 	HookManagerPubFunc hook = g_pHookManager->MakeHookMan(protoInfo, 0, this->callback->offset); | ||||
| 
 | ||||
| 	this->hookid = g_SHPtr->AddHook(g_PLID,ISourceHook::Hook_Normal, iface, 0, hook, this->callback, this->callback->post); | ||||
| @ -55,7 +64,7 @@ void CleanupHooks(IPluginContext *pContext) | ||||
| 	{ | ||||
| 		DHooksManager *manager = g_pHooks.Element(i); | ||||
| 
 | ||||
| 		if(pContext == NULL || pContext == manager->callback->plugin_callback->GetParentContext()) | ||||
| 		if(pContext == NULL || pContext == manager->callback->plugin_callback->GetParentRuntime()->GetDefaultContext()) | ||||
| 		{ | ||||
| 			delete manager; | ||||
| 			g_pHooks.Remove(i); | ||||
| @ -96,18 +105,18 @@ size_t GetStackArgsSize(DHooksCallback *dg) | ||||
| } | ||||
| HookParamsStruct *GetParamStruct(DHooksCallback *dg, void **argStack, size_t argStackSize) | ||||
| { | ||||
| 	HookParamsStruct *res = new HookParamsStruct(); | ||||
| 	res->dg = dg; | ||||
| 	res->orgParams = (void **)malloc(argStackSize); | ||||
| 	res->newParams = (void **)malloc(argStackSize); | ||||
| 	res->isChanged = (bool *)malloc(dg->params.Count() * sizeof(bool)); | ||||
| 	memcpy(res->orgParams, argStack, argStackSize); | ||||
| 	HookParamsStruct *params = new HookParamsStruct(); | ||||
| 	params->dg = dg; | ||||
| 	params->orgParams = (void **)malloc(argStackSize); | ||||
| 	params->newParams = (void **)malloc(dg->params.Count() * sizeof(void *)); | ||||
| 	params->isChanged = (bool *)malloc(dg->params.Count() * sizeof(bool)); | ||||
| 	memcpy(params->orgParams, argStack, argStackSize); | ||||
| 	for(int i = 0; i < dg->params.Count(); i++) | ||||
| 	{ | ||||
| 		res->newParams[i] = NULL; | ||||
| 		res->isChanged[i] = false; | ||||
| 		params->newParams[i] = NULL; | ||||
| 		params->isChanged[i] = false; | ||||
| 	} | ||||
| 	return res; | ||||
| 	return params; | ||||
| } | ||||
| HookReturnStruct *GetReturnStruct(DHooksCallback *dg, const void *result) | ||||
| { | ||||
| @ -138,7 +147,22 @@ HookReturnStruct *GetReturnStruct(DHooksCallback *dg, const void *result) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		res->orgResult = NULL; | ||||
| 		switch(dg->returnType) | ||||
| 		{ | ||||
| 			//ReturnType_String,
 | ||||
| 			//ReturnType_Vector,
 | ||||
| 			case ReturnType_Int: | ||||
| 				*(int *)res->orgResult = 0; | ||||
| 			case ReturnType_Bool: | ||||
| 				*(bool *)res->orgResult = false; | ||||
| 				break; | ||||
| 			case ReturnType_Float: | ||||
| 				*(float *)res->orgResult = 0.0; | ||||
| 				break; | ||||
| 			default: | ||||
| 				*(void **)res->orgResult = NULL; | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return res; | ||||
| @ -186,7 +210,7 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 				delete returnStruct; | ||||
| 			} | ||||
| 			g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 			return 0; | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		dg->plugin_callback->PushCell(rHndl); | ||||
| 	} | ||||
| @ -213,11 +237,13 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 				delete paramStruct; | ||||
| 			} | ||||
| 			g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 			return 0; | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		dg->plugin_callback->PushCell(pHndl); | ||||
| 	} | ||||
| 	cell_t result = (cell_t)MRES_Ignored; | ||||
| 	META_RES mres = MRES_IGNORED; | ||||
| 
 | ||||
| 	dg->plugin_callback->Execute(&result); | ||||
| 
 | ||||
| 	void *ret = g_SHPtr->GetOverrideRetPtr(); | ||||
| @ -227,6 +253,7 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 		case MRES_ChangedHandled: | ||||
| 			g_SHPtr->DoRecall(); | ||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 			mres = MRES_SUPERCEDE; | ||||
| 			ret = CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||
| 			break; | ||||
| 		case MRES_ChangedOverride: | ||||
| @ -239,13 +266,14 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					IPlugin *plugin = plsys->FindPluginByContext(dg->plugin_callback->GetParentContext()->GetContext()); | ||||
| 					smutils->LogError(myself, "Plugin %s tried to override a return without a return being set", plugin->GetFilename()); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			g_SHPtr->DoRecall(); | ||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 			mres = MRES_SUPERCEDE; | ||||
| 			CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||
| 			break; | ||||
| 		case MRES_Override: | ||||
| @ -254,13 +282,14 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 				if(returnStruct->isChanged) | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_OVERRIDE); | ||||
| 					mres = MRES_OVERRIDE; | ||||
| 					ret = *(void **)returnStruct->newResult; | ||||
| 				} | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					IPlugin *plugin = plsys->FindPluginByContext(dg->plugin_callback->GetParentContext()->GetContext()); | ||||
| 					smutils->LogError(myself, "Plugin %s tried to override a return without a return being set", plugin->GetFilename()); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| @ -270,22 +299,24 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 				if(returnStruct->isChanged) | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 					mres = MRES_SUPERCEDE; | ||||
| 					ret = *(void **)returnStruct->newResult; | ||||
| 				} | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					IPlugin *plugin = plsys->FindPluginByContext(dg->plugin_callback->GetParentContext()->GetContext()); | ||||
| 					smutils->LogError(myself, "Plugin %s tried to override a return without a return being set", plugin->GetFilename()); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 			mres = MRES_IGNORED; | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	HandleSecurity sec(dg->plugin_callback->GetParentContext()->GetIdentity(), myself->GetIdentity()); | ||||
| 	HandleSecurity sec(dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->GetIdentity(), myself->GetIdentity()); | ||||
| 
 | ||||
| 	if(returnStruct) | ||||
| 	{ | ||||
| @ -296,9 +327,163 @@ void *Callback(DHooksCallback *dg, void **argStack) | ||||
| 		handlesys->FreeHandle(pHndl, &sec); | ||||
| 	} | ||||
| 
 | ||||
| 	if(dg->returnType == ReturnType_Void || g_SHPtr->GetStatus() <= MRES_HANDLED) | ||||
| 	if(dg->returnType == ReturnType_Void || mres <= MRES_HANDLED) | ||||
| 	{ | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| #ifndef __linux__ | ||||
| float Callback_float(DHooksCallback *dg, void **argStack, size_t *argsizep) | ||||
| #else | ||||
| void *Callback_float(DHooksCallback *dg, void **argStack) | ||||
| #endif | ||||
| { | ||||
| 	HookReturnStruct *returnStruct = NULL; | ||||
| 	HookParamsStruct *paramStruct = NULL; | ||||
| 	Handle_t rHndl; | ||||
| 	Handle_t pHndl; | ||||
| 
 | ||||
| 	#ifndef __linux__ | ||||
| 	*argsizep = GetStackArgsSize(dg); | ||||
| 	#else | ||||
| 	size_t argsize = GetStackArgsSize(dg); | ||||
| 	#endif | ||||
| 
 | ||||
| 	if(dg->thisType == ThisPointer_CBaseEntity || dg->thisType == ThisPointer_Address) | ||||
| 	{ | ||||
| 		dg->plugin_callback->PushCell(GetThisPtr(g_SHPtr->GetIfacePtr(), dg->thisType)); | ||||
| 	} | ||||
| 
 | ||||
| 	returnStruct = GetReturnStruct(dg, g_SHPtr->GetOrigRet()); | ||||
| 	rHndl = handlesys->CreateHandle(g_HookReturnHandle, returnStruct, dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->GetIdentity(), myself->GetIdentity(), NULL); | ||||
| 
 | ||||
| 	if(!rHndl) | ||||
| 	{ | ||||
| 		dg->plugin_callback->Cancel(); | ||||
| 		if(returnStruct) | ||||
| 		{ | ||||
| 			delete returnStruct; | ||||
| 		} | ||||
| 		g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	dg->plugin_callback->PushCell(rHndl); | ||||
| 
 | ||||
| 	#ifndef __linux__ | ||||
| 	if(*argsizep > 0) | ||||
| 	{ | ||||
| 		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); | ||||
| 		if(!pHndl) | ||||
| 		{ | ||||
| 			dg->plugin_callback->Cancel(); | ||||
| 			if(returnStruct) | ||||
| 			{ | ||||
| 				delete returnStruct; | ||||
| 			} | ||||
| 			if(paramStruct) | ||||
| 			{ | ||||
| 				delete paramStruct; | ||||
| 			} | ||||
| 			g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		dg->plugin_callback->PushCell(pHndl); | ||||
| 	} | ||||
| 	cell_t result = (cell_t)MRES_Ignored; | ||||
| 	META_RES mres = MRES_IGNORED; | ||||
| 	dg->plugin_callback->Execute(&result); | ||||
| 
 | ||||
| 	void *ret = g_SHPtr->GetOverrideRetPtr(); | ||||
| 	switch((MRESReturn)result) | ||||
| 	{ | ||||
| 		case MRES_Handled: | ||||
| 		case MRES_ChangedHandled: | ||||
| 			g_SHPtr->DoRecall(); | ||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 			mres = MRES_SUPERCEDE; | ||||
| 			ret = CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||
| 			break; | ||||
| 		case MRES_ChangedOverride: | ||||
| 			if(dg->returnType != ReturnType_Void) | ||||
| 			{ | ||||
| 				if(returnStruct->isChanged) | ||||
| 				{ | ||||
| 					*(float *)ret = *(float *)returnStruct->newResult; | ||||
| 				} | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			g_SHPtr->DoRecall(); | ||||
| 			g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 			mres = MRES_SUPERCEDE; | ||||
| 			CallVFunction(dg, paramStruct, g_SHPtr->GetIfacePtr()); | ||||
| 			break; | ||||
| 		case MRES_Override: | ||||
| 			if(dg->returnType != ReturnType_Void) | ||||
| 			{ | ||||
| 				if(returnStruct->isChanged) | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_OVERRIDE); | ||||
| 					mres = MRES_OVERRIDE; | ||||
| 					*(float *)ret = *(float *)returnStruct->newResult; | ||||
| 				} | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		case MRES_Supercede: | ||||
| 			if(dg->returnType != ReturnType_Void) | ||||
| 			{ | ||||
| 				if(returnStruct->isChanged) | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_SUPERCEDE); | ||||
| 					mres = MRES_SUPERCEDE; | ||||
| 					*(float *)ret = *(float *)returnStruct->newResult; | ||||
| 				} | ||||
| 				else //Throw an error if no override was set
 | ||||
| 				{ | ||||
| 					g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 					mres = MRES_IGNORED; | ||||
| 					dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->ThrowNativeError("Tried to override return value without return value being set"); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			g_SHPtr->SetRes(MRES_IGNORED); | ||||
| 			mres = MRES_IGNORED; | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	HandleSecurity sec(dg->plugin_callback->GetParentRuntime()->GetDefaultContext()->GetIdentity(), myself->GetIdentity()); | ||||
| 
 | ||||
| 	if(returnStruct) | ||||
| 	{ | ||||
| 		handlesys->FreeHandle(rHndl, &sec); | ||||
| 	} | ||||
| 	if(paramStruct) | ||||
| 	{ | ||||
| 		handlesys->FreeHandle(pHndl, &sec); | ||||
| 	} | ||||
| 
 | ||||
| 	if(dg->returnType == ReturnType_Void || mres <= MRES_HANDLED) | ||||
| 	{ | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	return *(float *)ret; | ||||
| } | ||||
|  | ||||
							
								
								
									
										17
									
								
								vhook.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								vhook.h
									
									
									
									
									
								
							| @ -117,7 +117,7 @@ public: | ||||
| 
 | ||||
| #ifndef __linux__ | ||||
| void *Callback(DHooksCallback *dg, void **stack, size_t *argsizep); | ||||
| //float Callback_float(DHooksCallback *dg, void **stack, size_t *argsizep);
 | ||||
| float Callback_float(DHooksCallback *dg, void **stack, size_t *argsizep); | ||||
| #else | ||||
| void *Callback(DHooksCallback *dg, void **stack); | ||||
| float Callback_float(DHooksCallback *dg, void **stack); | ||||
| @ -137,9 +137,9 @@ static void *GenerateThunk(ReturnType type) | ||||
| 	masm.lea(eax, Operand(ebp, 12)); | ||||
| 	masm.push(eax); | ||||
| 	masm.push(Operand(ebp, 8)); | ||||
| 	/*if(type == ReturnType_Float)
 | ||||
| 	if(type == ReturnType_Float) | ||||
| 		masm.call(ExternalAddress((void *)Callback_float)); | ||||
| 	else*/ | ||||
| 	else | ||||
| 		masm.call(ExternalAddress((void *)Callback)); | ||||
| 	masm.addl(esp, 8); | ||||
| 	masm.pop(ebp); | ||||
| @ -161,9 +161,9 @@ static void *GenerateThunk(ReturnType type) | ||||
| 	masm.lea(eax, Operand(ebp, 8)); | ||||
| 	masm.push(eax); | ||||
| 	masm.push(ecx); | ||||
| 	//if(type == ReturnType_Float)
 | ||||
| 	//	masm.call(ExternalAddress(Callback_float));
 | ||||
| 	//else
 | ||||
| 	if(type == ReturnType_Float) | ||||
| 		masm.call(ExternalAddress(Callback_float)); | ||||
| 	else | ||||
| 		masm.call(ExternalAddress(Callback)); | ||||
| 	masm.addl(esp, 12); | ||||
| 	masm.pop(ecx); // grab arg size
 | ||||
| @ -226,6 +226,10 @@ public: | ||||
| 				{ | ||||
| 					delete (char *)this->newParams[i]; | ||||
| 				} | ||||
| 				else if(dg->params.Element(i).type == HookParamType_Float) | ||||
| 				{ | ||||
| 					delete (float *)this->newParams[i]; | ||||
| 				} | ||||
| 			} | ||||
| 			free(this->newParams); | ||||
| 		} | ||||
| @ -277,6 +281,7 @@ public: | ||||
| 		} | ||||
| 	} | ||||
| public: | ||||
| 	intptr_t addr; | ||||
| 	int hookid; | ||||
| 	DHooksCallback *callback; | ||||
| 	IPluginFunction *remove_callback; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user