L L4D2node

CNetChan::ProcessPacketHeader

0x001b0ce0 · 2784 bytes · __thiscall

_ZN8CNetChan19ProcessPacketHeaderEP11netpacket_s

Decompiled

undefined (2 params)

/* CNetChan::ProcessPacketHeader(netpacket_s*) */

uint __thiscall CNetChan::ProcessPacketHeader(CNetChan *this,netpacket_s *param_1)

{
  int *piVar1;
  undefined4 *puVar2;
  int iVar3;
  uint *puVar4;
  uint uVar5;
  char cVar6;
  int iVar7;
  undefined4 uVar8;
  undefined4 uVar9;
  int iVar10;
  uint *puVar11;
  uint *puVar12;
  uint uVar13;
  uint uVar14;
  CNetChan *pCVar15;
  uint local_40;
  uint local_3c;
  uint local_38;
  uint local_34;
  uint local_30;
  ulong local_20 [4];
  
  iVar7 = *(int *)(param_1 + 0x30);
  if (iVar7 < 0x20) {
    puVar4 = *(uint **)(param_1 + 0x34);
    puVar12 = *(uint **)(param_1 + 0x38);
    local_3c = *(uint *)(param_1 + 0x2c);
    if (puVar4 == puVar12) {
      puVar11 = puVar4 + 1;
      *(undefined4 *)(param_1 + 0x30) = 1;
      iVar7 = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar11;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else {
      if (puVar4 <= puVar12) {
        puVar11 = puVar4 + 1;
        *(uint **)(param_1 + 0x34) = puVar11;
        local_38 = *puVar4;
        *(uint *)(param_1 + 0x2c) = local_38;
        if (param_1[0x20] == (netpacket_s)0x0) {
          *(int *)(param_1 + 0x30) = iVar7;
          uVar14 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & local_38;
          local_38 = local_38 >> ((byte)(0x20 - iVar7) & 0x1f);
          *(uint *)(param_1 + 0x2c) = local_38;
          local_3c = uVar14 << ((byte)iVar7 & 0x1f) | local_3c;
        }
        else {
          local_3c = 0;
        }
        goto LAB_001b0ebe;
      }
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      puVar11 = puVar4;
    }
    local_38 = 0;
    local_3c = 0;
LAB_001b0ebe:
    if (puVar11 == puVar12) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      iVar7 = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar11 + 1;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else {
      if (puVar11 <= puVar12) {
        *(uint **)(param_1 + 0x34) = puVar11 + 1;
        uVar14 = *puVar11;
        *(uint *)(param_1 + 0x2c) = uVar14;
        if (param_1[0x20] == (netpacket_s)0x0) {
          *(int *)(param_1 + 0x30) = iVar7;
          uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar14;
          uVar14 = uVar14 >> ((byte)(0x20 - iVar7) & 0x1f);
          *(uint *)(param_1 + 0x2c) = uVar14;
          local_38 = uVar13 << ((byte)iVar7 & 0x1f) | local_38;
        }
        else {
          local_38 = 0;
        }
        goto joined_r0x001b0ee3;
      }
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
    uVar14 = 0;
    local_38 = 0;
joined_r0x001b0ee3:
    if (iVar7 < 8) {
      puVar12 = *(uint **)(param_1 + 0x38);
      goto LAB_001b0eec;
    }
    *(int *)(param_1 + 0x30) = iVar7 + -8;
    local_30 = uVar14 & 0xff;
    if (iVar7 + -8 != 0) {
LAB_001b1090:
      *(uint *)(param_1 + 0x2c) = uVar14 >> 8;
      goto LAB_001b0f0f;
    }
    puVar2 = *(undefined4 **)(param_1 + 0x34);
    *(undefined4 *)(param_1 + 0x30) = 0x20;
    if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
      goto LAB_001b0f0f;
    }
    if (puVar2 <= *(undefined4 **)(param_1 + 0x38)) {
      *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
      *(undefined4 *)(param_1 + 0x2c) = *puVar2;
      goto LAB_001b0f0f;
    }
    param_1[0x20] = (netpacket_s)0x1;
    *(undefined4 *)(param_1 + 0x2c) = 0;
    cVar6 = NET_IsMultiplayer();
  }
  else {
    iVar10 = iVar7 + -0x20;
    *(int *)(param_1 + 0x30) = iVar10;
    local_3c = *(uint *)(param_1 + 0x2c);
    if (iVar10 != 0) {
      *(undefined4 *)(param_1 + 0x2c) = 0;
      if (iVar10 < 0x20) {
        local_38 = 0;
        puVar11 = *(uint **)(param_1 + 0x34);
        puVar12 = *(uint **)(param_1 + 0x38);
        iVar7 = iVar10;
        goto LAB_001b0ebe;
      }
      iVar7 = iVar7 + -0x40;
      *(int *)(param_1 + 0x30) = iVar7;
      if (iVar7 == 0) {
        local_38 = 0;
        puVar12 = *(uint **)(param_1 + 0x38);
        puVar11 = *(uint **)(param_1 + 0x34);
        goto LAB_001b1063;
      }
      uVar14 = 0;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      local_38 = 0;
      goto joined_r0x001b0ee3;
    }
    puVar11 = *(uint **)(param_1 + 0x34);
    *(undefined4 *)(param_1 + 0x30) = 0x20;
    puVar12 = *(uint **)(param_1 + 0x38);
    if (puVar11 == puVar12) {
      puVar11 = puVar11 + 1;
      *(undefined4 *)(param_1 + 0x30) = 1;
      local_38 = 0;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      iVar7 = 1;
      *(uint **)(param_1 + 0x34) = puVar11;
      goto LAB_001b0ebe;
    }
    if (puVar11 < puVar12) {
      *(uint **)(param_1 + 0x34) = puVar11 + 1;
      local_38 = *puVar11;
      *(uint *)(param_1 + 0x2c) = local_38;
      puVar11 = puVar11 + 1;
    }
    else {
      local_38 = 0;
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
LAB_001b1063:
    *(undefined4 *)(param_1 + 0x30) = 0x20;
    if (puVar11 != puVar12) {
      if (puVar12 < puVar11) {
        uVar14 = 0;
        param_1[0x20] = (netpacket_s)0x1;
      }
      else {
        *(uint **)(param_1 + 0x34) = puVar11 + 1;
        uVar14 = *puVar11;
      }
      *(undefined4 *)(param_1 + 0x30) = 0x18;
      local_30 = uVar14 & 0xff;
      goto LAB_001b1090;
    }
    uVar14 = 0;
    *(uint **)(param_1 + 0x34) = puVar12 + 1;
    iVar7 = 1;
    *(undefined4 *)(param_1 + 0x30) = 1;
    *(undefined4 *)(param_1 + 0x2c) = 0;
LAB_001b0eec:
    puVar4 = *(uint **)(param_1 + 0x34);
    if (puVar4 == puVar12) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar12 + 1;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else if (puVar12 < puVar4) {
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
    else {
      *(uint **)(param_1 + 0x34) = puVar4 + 1;
      uVar13 = *puVar4;
      *(uint *)(param_1 + 0x2c) = uVar13;
      if (param_1[0x20] == (netpacket_s)0x0) {
        uVar5 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
        uVar8 = *(undefined4 *)(param_1 + 0x30);
        *(int *)(param_1 + 0x30) = iVar7 + 0x18;
        *(uint *)(param_1 + 0x2c) = uVar13 >> ((byte)(8 - iVar7) & 0x1f);
        local_30 = (uVar5 & uVar13) << ((byte)uVar8 & 0x1f) | uVar14;
        goto LAB_001b0f0f;
      }
    }
    local_30 = 0;
LAB_001b0f0f:
    cVar6 = NET_IsMultiplayer();
  }
  if (cVar6 != '\0') {
    iVar7 = *(int *)(param_1 + 0x30);
    if (iVar7 < 0x10) {
      puVar4 = *(uint **)(param_1 + 0x34);
      uVar8 = *(undefined4 *)(param_1 + 0x2c);
      if (puVar4 == *(uint **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(uint **)(param_1 + 0x34) = puVar4 + 1;
        param_1[0x20] = (netpacket_s)0x1;
      }
      else if (*(uint **)(param_1 + 0x38) < puVar4) {
        param_1[0x20] = (netpacket_s)0x1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
      }
      else {
        *(uint **)(param_1 + 0x34) = puVar4 + 1;
        uVar14 = *puVar4;
        *(uint *)(param_1 + 0x2c) = uVar14;
        if (param_1[0x20] == (netpacket_s)0x0) {
          uVar13 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar7];
          *(int *)(param_1 + 0x30) = iVar7 + 0x10;
          local_34._0_2_ = (ushort)((uVar13 & uVar14) << ((byte)iVar7 & 0x1f)) | (ushort)uVar8;
          *(uint *)(param_1 + 0x2c) = uVar14 >> ((byte)(0x10 - iVar7) & 0x1f);
          goto LAB_001b0f70;
        }
      }
      local_34._0_2_ = 0;
    }
    else {
      *(int *)(param_1 + 0x30) = iVar7 + -0x10;
      local_34._0_2_ = (ushort)*(uint *)(param_1 + 0x2c);
      if (iVar7 + -0x10 == 0) {
        puVar2 = *(undefined4 **)(param_1 + 0x34);
        *(undefined4 *)(param_1 + 0x30) = 0x20;
        if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
          *(undefined4 *)(param_1 + 0x30) = 1;
          *(undefined4 *)(param_1 + 0x2c) = 0;
          *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
        }
        else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
          param_1[0x20] = (netpacket_s)0x1;
          *(undefined4 *)(param_1 + 0x2c) = 0;
        }
        else {
          *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
          *(undefined4 *)(param_1 + 0x2c) = *puVar2;
        }
      }
      else {
        *(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 0x10;
      }
    }
LAB_001b0f70:
    iVar7 = *(int *)(param_1 + 0x3c);
    if (iVar7 == 0) {
      uVar14 = *(uint *)(param_1 + 0x28);
      iVar10 = 0;
    }
    else {
      uVar14 = *(uint *)(param_1 + 0x28);
      iVar3 = (((uint)(*(int *)(param_1 + 0x34) - iVar7) >> 2) * 0x20 - *(int *)(param_1 + 0x30)) +
              (uVar14 & 3) * 8;
      iVar10 = *(int *)(param_1 + 0x24);
      if (iVar3 <= *(int *)(param_1 + 0x24)) {
        iVar10 = iVar3;
      }
      iVar10 = iVar10 >> 3;
    }
    CRC32_Init(local_20);
    CRC32_ProcessBuffer(local_20,(void *)(iVar7 + iVar10),uVar14 - iVar10);
    CRC32_Final(local_20);
    if ((ushort)local_34 != (ushort)((ushort)local_20[0] ^ (ushort)(local_20[0] >> 0x10))) {
      uVar8 = *(undefined4 *)(this + 0xc);
      uVar9 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
      ConMsg("%s:corrupted packet %i at %i\n",uVar9,local_3c,uVar8);
      return 0xffffffff;
    }
  }
  iVar7 = *(int *)(param_1 + 0x30);
  if (iVar7 < 8) {
    puVar4 = *(uint **)(param_1 + 0x34);
    local_34 = *(uint *)(param_1 + 0x2c);
    if (puVar4 == *(uint **)(param_1 + 0x38)) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar4 + 1;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else if (*(uint **)(param_1 + 0x38) < puVar4) {
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
    else {
      *(uint **)(param_1 + 0x34) = puVar4 + 1;
      uVar14 = *puVar4;
      *(uint *)(param_1 + 0x2c) = uVar14;
      if (param_1[0x20] == (netpacket_s)0x0) {
        uVar13 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
        *(int *)(param_1 + 0x30) = iVar7 + 0x18;
        *(uint *)(param_1 + 0x2c) = uVar14 >> ((byte)(8 - iVar7) & 0x1f);
        local_34 = (uVar13 & uVar14) << ((byte)iVar7 & 0x1f) | local_34;
        goto LAB_001b0dc6;
      }
    }
    local_34 = 0;
  }
  else {
    *(int *)(param_1 + 0x30) = iVar7 + -8;
    local_34 = *(uint *)(param_1 + 0x2c) & 0xff;
    if (iVar7 + -8 == 0) {
      puVar2 = *(undefined4 **)(param_1 + 0x34);
      *(undefined4 *)(param_1 + 0x30) = 0x20;
      if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
      }
      else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
        param_1[0x20] = (netpacket_s)0x1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
      }
      else {
        *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
        *(undefined4 *)(param_1 + 0x2c) = *puVar2;
      }
    }
    else {
      *(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 8;
    }
  }
LAB_001b0dc6:
  local_40 = 0;
  if ((local_30 & 0x10) != 0) {
    iVar7 = *(int *)(param_1 + 0x30);
    if (iVar7 < 8) {
      puVar4 = *(uint **)(param_1 + 0x34);
      uVar14 = *(uint *)(param_1 + 0x2c);
      if (puVar4 == *(uint **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(uint **)(param_1 + 0x34) = puVar4 + 1;
        param_1[0x20] = (netpacket_s)0x1;
      }
      else {
        if (puVar4 <= *(uint **)(param_1 + 0x38)) {
          *(uint **)(param_1 + 0x34) = puVar4 + 1;
          uVar13 = *puVar4;
          *(uint *)(param_1 + 0x2c) = uVar13;
          if (param_1[0x20] == (netpacket_s)0x0) {
            uVar5 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
            *(int *)(param_1 + 0x30) = iVar7 + 0x18;
            *(uint *)(param_1 + 0x2c) = uVar13 >> ((byte)(8 - iVar7) & 0x1f);
            local_40 = (uVar5 & uVar13) << ((byte)iVar7 & 0x1f) | uVar14;
          }
          goto LAB_001b0e20;
        }
        param_1[0x20] = (netpacket_s)0x1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
      }
      local_40 = 0;
    }
    else {
      *(int *)(param_1 + 0x30) = iVar7 + -8;
      local_40 = *(uint *)(param_1 + 0x2c) & 0xff;
      if (iVar7 + -8 == 0) {
        puVar2 = *(undefined4 **)(param_1 + 0x34);
        *(undefined4 *)(param_1 + 0x30) = 0x20;
        if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
          *(undefined4 *)(param_1 + 0x30) = 1;
          *(undefined4 *)(param_1 + 0x2c) = 0;
          *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
        }
        else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
          param_1[0x20] = (netpacket_s)0x1;
          *(undefined4 *)(param_1 + 0x2c) = 0;
        }
        else {
          *(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
          *(undefined4 *)(param_1 + 0x2c) = *puVar2;
        }
      }
      else {
        *(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 8;
      }
    }
  }
LAB_001b0e20:
  uVar14 = *(uint *)(this + 0xc);
  if ((int)local_3c <= (int)uVar14) {
    if (*(int *)(net_showdrop._28_4_ + 0x30) != 0) {
      if (uVar14 == local_3c) {
        uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
        ConMsg("%s:duplicate packet %i at %i\n",uVar8,local_3c,local_3c);
        return 0xffffffff;
      }
      uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
      ConMsg("%s:out of order packet %i at %i\n",uVar8,local_3c,uVar14);
    }
    return 0xffffffff;
  }
  iVar7 = ~(uVar14 + local_40) + local_3c;
  *(int *)(this + 0x41dc) = iVar7;
  if ((0 < iVar7) && (*(int *)(net_showdrop._28_4_ + 0x30) != 0)) {
    uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
    ConMsg("%s:Dropped %i packets at %i\n",uVar8,iVar7,local_3c);
  }
  iVar7 = 0;
  pCVar15 = this + 0x344;
  do {
    while (uVar14 = *(uint *)(this + 0x14), (1 << ((byte)iVar7 & 0x1f) & (local_34 ^ uVar14)) == 0)
    {
      if (*(int *)(pCVar15 + 0x14) != 3) {
        if ((int)local_38 < *(int *)(pCVar15 + 0x10)) {
          uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
          ConMsg("%s:reliable state invalid (%i).\n",uVar8,iVar7);
          return 0xffffffff;
        }
        if (*(int *)(pCVar15 + 0x14) != 2) goto LAB_001b112d;
        iVar10 = 0;
        do {
          if (*(int *)(pCVar15 + iVar10 + 8) != 0) {
            iVar3 = **(int **)(this + iVar10 * 5 + 0xbc);
            piVar1 = (int *)(iVar3 + 0x128);
            *piVar1 = *piVar1 + *(int *)(pCVar15 + iVar10 + 8);
            piVar1 = (int *)(iVar3 + 300);
            *piVar1 = *piVar1 - *(int *)(pCVar15 + iVar10 + 8);
          }
          iVar10 = iVar10 + 4;
        } while (iVar10 != 8);
      }
LAB_001b1188:
      iVar7 = iVar7 + 1;
      *(undefined4 *)(pCVar15 + 0x14) = 0;
      *(undefined4 *)(pCVar15 + 0x10) = 0xffffffff;
      *(undefined4 *)(pCVar15 + 8) = 0;
      *(undefined4 *)pCVar15 = 0xffffffff;
      *(undefined4 *)(pCVar15 + 0xc) = 0;
      *(undefined4 *)(pCVar15 + 4) = 0xffffffff;
      pCVar15 = pCVar15 + 0x1c;
      if (iVar7 == 8) goto LAB_001b11c1;
    }
    if (*(int *)(pCVar15 + 0x10) <= (int)local_38) {
      if (*(int *)(pCVar15 + 0x14) == 2) {
        if (*(int *)(net_showfragments._28_4_ + 0x30) != 0) {
          ConMsg("Resending subchan %i: start %i, num %i\n",*(undefined4 *)(pCVar15 + 0x18),
                 *(undefined4 *)pCVar15,*(undefined4 *)(pCVar15 + 8));
        }
        *(undefined4 *)(pCVar15 + 0x14) = 1;
      }
      else if (*(int *)(pCVar15 + 0x14) == 3) {
        uVar13 = 1 << ((byte)*(undefined4 *)(pCVar15 + 0x18) & 0x1f);
        if ((uVar13 & uVar14) == 0) {
          *(uint *)(this + 0x14) = uVar13 | uVar14;
        }
        else {
          *(uint *)(this + 0x14) = ~uVar13 & uVar14;
        }
        goto LAB_001b1188;
      }
    }
LAB_001b112d:
    iVar7 = iVar7 + 1;
    pCVar15 = pCVar15 + 0x1c;
  } while (iVar7 != 8);
LAB_001b11c1:
  *(uint *)(this + 0xc) = local_3c;
  *(uint *)(this + 0x10) = local_38;
  netadr_s::ToString((netadr_s *)param_1,false);
  CheckWaitingList(this,0);
  CheckWaitingList(this,1);
  FlowNewPacket(this,1,*(int *)(this + 0xc),*(int *)(this + 0x10),local_40,*(int *)(this + 0x41dc),
                *(int *)(param_1 + 0x44) + 0x1c);
  return local_30;
}

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)