L L4D2node

CConnectionlessLanMgr::UnpackPacket

0x00058940 · 1618 bytes · __thiscall

_ZN21CConnectionlessLanMgr12UnpackPacketEP11netpacket_s

Decompiled

undefined (2 params)

/* CConnectionlessLanMgr::UnpackPacket(netpacket_s*) */

KeyValues * __thiscall
CConnectionlessLanMgr::UnpackPacket(CConnectionlessLanMgr *this,netpacket_s *param_1)

{
  CUtlBuffer *this_00;
  undefined4 *puVar1;
  uint *puVar2;
  undefined4 uVar3;
  char cVar4;
  uint uVar5;
  KeyValues *this_01;
  KeyValues *this_02;
  int iVar6;
  uint *puVar7;
  uint uVar8;
  uint *puVar9;
  byte local_28;
  uint local_20;
  
  if (param_1 == (netpacket_s *)0x0) {
    return (KeyValues *)0x0;
  }
  if (*(int *)(param_1 + 0x40) == 0) {
    return (KeyValues *)0x0;
  }
  if (*(int *)(param_1 + 0x18) == 0) {
    return (KeyValues *)0x0;
  }
  iVar6 = *(int *)(param_1 + 0x30);
  if (iVar6 < 0x20) {
    uVar5 = *(uint *)(param_1 + 0x2c);
    puVar7 = *(uint **)(param_1 + 0x38);
    puVar2 = *(uint **)(param_1 + 0x34);
    if (puVar2 == puVar7) {
      puVar9 = puVar2 + 1;
      *(undefined4 *)(param_1 + 0x30) = 1;
      iVar6 = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar9;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else {
      if (puVar2 < puVar7) {
        puVar9 = puVar2 + 1;
        *(uint **)(param_1 + 0x34) = puVar9;
        uVar8 = *puVar2;
        *(uint *)(param_1 + 0x2c) = uVar8;
        if (param_1[0x20] == (netpacket_s)0x0) {
          *(int *)(param_1 + 0x30) = iVar6;
          uVar5 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar6] & uVar8) << ((byte)iVar6 & 0x1f) |
                  uVar5;
          *(uint *)(param_1 + 0x2c) = uVar8 >> ((byte)(0x20 - iVar6) & 0x1f);
          goto LAB_000589ad;
        }
        goto LAB_00058c8d;
      }
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      puVar9 = puVar2;
    }
    uVar8 = 0;
LAB_00058c8d:
    if (puVar9 == puVar7) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      uVar8 = 0;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar9 + 1;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else {
      if (puVar7 < puVar9) {
        param_1[0x20] = (netpacket_s)0x1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
      }
      else {
        *(uint **)(param_1 + 0x34) = puVar9 + 1;
        uVar5 = *puVar9;
        *(uint *)(param_1 + 0x2c) = uVar5;
        if (param_1[0x20] == (netpacket_s)0x0) {
          uVar3 = *(undefined4 *)(param_1 + 0x30);
          *(int *)(param_1 + 0x30) = iVar6;
          uVar8 = (uVar5 & (&CBitBuffer::s_nMaskTable)[0x20 - iVar6]) << ((byte)uVar3 & 0x1f) |
                  uVar8;
          *(uint *)(param_1 + 0x2c) = uVar5 >> ((byte)(0x20 - iVar6) & 0x1f);
          goto LAB_000589e1;
        }
      }
      uVar8 = 0;
    }
  }
  else {
    *(int *)(param_1 + 0x30) = iVar6 + -0x20;
    uVar5 = *(uint *)(param_1 + 0x2c);
    if (iVar6 + -0x20 == 0) {
      puVar1 = *(undefined4 **)(param_1 + 0x34);
      *(undefined4 *)(param_1 + 0x30) = 0x20;
      if (puVar1 == *(undefined4 **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
      }
      else {
        if (*(undefined4 **)(param_1 + 0x38) < puVar1) {
          param_1[0x20] = (netpacket_s)0x1;
          goto LAB_000589a6;
        }
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
        *(undefined4 *)(param_1 + 0x2c) = *puVar1;
      }
    }
    else {
LAB_000589a6:
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
LAB_000589ad:
    if (uVar5 != 0) {
      return (KeyValues *)0x0;
    }
    iVar6 = *(int *)(param_1 + 0x30);
    uVar8 = *(uint *)(param_1 + 0x2c);
    if (iVar6 < 0x20) {
      puVar9 = *(uint **)(param_1 + 0x34);
      puVar7 = *(uint **)(param_1 + 0x38);
      goto LAB_00058c8d;
    }
    *(int *)(param_1 + 0x30) = iVar6 + -0x20;
    if (iVar6 + -0x20 == 0) {
      puVar1 = *(undefined4 **)(param_1 + 0x34);
      *(undefined4 *)(param_1 + 0x30) = 0x20;
      if (puVar1 == *(undefined4 **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
      }
      else {
        if (*(undefined4 **)(param_1 + 0x38) < puVar1) {
          param_1[0x20] = (netpacket_s)0x1;
          goto LAB_000589da;
        }
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
        *(undefined4 *)(param_1 + 0x2c) = *puVar1;
      }
    }
    else {
LAB_000589da:
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
  }
LAB_000589e1:
  uVar5 = (**(code **)(**(int **)(g_pMatchExtensions + 0x54) + 0x14))
                    (*(int **)(g_pMatchExtensions + 0x54));
  if (uVar5 != uVar8) {
    return (KeyValues *)0x0;
  }
  iVar6 = *(int *)(param_1 + 0x30);
  if (iVar6 < 0x20) {
    puVar2 = *(uint **)(param_1 + 0x34);
    uVar5 = *(uint *)(param_1 + 0x2c);
    if (puVar2 == *(uint **)(param_1 + 0x38)) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar2 + 1;
      param_1[0x20] = (netpacket_s)0x1;
      return (KeyValues *)0x0;
    }
    if (*(uint **)(param_1 + 0x38) <= puVar2) {
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      return (KeyValues *)0x0;
    }
    *(uint **)(param_1 + 0x34) = puVar2 + 1;
    uVar8 = *puVar2;
    *(uint *)(param_1 + 0x2c) = uVar8;
    if (param_1[0x20] != (netpacket_s)0x0) {
      return (KeyValues *)0x0;
    }
    *(int *)(param_1 + 0x30) = iVar6;
    uVar5 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar6] & uVar8) << ((byte)iVar6 & 0x1f) | uVar5;
    *(uint *)(param_1 + 0x2c) = uVar8 >> ((byte)(0x20 - iVar6) & 0x1f);
  }
  else {
    *(int *)(param_1 + 0x30) = iVar6 + -0x20;
    uVar5 = *(uint *)(param_1 + 0x2c);
    if (iVar6 + -0x20 == 0) {
      puVar1 = *(undefined4 **)(param_1 + 0x34);
      *(undefined4 *)(param_1 + 0x30) = 0x20;
      if (puVar1 == *(undefined4 **)(param_1 + 0x38)) {
        *(undefined4 *)(param_1 + 0x30) = 1;
        *(undefined4 *)(param_1 + 0x2c) = 0;
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
      }
      else {
        if (*(undefined4 **)(param_1 + 0x38) < puVar1) {
          param_1[0x20] = (netpacket_s)0x1;
          goto LAB_00058a1c;
        }
        *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
        *(undefined4 *)(param_1 + 0x2c) = *puVar1;
      }
    }
    else {
LAB_00058a1c:
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
  }
  if (0x3fe < uVar5 - 1) {
    return (KeyValues *)0x0;
  }
  this_00 = (CUtlBuffer *)(this + 4);
  *(undefined4 *)(this + 0x10) = 0;
  *(undefined4 *)(this + 0x14) = 0;
  this[0x18] = (CConnectionlessLanMgr)0x0;
  *(undefined4 *)(this + 0x24) = 0;
  *(undefined4 *)(this + 0x20) = 0xffffffff;
  CUtlBuffer::AddNullTermination(this_00);
  CUtlBuffer::EnsureCapacity(this_00,uVar5);
  cVar4 = CBitRead::ReadBytes((CBitRead *)(param_1 + 0x1c),*(void **)(this + 4),uVar5);
  if (cVar4 == '\0') {
    return (KeyValues *)0x0;
  }
  CUtlBuffer::SeekPut(this_00,0,uVar5);
  uVar5 = 1;
  CUtlBuffer::ActivateByteSwapping(this_00,true);
  this_01 = KeyValues::operator_new((KeyValues *)0x2c,uVar5);
                    /* try { // try from 00058ade to 00058ae2 has its CatchHandler @ 00058ff2 */
  KeyValues::KeyValues(this_01,"",(IKeyValuesSystem *)0x0,false);
  cVar4 = KeyValues::ReadAsBinary(this_01,this_00);
  if (cVar4 == '\0') goto LAB_00058b90;
  this_02 = (KeyValues *)KeyValues::FindKey(this_01,"binary",false);
  local_20 = 0;
  if (this_02 != (KeyValues *)0x0) {
    local_20 = KeyValues::GetInt(this_02,"size",0);
    KeyValues::RemoveSubKey(this_01,this_02);
    KeyValues::deleteThis();
  }
  iVar6 = *(int *)(param_1 + 0x30);
  if (iVar6 < 0x20) {
    uVar5 = *(uint *)(param_1 + 0x2c);
    puVar2 = *(uint **)(param_1 + 0x34);
    if (puVar2 == *(uint **)(param_1 + 0x38)) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(uint **)(param_1 + 0x34) = puVar2 + 1;
      param_1[0x20] = (netpacket_s)0x1;
    }
    else if (*(uint **)(param_1 + 0x38) < puVar2) {
      param_1[0x20] = (netpacket_s)0x1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
    }
    else {
      *(uint **)(param_1 + 0x34) = puVar2 + 1;
      uVar8 = *puVar2;
      *(uint *)(param_1 + 0x2c) = uVar8;
      if (param_1[0x20] == (netpacket_s)0x0) {
        *(int *)(param_1 + 0x30) = iVar6;
        local_28 = (byte)(0x20 - iVar6);
        uVar5 = (uVar8 & (&CBitBuffer::s_nMaskTable)[0x20 - iVar6]) << ((byte)iVar6 & 0x1f) | uVar5;
        *(uint *)(param_1 + 0x2c) = uVar8 >> (local_28 & 0x1f);
        goto LAB_00058ce7;
      }
    }
    if (local_20 == 0) {
      return this_01;
    }
    goto LAB_00058b90;
  }
  *(int *)(param_1 + 0x30) = iVar6 + -0x20;
  uVar5 = *(uint *)(param_1 + 0x2c);
  if (iVar6 + -0x20 == 0) {
    puVar1 = *(undefined4 **)(param_1 + 0x34);
    *(undefined4 *)(param_1 + 0x30) = 0x20;
    if (puVar1 == *(undefined4 **)(param_1 + 0x38)) {
      *(undefined4 *)(param_1 + 0x30) = 1;
      *(undefined4 *)(param_1 + 0x2c) = 0;
      *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
    }
    else {
      if (*(undefined4 **)(param_1 + 0x38) < puVar1) {
        param_1[0x20] = (netpacket_s)0x1;
        goto LAB_00058ce0;
      }
      *(undefined4 **)(param_1 + 0x34) = puVar1 + 1;
      *(undefined4 *)(param_1 + 0x2c) = *puVar1;
    }
  }
  else {
LAB_00058ce0:
    *(undefined4 *)(param_1 + 0x2c) = 0;
  }
LAB_00058ce7:
  if ((local_20 == uVar5) && (uVar5 < 0x400)) {
    if (uVar5 == 0) {
      return this_01;
    }
    *(undefined4 *)(this + 0x10) = 0;
    *(undefined4 *)(this + 0x14) = 0;
    this[0x18] = (CConnectionlessLanMgr)0x0;
    *(undefined4 *)(this + 0x24) = 0;
    *(undefined4 *)(this + 0x20) = 0xffffffff;
    CUtlBuffer::AddNullTermination(this_00);
    CUtlBuffer::EnsureCapacity(this_00,uVar5);
    cVar4 = CBitRead::ReadBytes((CBitRead *)(param_1 + 0x1c),*(void **)(this + 4),uVar5);
    if (cVar4 != '\0') {
      CUtlBuffer::SeekPut(this_00,0,uVar5);
      KeyValues::SetPtr(this_01,"Binary/ptr",*(void **)(this + 4));
      KeyValues::SetInt(this_01,"Binary/size",uVar5);
      return this_01;
    }
  }
LAB_00058b90:
  KeyValues::deleteThis();
  return (KeyValues *)0x0;
}

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)