L L4D2node

ResponseCopyString

0x005b9ef0 · 452 bytes · __regparm3

_ZL18ResponseCopyStringPKc

Decompiled

undefined (1 param)

/* ResponseCopyString(char const*) */

char * __regparm3 ResponseCopyString(char *param_1)

{
  int iVar1;
  byte bVar2;
  ushort uVar3;
  char cVar4;
  char *pcVar5;
  int iVar6;
  byte *pbVar7;
  uint uVar8;
  uint uVar9;
  CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
  *this;
  char *local_30 [4];
  char *local_20 [4];
  
  if (param_1 == (char *)0x0) {
    pcVar5 = (char *)0x0;
  }
  else {
    bVar2 = *param_1;
    pcVar5 = "";
    if (bVar2 != 0) {
      uVar9 = 0xaaaaaaaa;
      pbVar7 = (byte *)param_1;
      do {
        pbVar7 = pbVar7 + 1;
        uVar9 = (uint)bVar2 + uVar9 * 0x21;
        bVar2 = *pbVar7;
      } while (bVar2 != 0);
      uVar9 = uVar9 & 0x3f;
      this = (CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
              *)(&g_ReponseStringBucketInitializer + uVar9 * 7);
      uVar8 = (uint)*(ushort *)(&DAT_00fb7cd0 + uVar9 * 0x1c);
      local_30[0] = param_1;
      if (*(ushort *)(&DAT_00fb7cd0 + uVar9 * 0x1c) != 0xffff) {
        iVar6 = (&DAT_00fb7cc4)[uVar9 * 7];
        do {
          while( true ) {
            iVar1 = uVar8 * 0xc;
            cVar4 = (**(code **)this)(local_30,iVar6 + 8 + iVar1);
            if (cVar4 != '\0') break;
            cVar4 = (**(code **)this)((&DAT_00fb7cc4)[uVar9 * 7] + iVar1 + 8,local_30);
            if (cVar4 == '\0') {
              return *(undefined1 **)((&DAT_00fb7cc4)[uVar9 * 7] + 8 + iVar1);
            }
            if ((CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
                 ::Links(unsigned_short)::s_Sentinel == '\0') &&
               (iVar6 = __cxa_guard_acquire(&CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
                                             ::Links(unsigned_short)::s_Sentinel), iVar6 != 0)) {
              CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
              ::Links(unsigned_short)::s_Sentinel = 0xffff;
              DAT_00f15fca = 0xffff;
              DAT_00f15fcc = 0xffff;
              __cxa_guard_release(&CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
                                   ::Links(unsigned_short)::s_Sentinel);
            }
            iVar6 = (&DAT_00fb7cc4)[uVar9 * 7];
            uVar3 = *(ushort *)(iVar6 + 2 + iVar1);
            uVar8 = (uint)uVar3;
            if (uVar3 == 0xffff) goto LAB_005b9fca;
          }
          if ((CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
               ::Links(unsigned_short)::s_Sentinel == '\0') &&
             (iVar6 = __cxa_guard_acquire(&CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
                                           ::Links(unsigned_short)::s_Sentinel), iVar6 != 0)) {
            DAT_00f15fca = 0xffff;
            CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
            ::Links(unsigned_short)::s_Sentinel = 0xffff;
            DAT_00f15fcc = 0xffff;
            __cxa_guard_release(&CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
                                 ::Links(unsigned_short)::s_Sentinel);
          }
          iVar6 = (&DAT_00fb7cc4)[uVar9 * 7];
          uVar3 = *(ushort *)(iVar6 + uVar8 * 0xc);
          uVar8 = (uint)uVar3;
        } while (uVar3 != 0xffff);
      }
LAB_005b9fca:
      iVar6 = _V_strlen(local_30[0]);
      pcVar5 = operator_new__(iVar6 + 1);
      _V_memcpy(pcVar5,local_30[0],iVar6);
      pcVar5[iVar6] = '\0';
      local_20[0] = pcVar5;
      CUtlRBTree<char_const*,unsigned_short,bool(*)(char_const*const&,char_const*const&),CUtlMemory<UtlRBTreeNode_t<char_const*,unsigned_short>,unsigned_short>>
      ::Insert(this,local_20);
    }
  }
  return pcVar5;
}

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)