L L4D2node

NET_ReceiveDatagram

0x001c67d0 · 2663 bytes · __cdecl

_Z19NET_ReceiveDatagramiP11netpacket_s

Decompiled

undefined (2 params)

/* NET_ReceiveDatagram(int, netpacket_s*) */

undefined4 NET_ReceiveDatagram(int param_1,netpacket_s *param_2)

{
  byte bVar1;
  undefined4 *puVar2;
  uint uVar3;
  char cVar4;
  int iVar5;
  size_t sVar6;
  undefined4 uVar7;
  size_t sVar8;
  ushort *puVar9;
  void *__dest;
  uchar *puVar10;
  uint uVar11;
  int *piVar12;
  uint uVar13;
  uint uVar14;
  uint *puVar15;
  undefined4 uVar16;
  int iVar17;
  int in_GS_OFFSET;
  bool bVar18;
  size_t local_207c;
  undefined4 local_206c;
  int local_2068 [2];
  uint local_2060;
  uint local_205c;
  undefined1 local_2058;
  sockaddr local_2050;
  uchar *local_2040;
  uint local_203c;
  int local_2038;
  int local_2034;
  uchar local_2030 [4096];
  uchar *local_1030;
  size_t local_102c;
  undefined4 local_1028;
  undefined4 local_1024;
  uchar local_1020 [4096];
  int local_20;
  
  local_2050.sa_family = 0;
  local_2050.sa_data[0] = '\0';
  local_2050.sa_data[1] = '\0';
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_2050.sa_data[2] = '\0';
  local_2050.sa_data[3] = '\0';
  local_2050.sa_data[4] = '\0';
  local_2050.sa_data[5] = '\0';
  local_2050.sa_data[6] = '\0';
  local_2050.sa_data[7] = '\0';
  local_2050.sa_data[8] = '\0';
  local_2050.sa_data[9] = '\0';
  local_2050.sa_data[10] = '\0';
  local_2050.sa_data[0xb] = '\0';
  local_2050.sa_data[0xc] = '\0';
  local_2050.sa_data[0xd] = '\0';
  local_206c = 0x10;
  iVar5 = (**(code **)(*(int *)g_pSteamSocketMgr + 0x18))
                    (g_pSteamSocketMgr,
                     *(undefined4 *)(*(int *)(param_2 + 0xc) * 0x10 + net_sockets + 8),
                     *(undefined4 *)(param_2 + 0x18),0x37ab0,0,&local_2050,&local_206c);
  netadr_s::SetFromSockadr((netadr_s *)param_2,&local_2050);
  if (iVar5 < 1) {
    uVar16 = 0;
    if (iVar5 != -1) goto LAB_001c69f8;
    NET_GetLastError();
    if (net_error == 0x5a) {
      uVar7 = NET_ErrorString(0x5a);
      ConDMsg("NET_ReceivePacket: %s\n",uVar7);
      goto LAB_001c69f8;
    }
    if (net_error < 0x5b) {
      if (net_error == 0xb) goto LAB_001c6f51;
    }
    else if ((net_error == 0x68) || (net_error == 0x6f)) {
LAB_001c6f51:
      uVar16 = 0;
      goto LAB_001c69f8;
    }
    uVar16 = 0;
    uVar7 = NET_ErrorString(net_error);
    ConDMsg("NET_ReceivePacket: %s\n",uVar7);
    goto LAB_001c69f8;
  }
  bVar18 = net_dedicatedForXbox != '\0';
  local_2040 = local_2030;
  *(int *)(param_2 + 0x44) = iVar5;
  local_203c = 0x1000;
  local_2038 = -1;
  local_2034 = 0x1000;
  if ((bVar18) && (net_dedicatedForXboxInsecure == '\0')) {
    puVar9 = *(ushort **)(param_2 + 0x18);
    if (*puVar9 == 0xffff) goto LAB_001c69a8;
    uVar11 = (uint)*puVar9;
    uVar13 = (iVar5 - uVar11) - 2;
    if ((int)uVar13 < 1) {
      uVar14 = 0;
LAB_001c6e1f:
      _V_memmove(puVar9,puVar9 + 1,uVar11);
      *(uint *)(param_2 + 0x40) = uVar11;
      goto LAB_001c69b9;
    }
    puVar9 = (ushort *)((int)puVar9 + uVar11 + 2);
    uVar14 = (uint)*puVar9;
    puVar9 = puVar9 + 1;
    local_2060 = 0x1000;
                    /* try { // try from 001c6918 to 001c69e7 has its CatchHandler @ 001c7266 */
    cVar4 = CLZSS::IsCompressed((CLZSS *)local_2068,(uchar *)puVar9);
    iVar5 = local_2034;
    uVar3 = local_203c;
    if (cVar4 == '\0') {
      if ((int)local_203c < (int)uVar13) {
        if (local_2038 < 0) {
          local_2038 = local_2034;
          if (local_203c == 0) {
            local_2040 = (uchar *)0x0;
          }
          else {
            puVar10 = malloc(local_203c);
            memcpy(puVar10,local_2040,uVar3);
            local_2040 = puVar10;
          }
          if (iVar5 < 0) goto LAB_001c6e00;
        }
        local_203c = uVar13;
        if (local_2040 == (uchar *)0x0) {
          local_2040 = malloc(uVar13);
        }
        else {
          local_2040 = realloc(local_2040,uVar13);
        }
      }
LAB_001c6e00:
      _V_memcpy(local_2040,puVar9,uVar13);
LAB_001c6e1c:
      puVar9 = *(ushort **)(param_2 + 0x18);
      goto LAB_001c6e1f;
    }
    local_207c = 0;
    if (8 < uVar13) {
      local_207c = CLZSS::GetActualSize((CLZSS *)local_2068,(uchar *)puVar9);
    }
    iVar5 = local_2034;
    uVar3 = local_203c;
    if (local_207c == uVar14 + 7 >> 3) {
      if ((int)local_203c < (int)local_207c) {
        if (local_2038 < 0) {
          local_2038 = local_2034;
          if (local_203c == 0) {
            local_2040 = (uchar *)0x0;
          }
          else {
            puVar10 = malloc(local_203c);
            memcpy(puVar10,local_2040,uVar3);
            local_2040 = puVar10;
          }
          if (iVar5 < 0) goto LAB_001c6962;
        }
        local_203c = local_207c;
        if (local_2040 == (uchar *)0x0) {
          local_2040 = malloc(local_207c);
        }
        else {
          local_2040 = realloc(local_2040,local_207c);
        }
      }
LAB_001c6962:
      sVar6 = CLZSS::SafeUncompress
                        ((CLZSS *)local_2068,(uchar *)puVar9,uVar13,local_2040,local_207c);
      if (local_207c == sVar6) goto LAB_001c6e1c;
    }
    goto LAB_001c69a0;
  }
LAB_001c69a8:
  *(int *)(param_2 + 0x40) = iVar5;
  if (0x37aaf < iVar5) {
                    /* try { // try from 001c6a7b to 001c6ba5 has its CatchHandler @ 001c7266 */
    uVar16 = netadr_s::ToString((netadr_s *)param_2,false);
    ConDMsg("NET_ReceiveDatagram:  Oversize packet from %s\n",uVar16);
    uVar16 = 0;
    CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_2040);
    goto LAB_001c69f8;
  }
  uVar14 = 0;
LAB_001c69b9:
  piVar12 = *(int **)(param_2 + 0x18);
  iVar5 = *piVar12;
  if (iVar5 == -2) {
    uVar16 = NET_GetLong(param_1,param_2);
    if ((char)uVar16 != '\0') {
      piVar12 = *(int **)(param_2 + 0x18);
      iVar5 = *piVar12;
      goto LAB_001c69c7;
    }
  }
  else {
LAB_001c69c7:
    if (iVar5 == -3) {
      if (((4 < *(uint *)(param_2 + 0x40)) &&
          (uVar11 = *(uint *)(param_2 + 0x40) - 4, uVar11 < 0x37aa1)) &&
         (local_2060 = 0x1000, 8 < uVar11)) {
        sVar6 = CLZSS::GetActualSize((CLZSS *)local_2068,(uchar *)(piVar12 + 1));
        if (sVar6 - 1 < 0x37aa0) {
          puVar10 = local_1020;
          local_102c = 0x1000;
          local_1028 = 0xffffffff;
          local_1024 = 0x1000;
          if (0x1000 < (int)sVar6) {
            local_1028 = 0x1000;
            local_1030 = puVar10;
            __dest = malloc(0x1000);
            memcpy(__dest,puVar10,0x1000);
            local_1030 = __dest;
            local_102c = sVar6;
            puVar10 = realloc(__dest,sVar6);
          }
          local_1030 = puVar10;
                    /* try { // try from 001c6c19 to 001c6c1d has its CatchHandler @ 001c7240 */
          sVar8 = CLZSS::SafeUncompress
                            ((CLZSS *)local_2068,(uchar *)(piVar12 + 1),uVar11,puVar10,sVar6);
          if ((sVar6 != sVar8) || (sVar8 == 0)) {
            uVar16 = 0;
            CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_1030);
            goto LAB_001c69ea;
          }
                    /* try { // try from 001c7048 to 001c704c has its CatchHandler @ 001c7240 */
          _V_memcpy(*(void **)(param_2 + 0x18),local_1030,sVar8);
          *(size_t *)(param_2 + 0x40) = sVar8;
          CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_1030);
          goto LAB_001c69d0;
        }
      }
LAB_001c69a0:
      uVar16 = 0;
    }
    else {
LAB_001c69d0:
      if (uVar14 != 0) {
        bVar1 = *(byte *)(*(int *)(param_2 + 0x18) + 8);
        iVar5 = *(int *)(param_2 + 0x40);
        cVar4 = ShouldChecksumPackets();
        if (cVar4 != '\0') {
          CBitRead::Seek((CBitRead *)(param_2 + 0x1c),0x48);
          iVar17 = *(int *)(param_2 + 0x30);
          uVar11 = *(uint *)(param_2 + 0x2c);
          if (iVar17 < 0x10) {
            puVar15 = *(uint **)(param_2 + 0x34);
            if (puVar15 == *(uint **)(param_2 + 0x38)) {
              *(undefined4 *)(param_2 + 0x30) = 1;
              uVar13 = 0;
              *(undefined4 *)(param_2 + 0x2c) = 0;
              *(uint **)(param_2 + 0x34) = puVar15 + 1;
              param_2[0x20] = (netpacket_s)0x1;
            }
            else {
              if (*(uint **)(param_2 + 0x38) < puVar15) {
                param_2[0x20] = (netpacket_s)0x1;
                *(undefined4 *)(param_2 + 0x2c) = 0;
              }
              else {
                *(uint **)(param_2 + 0x34) = puVar15 + 1;
                uVar3 = *puVar15;
                *(uint *)(param_2 + 0x2c) = uVar3;
                if (param_2[0x20] == (netpacket_s)0x0) {
                  uVar13 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar17];
                  *(int *)(param_2 + 0x30) = iVar17 + 0x10;
                  uVar13 = (uVar13 & uVar3) << ((byte)iVar17 & 0x1f) | uVar11;
                  *(uint *)(param_2 + 0x2c) = uVar3 >> ((byte)(0x10 - iVar17) & 0x1f);
                  goto LAB_001c6b0f;
                }
              }
              uVar13 = 0;
            }
          }
          else {
            *(int *)(param_2 + 0x30) = iVar17 + -0x10;
            uVar13 = uVar11 & 0xffff;
            if (iVar17 + -0x10 == 0) {
              puVar2 = *(undefined4 **)(param_2 + 0x34);
              *(undefined4 *)(param_2 + 0x30) = 0x20;
              if (puVar2 == *(undefined4 **)(param_2 + 0x38)) {
                *(undefined4 *)(param_2 + 0x30) = 1;
                *(undefined4 *)(param_2 + 0x2c) = 0;
                *(undefined4 **)(param_2 + 0x34) = puVar2 + 1;
              }
              else if (*(undefined4 **)(param_2 + 0x38) < puVar2) {
                param_2[0x20] = (netpacket_s)0x1;
                *(undefined4 *)(param_2 + 0x2c) = 0;
              }
              else {
                *(undefined4 **)(param_2 + 0x34) = puVar2 + 1;
                *(undefined4 *)(param_2 + 0x2c) = *puVar2;
              }
            }
            else {
              *(uint *)(param_2 + 0x2c) = uVar11 >> 0x10;
            }
          }
LAB_001c6b0f:
          CBitRead::Seek((CBitRead *)(param_2 + 0x1c),0);
          if (*(int *)(param_2 + 0x40) - 0xcU < 0x37aa0) {
                    /* try { // try from 001c6ea6 to 001c6fd3 has its CatchHandler @ 001c7266 */
            uVar11 = BufferToShortChecksum
                               ((void *)(*(int *)(param_2 + 0x18) + 0xb),
                                *(int *)(param_2 + 0x40) - 0xb);
            if ((uVar11 & 0xffff) == uVar13) goto LAB_001c6c48;
            ConMsg("corrupted packet detected\n");
            uVar16 = 0;
          }
          else {
            ConMsg("corrupted packet detected (checksumbytes %d)\n");
            uVar16 = 0;
          }
          goto LAB_001c69ea;
        }
LAB_001c6c48:
                    /* try { // try from 001c6c51 to 001c6e37 has its CatchHandler @ 001c7266 */
        bf_write::bf_write((bf_write *)local_2068);
        bf_write::SetDebugName((bf_write *)local_2068,"X360 Fixup");
        bf_write::StartWriting
                  ((bf_write *)local_2068,*(void **)(param_2 + 0x18),0x37ab0,
                   iVar5 * 8 - ((int)(uint)bVar1 >> 5),-1);
        bf_write::WriteBits((bf_write *)local_2068,local_2040,uVar14);
        if ((int)local_205c % 8 - 1U < 2) {
          if ((int)local_2060 < (int)(local_205c + 6)) {
            local_205c = local_2060;
            local_2058 = 1;
          }
          else {
            iVar17 = ((int)local_205c >> 5) * 4;
            puVar15 = (uint *)(local_2068[0] + iVar17);
            *puVar15 = *puVar15 & *(uint *)(&DAT_003f2db8 + (local_205c & 0x1f) * 0x84);
            iVar5 = 0x20 - (local_205c & 0x1f);
            if (iVar5 < 6) {
              puVar15 = (uint *)(local_2068[0] + 4 + iVar17);
              *puVar15 = *puVar15 & (&g_BitWriteMasks)[6 - iVar5];
            }
            local_205c = local_205c + 6;
          }
        }
        *(int *)(param_2 + 0x40) = (int)(local_205c + 7) >> 3;
        cVar4 = ShouldChecksumPackets();
        if (cVar4 != '\0') {
          bf_write::SeekToBit((bf_write *)local_2068,0x48);
          uVar14 = BufferToShortChecksum
                             ((void *)(*(int *)(param_2 + 0x18) + 0xb),
                              *(int *)(param_2 + 0x40) - 0xb);
          if ((int)(local_205c + 0x10) <= (int)local_2060) {
            uVar11 = local_205c & 0x1f;
            iVar17 = ((int)local_205c >> 5) * 4;
            puVar15 = (uint *)(local_2068[0] + iVar17);
            *puVar15 = *puVar15 & *(uint *)(&DAT_003f2de0 + uVar11 * 0x84) |
                       (uVar14 & 0xffff) << (sbyte)uVar11;
            iVar5 = 0x20 - uVar11;
            if (iVar5 < 0x10) {
              puVar15 = (uint *)(local_2068[0] + 4 + iVar17);
              *puVar15 = (uVar14 & 0xffff) >> ((byte)iVar5 & 0x1f) |
                         (&g_BitWriteMasks)[0x10 - iVar5] & *puVar15;
            }
          }
        }
      }
      uVar16 = NET_LagPacket(true,param_2);
    }
  }
LAB_001c69ea:
  CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_2040);
LAB_001c69f8:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return uVar16;
}

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)