L L4D2node

SVC_ClassInfo::ReadFromBuffer

0x000b7a90 · 1406 bytes · __thiscall

_ZN13SVC_ClassInfo14ReadFromBufferER7bf_read

Decompiled

undefined (2 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* SVC_ClassInfo::ReadFromBuffer(bf_read&) */

byte __thiscall SVC_ClassInfo::ReadFromBuffer(SVC_ClassInfo *this,bf_read *param_1)

{
  bf_read *pbVar1;
  uint uVar2;
  undefined4 *puVar3;
  undefined4 uVar4;
  uint *puVar5;
  uint uVar6;
  char cVar7;
  ushort uVar8;
  int iVar9;
  CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *this_00;
  int iVar10;
  int iVar11;
  SVC_ClassInfo SVar12;
  byte bVar13;
  int in_GS_OFFSET;
  char *pcVar14;
  int local_244;
  byte local_240;
  undefined4 local_23c;
  undefined4 local_238;
  undefined4 local_230;
  undefined4 local_22c;
  CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *local_228;
  uint local_224;
  char local_220 [256];
  char local_120 [256];
  int local_20;
  
  local_23c = 0;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_238 = 0;
  if (_exit == (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)0x0) {
    local_228 = (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)0x0;
  }
  else {
    (**(code **)(_exit + 0x50))
              (_exit,&local_23c,0,0,0,0,"/data/src/engine/../common/netmessages.cpp",0x5a0,
               &ReadFromBuffer(bf_read&)::tm_fmt,"(%s)%s","Unaccounted",
               "SVC_ClassInfo::ReadFromBuffer");
    local_228 = _exit;
  }
  iVar10 = _DAT_0040b9d4;
  local_230 = local_23c;
  local_22c = local_238;
                    /* try { // try from 000b7b6b to 000b7b6f has its CatchHandler @ 000b804b */
  if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
     (iVar9 = ThreadGetCurrentId(), iVar10 == iVar9)) {
    if (*(char **)_DAT_0040b030 != "SVC_ClassInfo::ReadFromBuffer") {
                    /* try { // try from 000b7f8f to 000b7fa0 has its CatchHandler @ 000b804b */
      _DAT_0040b030 =
           (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)
           CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a0745,&DAT_00000001,0x2a054b);
    }
    CVProfNode::EnterScope();
    DAT_0040b02c = '\0';
  }
  *(undefined4 *)(this + 0x5c) = 0;
  iVar10 = *(int *)(param_1 + 0x14);
  if (iVar10 < 0x10) {
    uVar4 = *(undefined4 *)(param_1 + 0x10);
    puVar5 = *(uint **)(param_1 + 0x18);
    if (puVar5 == *(uint **)(param_1 + 0x1c)) {
      *(undefined4 *)(param_1 + 0x14) = 1;
      *(undefined4 *)(param_1 + 0x10) = 0;
      *(uint **)(param_1 + 0x18) = puVar5 + 1;
      param_1[4] = (bf_read)0x1;
    }
    else if (*(uint **)(param_1 + 0x1c) < puVar5) {
      param_1[4] = (bf_read)0x1;
      *(undefined4 *)(param_1 + 0x10) = 0;
    }
    else {
      *(uint **)(param_1 + 0x18) = puVar5 + 1;
      uVar2 = *puVar5;
      *(uint *)(param_1 + 0x10) = uVar2;
      if (param_1[4] == (bf_read)0x0) {
        uVar6 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar10];
        *(int *)(param_1 + 0x14) = iVar10 + 0x10;
        uVar8 = (ushort)((uVar6 & uVar2) << ((byte)iVar10 & 0x1f)) | (ushort)uVar4;
        *(uint *)(param_1 + 0x10) = uVar2 >> ((byte)(0x10 - iVar10) & 0x1f);
        goto LAB_000b7ba9;
      }
    }
    *(undefined4 *)(this + 100) = 0;
    this_00 = (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)0x0;
  }
  else {
    *(int *)(param_1 + 0x14) = iVar10 + -0x10;
    uVar8 = (ushort)*(uint *)(param_1 + 0x10);
    if (iVar10 + -0x10 == 0) {
      puVar3 = *(undefined4 **)(param_1 + 0x18);
      *(undefined4 *)(param_1 + 0x14) = 0x20;
      if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
        *(undefined4 *)(param_1 + 0x14) = 1;
        *(undefined4 *)(param_1 + 0x10) = 0;
        *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
      }
      else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
        param_1[4] = (bf_read)0x1;
        *(undefined4 *)(param_1 + 0x10) = 0;
      }
      else {
        *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
        *(undefined4 *)(param_1 + 0x10) = *puVar3;
      }
    }
    else {
      *(uint *)(param_1 + 0x10) = *(uint *)(param_1 + 0x10) >> 0x10;
    }
LAB_000b7ba9:
    this_00 = (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)
              (int)(short)uVar8;
    *(CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> **)(this + 100) =
         this_00;
    if (0 < (int)this_00) {
                    /* try { // try from 000b7bb8 to 000b7c56 has its CatchHandler @ 000b8063 */
      iVar10 = Q_log2((uint)this_00);
      uVar2 = *(uint *)(param_1 + 0x10);
      SVar12 = (SVC_ClassInfo)((byte)uVar2 & 1);
      pbVar1 = param_1 + 0x14;
      *(int *)pbVar1 = *(int *)pbVar1 + -1;
      if (*(int *)pbVar1 == 0) {
        puVar3 = *(undefined4 **)(param_1 + 0x18);
        *(undefined4 *)(param_1 + 0x14) = 0x20;
        if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
          *(undefined4 *)(param_1 + 0x14) = 1;
          *(undefined4 *)(param_1 + 0x10) = 0;
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
          goto LAB_000b7d15;
        }
        if (puVar3 <= *(undefined4 **)(param_1 + 0x1c)) {
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
          *(undefined4 *)(param_1 + 0x10) = *puVar3;
          goto LAB_000b7d15;
        }
        param_1[4] = (bf_read)0x1;
        *(undefined4 *)(param_1 + 0x10) = 0;
        this[0x4c] = SVar12;
      }
      else {
        *(uint *)(param_1 + 0x10) = uVar2 >> 1;
LAB_000b7d15:
        this[0x4c] = SVar12;
      }
      if ((uVar2 & 1) == 0) {
        local_244 = 0;
        iVar10 = iVar10 + 1;
        if (0 < *(int *)(this + 100)) {
          do {
            iVar9 = *(int *)(param_1 + 0x14);
            if (iVar9 < iVar10) {
              local_224 = *(uint *)(param_1 + 0x10);
              puVar5 = *(uint **)(param_1 + 0x18);
              if (puVar5 == *(uint **)(param_1 + 0x1c)) {
                *(undefined4 *)(param_1 + 0x14) = 1;
                *(uint **)(param_1 + 0x18) = puVar5 + 1;
                local_224 = 0;
                *(undefined4 *)(param_1 + 0x10) = 0;
                param_1[4] = (bf_read)0x1;
              }
              else {
                if (*(uint **)(param_1 + 0x1c) < puVar5) {
                  param_1[4] = (bf_read)0x1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                }
                else {
                  *(uint **)(param_1 + 0x18) = puVar5 + 1;
                  uVar2 = *puVar5;
                  *(uint *)(param_1 + 0x10) = uVar2;
                  if (param_1[4] == (bf_read)0x0) {
                    iVar11 = iVar10 - iVar9;
                    local_224 = ((&CBitBuffer::s_nMaskTable)[iVar11] & uVar2) <<
                                ((byte)iVar9 & 0x1f) | local_224;
                    *(int *)(param_1 + 0x14) = 0x20 - iVar11;
                    *(uint *)(param_1 + 0x10) = uVar2 >> ((byte)iVar11 & 0x1f);
                    goto LAB_000b7d81;
                  }
                }
                local_224 = 0;
              }
            }
            else {
              local_224 = (&CBitBuffer::s_nMaskTable)[iVar10];
              *(int *)(param_1 + 0x14) = iVar9 - iVar10;
              local_224 = local_224 & *(uint *)(param_1 + 0x10);
              if (iVar9 - iVar10 == 0) {
                puVar3 = *(undefined4 **)(param_1 + 0x18);
                *(undefined4 *)(param_1 + 0x14) = 0x20;
                if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
                  *(undefined4 *)(param_1 + 0x14) = 1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                }
                else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
                  param_1[4] = (bf_read)0x1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                }
                else {
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                  *(undefined4 *)(param_1 + 0x10) = *puVar3;
                }
              }
              else {
                local_240 = (byte)iVar10;
                *(uint *)(param_1 + 0x10) = *(uint *)(param_1 + 0x10) >> (local_240 & 0x1f);
              }
            }
LAB_000b7d81:
                    /* try { // try from 000b7dac to 000b7df6 has its CatchHandler @ 000b8063 */
            CBitRead::ReadString((CBitRead *)param_1,local_120,0x100,false,(int *)0x0);
            CBitRead::ReadString((CBitRead *)param_1,local_220,0x100,false,(int *)0x0);
            this_00 = (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)
                      (this + 0x50);
            CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>>::InsertBefore
                      (this_00,*(int *)(this + 0x5c),(class_s *)&local_224);
            local_244 = local_244 + 1;
          } while (local_244 < *(int *)(this + 100));
        }
      }
      bVar13 = (byte)param_1[4] ^ 1;
      pcVar14 = (char *)this_00;
      goto LAB_000b7c59;
    }
  }
  pcVar14 = "SVC_ClassInfo::ReadFromBuffer:  bad numserverclasses %d\n";
  Warning("SVC_ClassInfo::ReadFromBuffer:  bad numserverclasses %d\n",this_00);
  bVar13 = 0;
LAB_000b7c59:
  iVar10 = _DAT_0040b9d4;
  if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
     (iVar9 = ThreadGetCurrentId(), iVar10 == iVar9)) {
    pcVar14 = (char *)_DAT_0040b030;
    cVar7 = CVProfNode::ExitScope();
    if (cVar7 != '\0') {
      _DAT_0040b030 =
           *(CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> **)
            (_DAT_0040b030 + 100);
    }
    DAT_0040b02c = _DAT_0040b030 ==
                   (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)
                   0x40b034;
  }
  if (local_228 != (CUtlVector<SVC_ClassInfo::class_s,CUtlMemory<SVC_ClassInfo::class_s,int>> *)0x0)
  {
    pcVar14 = (char *)local_228;
    (**(code **)(local_228 + 0x54))(local_228,local_230,local_22c,0,0,0);
  }
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return bVar13;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(pcVar14);
}

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)