L L4D2node

KeyValues::GetSymbolForStringGrowable

0x002524c0 · 730 bytes · __cdecl

_ZN9KeyValues26GetSymbolForStringGrowableEPKcb

Decompiled

undefined (2 params)

/* KeyValues::GetSymbolForStringGrowable(char const*, bool) */

undefined8 KeyValues::GetSymbolForStringGrowable(char *param_1,bool param_2)

{
  int *piVar1;
  undefined4 *puVar2;
  uint *puVar3;
  uint uVar4;
  char *pcVar5;
  undefined4 uVar6;
  int iVar7;
  char *pcVar8;
  int iVar9;
  uint uVar10;
  uint uVar11;
  CUtlVector<int,CUtlMemory<int,int>> *this;
  uint local_24;
  
  puVar3 = s_pGrowableStringTable;
  uVar4 = ThreadGetCurrentId();
  if (uVar4 == *puVar3) {
LAB_002524eb:
    puVar3[1] = puVar3[1] + 1;
  }
  else {
    LOCK();
    uVar11 = *puVar3;
    if (uVar11 == 0) {
      *puVar3 = uVar4;
    }
    UNLOCK();
    if (uVar11 == 0) goto LAB_002524eb;
    CThreadFastMutex::Lock((uint)puVar3,uVar4);
  }
  puVar3[2] = (uint)param_1;
  puVar3[3] = puVar3[0xd];
  if (!param_2) {
    local_24 = HashStringCaseless(*(char **)puVar3[10]);
    if ((char)puVar3[0xb] == '\0') {
      local_24 = local_24 % puVar3[7];
    }
    else {
      local_24 = local_24 & puVar3[0xc];
    }
    uVar11 = 0;
    piVar1 = (int *)(puVar3[4] + local_24 * 0x14);
    uVar4 = piVar1[3];
    if ((int)uVar4 < 1) {
LAB_00252688:
      if (uVar4 == uVar11) goto LAB_00252758;
      uVar4 = uVar11 & 0xffff;
      uVar11 = (local_24 << 0x10 | uVar11) >> 0x10;
    }
    else {
      do {
        puVar2 = (undefined4 *)puVar3[9];
        iVar9 = *(int *)(*piVar1 + uVar11 * 4);
        if (iVar9 < 1) {
          pcVar5 = (char *)*puVar2;
          pcVar8 = pcVar5;
        }
        else {
          pcVar5 = (char *)(iVar9 + puVar2[1]);
          pcVar8 = (char *)*puVar2;
        }
        iVar9 = _V_stricmp(pcVar5,pcVar8);
        if (iVar9 == 0) goto LAB_00252688;
        uVar11 = uVar11 + 1;
      } while (uVar11 != uVar4);
LAB_00252758:
      uVar4 = 0xffff;
      uVar11 = 0xffff;
    }
    uVar6 = 0xffffffff;
    if (((int)uVar11 < (int)puVar3[7]) &&
       (piVar1 = (int *)(puVar3[4] + uVar11 * 0x14), (int)uVar4 < piVar1[3])) {
      uVar6 = *(undefined4 *)(*piVar1 + uVar4 * 4);
    }
    goto LAB_0025266b;
  }
                    /* try { // try from 00252510 to 002525d8 has its CatchHandler @ 002527cc */
  local_24 = HashStringCaseless(*(char **)puVar3[10]);
  if ((char)puVar3[0xb] == '\0') {
    local_24 = local_24 % puVar3[7];
  }
  else {
    local_24 = local_24 & puVar3[0xc];
  }
  uVar11 = puVar3[4];
  uVar10 = 0;
  piVar1 = (int *)(uVar11 + local_24 * 0x14);
  uVar4 = piVar1[3];
  if ((int)uVar4 < 1) {
LAB_00252643:
    if (uVar4 == uVar10) goto LAB_002526cb;
    iVar9 = (uVar10 & 0xffff) << 2;
    iVar7 = ((local_24 << 0x10 | uVar10) >> 0x10) * 0x14;
  }
  else {
    do {
      puVar2 = (undefined4 *)puVar3[9];
      iVar9 = *(int *)(*piVar1 + uVar10 * 4);
      if (iVar9 < 1) {
        pcVar5 = (char *)*puVar2;
        pcVar8 = pcVar5;
      }
      else {
        pcVar5 = (char *)(iVar9 + puVar2[1]);
        pcVar8 = (char *)*puVar2;
      }
      iVar9 = _V_stricmp(pcVar5,pcVar8);
      if (iVar9 == 0) {
        uVar11 = puVar3[4];
        goto LAB_00252643;
      }
      uVar10 = uVar10 + 1;
    } while (uVar10 != uVar4);
    uVar11 = puVar3[4];
LAB_002526cb:
    this = (CUtlVector<int,CUtlMemory<int,int>> *)(local_24 * 0x14 + uVar11);
    uVar4 = *(uint *)(this + 0xc);
    CUtlVector<int,CUtlMemory<int,int>>::GrowVector(this,1);
                    /* try { // try from 002526f7 to 00252794 has its CatchHandler @ 002527cc */
    CUtlVector<int,CUtlMemory<int,int>>::ShiftElementsRight(this,uVar4,1);
    puVar2 = (undefined4 *)(*(int *)this + uVar4 * 4);
    if (puVar2 != (undefined4 *)0x0) {
      *puVar2 = 0xffffffff;
    }
    iVar9 = _V_strlen(param_1);
    iVar9 = iVar9 + 1;
    uVar11 = puVar3[0x10];
    if (iVar9 != 0) {
      CUtlVector<char,CUtlMemory<char,int>>::GrowVector
                ((CUtlVector<char,CUtlMemory<char,int>> *)(puVar3 + 0xd),iVar9);
      CUtlVector<char,CUtlMemory<char,int>>::ShiftElementsRight
                ((CUtlVector<char,CUtlMemory<char,int>> *)(puVar3 + 0xd),uVar11,iVar9);
      if ((param_1 != (char *)0x0) && (0 < iVar9)) {
        iVar7 = 0;
        do {
          *(char *)(uVar11 + puVar3[0xd] + iVar7) = param_1[iVar7];
          iVar7 = iVar7 + 1;
        } while (iVar7 != iVar9);
      }
    }
    iVar9 = (uVar4 & 0xffff) * 4;
    iVar7 = ((local_24 << 0x10 | uVar4) >> 0x10) * 0x14;
    *(uint *)(*(int *)(puVar3[4] + iVar7) + (uVar4 & 0xffff) * 4) = uVar11;
    uVar11 = puVar3[4];
  }
  uVar6 = *(undefined4 *)(*(int *)(uVar11 + iVar7) + iVar9);
LAB_0025266b:
  puVar3[1] = puVar3[1] - 1;
  uVar4 = puVar3[1];
  if (uVar4 == 0) {
    LOCK();
    uVar4 = *puVar3;
    *puVar3 = 0;
    UNLOCK();
  }
  return CONCAT44(uVar4,uVar6);
}

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)