L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)