Add support to define function signatures in gamedata

A "Functions" section is parsed in gamedata files that allow you to define the signature of functions including metadata like the calling convention and specifying the register an argument is passed in.
A new native DHookCreateFromConf can be used to setup a hook or detour from one of that function sections in the "Functions" section.
This commit is contained in:
Peace-Maker
2018-01-25 17:18:30 +01:00
parent e2d71bae03
commit aa3018a27d
10 changed files with 792 additions and 7 deletions
+77
View File
@@ -0,0 +1,77 @@
"Games"
{
"cstrike"
{
"Signatures"
{
"Deafen"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x2A\x89\x4D\x2A\x8B\x45\x2A\x8B\x10\x8B\x4D\x2A\x8B\x82\x2A\x2A\x2A\x2A\xFF\xD0\x85\xC0\x74"
"linux" "@_ZN9CCSPlayer6DeafenEf"
}
"CFlashbangProjectile::Detonate"
{
"library" "server"
"windows" "\x53\x56\x8B\xF1\x57\x8B\x86\x2A\x2A\x2A\x2A\xC1\xE8\x2A\xA8\x2A\x74\x2A\xE8\x2A\x2A\x2A\x2A\xD9\x05\x2A\x2A\x2A\x2A\x6A\x40\x6A\x00\x51\x8B\xCE"
"linux" "@_ZN20CFlashbangProjectile8DetonateEv"
}
"PercentageOfFlashForPlayer"
{
"library" "server"
"windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\x2A\x83\xC4\x2A\x55\x8B\x6B\x2A\x89\x6C\x2A\x2A\x8B\xEC\x81\xEC\x2A\x2A\x2A\x2A\x56\x8B\x73\x08\x8D\x4D\xAC"
"linux" "@_Z26PercentageOfFlashForPlayerP11CBaseEntity6VectorS0_"
}
}
}
"csgo"
{
"Signatures"
{
// "tr_player_flashbanged" is in RadiusFlash which calls CCSPlayer::Deafen and PercentageOfFlashForPlayer
"Deafen"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x28\x56\x57\x8B\xF9\xF3\x0F\x11\x4D\xFC"
"linux" "\x55\x89\xE5\x83\xEC\x48\x89\x7D\xFC\x8B\x7D\x08\x89\x5D\xF4\x89\x75\xF8\x8B\x07"
}
// "flashbang_detonate" and "Scorch"
"CFlashbangProjectile::Detonate"
{
"library" "server"
"windows" "\x55\x8B\xEC\x83\xEC\x6C\x53\x56\x57\x8B\xF1"
"linux" "\x55\x89\xE5\x57\x56\x53\x81\xEC\x0C\x01\x00\x00\x8B\x5D\x08\x89\x1C\x24\xE8\x2A\x2A\x2A\x2A\x85\xC0\x89\xC6"
}
"PercentageOfFlashForPlayer"
{
"library" "server"
"windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x81\xEC\x08\x01\x00\x00\x56\x8B\xF1"
"linux" "\x55\x89\xE5\x57\x56\x53\x81\xEC\x9C\x01\x00\x00\x8B\x5D\x08\x8B\x03"
}
}
"Functions"
{
"Deafen"
{
"signature" "Deafen"
"callconv" "thiscall"
"return" "void"
"this" "entity"
"arguments"
{
"distance"
{
"type" "float"
"windows"
{
"register" "xmm1"
}
}
}
}
}
}
}
+5 -2
View File
@@ -33,14 +33,17 @@ public void OnPluginStart()
PrintToServer("CFlashbangProjectile::Detonate detoured!");
hFlashbangDeafen = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
hFlashbangDeafen = DHookCreateFromConf(temp, "Deafen");
if (!hFlashbangDeafen)
SetFailState("Failed to setup detour for Deafen");
/*hFlashbangDeafen = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
if (!hFlashbangDeafen)
SetFailState("Failed to setup detour for Deafen");
if (!DHookSetFromConf(hFlashbangDeafen, temp, SDKConf_Signature, "Deafen"))
SetFailState("Failed to load Deafen signature from gamedata");
DHookAddParam(hFlashbangDeafen, HookParamType_Float, .custom_register=DHookRegister_XMM1);
DHookAddParam(hFlashbangDeafen, HookParamType_Float, .custom_register=DHookRegister_XMM1);*/
if (!DHookEnableDetour(hFlashbangDeafen, false, Detour_OnDeafen))
SetFailState("Failed to detour Deafen.");
+14 -2
View File
@@ -219,7 +219,7 @@ native bool DHookRemoveEntityListener(ListenType type, ListenCB callback);
* @param callback Callback function
*
* @return Returns setup handle for the hook.
* @error Failed to create hook setup handle.
* @error Failed to create hook setup handle or invalid callback function.
*/
native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype, DHookCallback callback);
@@ -237,6 +237,18 @@ native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype,
*/
native Handle DHookCreateDetour(Address funcaddr, CallingConvention callConv, ReturnType returntype, ThisPointerType thisType);
/**
* Setup a detour or hook for a function as described in a "Functions" section in gamedata.
*
* @param gameconf GameConfig handle
* @param name Name of the function in the gamedata to load.
* @param callback Callback function (only required for virtual hooks - ignored for detours).
*
* @return Setup handle for the detour or INVALID_HANDLE if offset/signature/address wasn't found.
* @error Failed to create detour setup handle, invalid gamedata handle, invalid callback function or failed to find function in gamedata.
*/
native Handle DHookCreateFromConf(Handle gameconf, const char[] name, DHookCallback callback=INVALID_FUNCTION);
/**
* Load details for a vhook or detour from a gamedata file.
*
@@ -246,7 +258,7 @@ native Handle DHookCreateDetour(Address funcaddr, CallingConvention callConv, Re
* @param name Name of the property to find.
*
* @return True on success, false if nothing was found.
* @error Invalid setup handle.
* @error Invalid setup or gamedata handle.
*/
native bool DHookSetFromConf(Handle setup, Handle gameconf, SDKFuncConfSource source, const char[] name);