UploadData
0x002125d0 · 938 bytes · __cdecl
_Z10UploadDataPKcS0_P9KeyValues
Decompiled
undefined (3 params)
/* UploadData(char const*, char const*, KeyValues*) */
undefined4 UploadData(char *param_1,char *param_2,KeyValues *param_3)
{
uchar *puVar1;
KeyValues *pKVar2;
char *pcVar3;
undefined4 uVar4;
CBlockingUDPSocket *this;
uint uVar5;
int iVar6;
uchar *puVar7;
int in_GS_OFFSET;
IceKey local_1068 [12];
uchar *local_105c [3];
int local_1050;
uchar *local_1044 [3];
int local_1038;
netadr_s local_102c;
undefined1 local_102b;
undefined1 local_102a;
undefined1 local_1029;
undefined1 local_1028;
undefined1 local_1027;
undefined1 local_1026;
undefined1 local_1025;
undefined1 local_1020 [2048];
sockaddr local_820 [128];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
bf_write::bf_write((bf_write *)local_105c);
bf_write::StartWriting((bf_write *)local_105c,local_1020,0x800,0,-1);
bf_write::bf_write((bf_write *)local_1044);
bf_write::WriteByte((bf_write *)local_105c,0x71);
bf_write::WriteByte((bf_write *)local_105c,10);
bf_write::WriteByte((bf_write *)local_105c,1);
IceKey::IceKey(local_1068,1);
local_102c = (netadr_s)0x36;
local_102b = 0xaf;
local_102a = 0xa5;
local_1029 = 5;
local_1028 = 0x4c;
local_1027 = 0xfb;
local_1026 = 0x1d;
local_1025 = 0x71;
/* try { // try from 002126e6 to 0021288c has its CatchHandler @ 00212991 */
IceKey::set(local_1068,(uchar *)&local_102c);
bf_write::StartWriting((bf_write *)local_1044,local_820,0x800,0,-1);
bf_write::WriteByte((bf_write *)local_1044,1);
bf_write::WriteByte((bf_write *)local_1044,1);
bf_write::WriteString((bf_write *)local_1044,param_2);
pKVar2 = (KeyValues *)KeyValues::GetFirstSubKey(param_3);
uVar5 = 0;
if (pKVar2 != (KeyValues *)0x0) {
do {
uVar5 = uVar5 + 1;
pKVar2 = (KeyValues *)KeyValues::GetNextKey(pKVar2);
} while (pKVar2 != (KeyValues *)0x0);
if (0xff < (int)uVar5) {
Host_Error("Too many fields in uploaddata (%i max = 255)\n",uVar5);
uVar5 = uVar5 & 0xff;
}
}
bf_write::WriteByte((bf_write *)local_1044,uVar5);
for (pKVar2 = (KeyValues *)KeyValues::GetFirstSubKey(param_3); pKVar2 != (KeyValues *)0x0;
pKVar2 = (KeyValues *)KeyValues::GetNextKey(pKVar2)) {
pcVar3 = (char *)KeyValues::GetName(pKVar2);
bf_write::WriteString((bf_write *)local_1044,pcVar3);
pcVar3 = (char *)KeyValues::GetString(pKVar2,(char *)0x0,"");
bf_write::WriteString((bf_write *)local_1044,pcVar3);
}
while (puVar1 = local_1044[0], uVar5 = local_1038 + 7 >> 3, (uVar5 & 7) != 0) {
bf_write::WriteByte((bf_write *)local_1044,0);
}
iVar6 = 0;
puVar7 = local_1044[0];
if (uVar5 != 0) {
do {
IceKey::encrypt(local_1068,puVar7,puVar7);
puVar7 = puVar7 + 8;
} while ((uint)((int)puVar7 - (int)puVar1) < uVar5);
iVar6 = local_1038 + 7 >> 3;
}
bf_write::WriteShort((bf_write *)local_105c,iVar6);
bf_write::WriteBytes((bf_write *)local_105c,local_1044[0],local_1038 + 7 >> 3);
IceKey::~IceKey(local_1068);
netadr_s::SetIP(&local_102c,0);
netadr_s::SetPort(&local_102c,0);
netadr_s::SetType(&local_102c,3);
uVar4 = NET_StringToAdr(param_1,&local_102c);
if ((char)uVar4 != '\0') {
this = operator_new(0x18);
/* try { // try from 00212925 to 00212929 has its CatchHandler @ 0021297f */
CBlockingUDPSocket::CBlockingUDPSocket(this);
if (this != (CBlockingUDPSocket *)0x0) {
netadr_s::ToSockadr(&local_102c,local_820);
CBlockingUDPSocket::SendSocketMessage
(this,(sockaddr_in *)local_820,local_105c[0],local_1050 + 7 >> 3);
(**(code **)(*(int *)this + 4))(this);
goto LAB_002128f7;
}
}
uVar4 = 0;
LAB_002128f7:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return uVar4;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.