L L4D2node

CIPRateLimit::CheckIP

0x001f5570 · 1804 bytes · __cdecl

_ZN12CIPRateLimit7CheckIPE8netadr_s

Decompiled

undefined (1 param)

/* CIPRateLimit::CheckIP(netadr_s) */

undefined4
CIPRateLimit::CheckIP
          (CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
           *param_1,undefined4 param_2,int param_3)

{
  int iVar1;
  char cVar2;
  int iVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  int *piVar6;
  int iVar7;
  int iVar8;
  uint uVar9;
  int iVar10;
  undefined4 *puVar11;
  int iVar12;
  longdouble lVar13;
  float fVar14;
  float fVar15;
  int local_44;
  int local_3c [4];
  int local_2c;
  int local_28;
  undefined4 local_24;
  undefined1 local_20;
  
  lVar13 = (longdouble)Plat_FloatTime();
  iVar1 = param_3;
  iVar3 = (int)lVar13;
  if (0x3ff < *(uint *)(param_1 + 0x14)) {
    iVar12 = *(int *)(param_1 + 0x10);
    cVar2 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
            ::Links(int)::s_Sentinel;
    do {
      if ((cVar2 == '\0') &&
         (iVar8 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                       ::Links(int)::s_Sentinel),
         cVar2 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                 ::Links(int)::s_Sentinel, iVar8 != 0)) {
        CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
        ::Links(int)::s_Sentinel = -1;
        DAT_00341804 = -1;
        DAT_00341808 = 0xffffffff;
        __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                             ::Links(int)::s_Sentinel);
        cVar2 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                ::Links(int)::s_Sentinel;
      }
      iVar8 = DAT_00341804;
      if (iVar12 != -1) {
        iVar8 = *(int *)(iVar12 * 0x20 + *(int *)(param_1 + 4) + 4);
      }
      if (iVar8 == -1) {
        iVar8 = *(int *)(param_1 + 0x10);
        if (cVar2 == '\0') goto LAB_001f595a;
LAB_001f5920:
        if (iVar8 == -1) goto LAB_001f59a0;
        do {
          piVar6 = (int *)(iVar8 * 0x20 + *(int *)(param_1 + 4));
          iVar10 = iVar8;
          while( true ) {
            if (*piVar6 == -1) goto LAB_001f59f1;
            if ((CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                 ::Links(int)::s_Sentinel == '\0') &&
               (iVar8 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                             ::Links(int)::s_Sentinel), iVar8 != 0)) {
              CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
              ::Links(int)::s_Sentinel = -1;
              DAT_00341804 = -1;
              DAT_00341808 = 0xffffffff;
              __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                   ::Links(int)::s_Sentinel);
            }
            iVar8 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                    ::Links(int)::s_Sentinel;
            if (iVar10 != -1) {
              iVar8 = *(int *)(iVar10 * 0x20 + *(int *)(param_1 + 4));
            }
            if (CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                ::Links(int)::s_Sentinel != '\0') goto LAB_001f5920;
LAB_001f595a:
            iVar10 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                          ::Links(int)::s_Sentinel);
            if (iVar10 == 0) goto LAB_001f5920;
            CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
            ::Links(int)::s_Sentinel = -1;
            DAT_00341804 = -1;
            DAT_00341808 = 0xffffffff;
            __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                 ::Links(int)::s_Sentinel);
            if (iVar8 != -1) break;
LAB_001f59a0:
            piVar6 = &CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                      ::Links(int)::s_Sentinel;
            iVar10 = iVar8;
          }
        } while( true );
      }
      if (cVar2 == '\0') {
        iVar8 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                     ::Links(int)::s_Sentinel);
        if (iVar8 != 0) {
          CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
          ::Links(int)::s_Sentinel = -1;
          DAT_00341804 = -1;
          DAT_00341808 = 0xffffffff;
          __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                               ::Links(int)::s_Sentinel);
        }
        cVar2 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                ::Links(int)::s_Sentinel;
        if (iVar12 != -1) goto LAB_001f58d4;
LAB_001f59d4:
        puVar11 = &CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                   ::Links(int)::s_Sentinel;
      }
      else {
        if (iVar12 == -1) goto LAB_001f59d4;
LAB_001f58d4:
        puVar11 = (undefined4 *)(iVar12 * 0x20 + *(int *)(param_1 + 4));
      }
      iVar12 = puVar11[1];
    } while( true );
  }
LAB_001f55a3:
  iVar12 = *(int *)(param_1 + 0x10);
  local_3c[1] = 0;
  local_3c[2] = 0;
  local_3c[3] = 0;
  local_3c[0] = iVar1;
  if (iVar12 != -1) {
    iVar8 = *(int *)(param_1 + 4);
    do {
      while( true ) {
        iVar10 = iVar12 * 0x20;
        cVar2 = (**(code **)param_1)(local_3c,iVar8 + 0x10 + iVar10);
        if (cVar2 != '\0') break;
        uVar4 = (**(code **)param_1)(*(int *)(param_1 + 4) + iVar10 + 0x10,local_3c);
        if ((char)uVar4 == '\0') {
          fVar14 = *(float *)(sv_max_queries_window._28_4_ + 0x2c);
          if (((iVar12 < 0) || (*(int *)(param_1 + 8) <= iVar12)) ||
             (*(int *)(param_1 + 0x1c) < iVar12)) goto LAB_001f5645;
          if ((CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
               ::Links(int)::s_Sentinel == '\0') &&
             (iVar8 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                           ::Links(int)::s_Sentinel), iVar8 != 0)) {
            CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
            ::Links(int)::s_Sentinel = -1;
            DAT_00341804 = -1;
            DAT_00341808 = 0xffffffff;
            __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                 ::Links(int)::s_Sentinel);
          }
          if (iVar12 == *(int *)(*(int *)(param_1 + 4) + iVar10)) goto LAB_001f5645;
          piVar6 = (int *)(*(int *)(param_1 + 4) + 0x18 + iVar10);
          *piVar6 = *piVar6 + 1;
          local_44 = *(int *)(param_1 + 4) + iVar10;
          if (*(char *)(local_44 + 0x1c) == '\0') {
            if (fVar14 < (float)(iVar3 - *(int *)(local_44 + 0x14))) {
              *(int *)(local_44 + 0x14) = iVar3;
              *(undefined4 *)(*(int *)(param_1 + 4) + 0x18 + iVar10) = 1;
              *(undefined1 *)(*(int *)(param_1 + 4) + 0x1c + iVar10) = 0;
              goto LAB_001f5652;
            }
          }
          else {
            if ((float)(iVar3 - *(int *)(local_44 + 0x14)) < fVar14 * 6.0) {
              return uVar4;
            }
            *(undefined1 *)(local_44 + 0x1c) = 0;
            local_44 = *(int *)(param_1 + 4) + iVar10;
            fVar14 = fVar14 * 6.0;
          }
          iVar1 = *(int *)(local_44 + 0x18);
          fVar15 = (float)iVar1 / fVar14;
          if (*(float *)(sv_max_queries_sec._28_4_ + 0x2c) <= fVar15 &&
              fVar15 != *(float *)(sv_max_queries_sec._28_4_ + 0x2c)) {
            if (*(int *)(sv_logblocks_summary._28_4_ + 0x30) != 0) {
              uVar5 = netadr_s::ToString((netadr_s *)&param_2,false);
              CLog::Printf((CLog *)g_Log,
                           "Traffic from %s was blocked for exceeding rate limits with %d in %.f sec\n"
                           ,uVar5,iVar1,(double)fVar14);
              local_44 = *(int *)(param_1 + 4) + iVar10;
            }
            *(undefined1 *)(local_44 + 0x1c) = 1;
            *(int *)(*(int *)(param_1 + 4) + 0x14 + iVar10) = iVar3;
            *(undefined4 *)(*(int *)(param_1 + 4) + 0x18 + iVar10) = 1;
            return uVar4;
          }
          goto LAB_001f5652;
        }
        if ((CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
             ::Links(int)::s_Sentinel == '\0') &&
           (iVar12 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                          ::Links(int)::s_Sentinel), iVar12 != 0)) {
          CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
          ::Links(int)::s_Sentinel = -1;
          DAT_00341804 = -1;
          DAT_00341808 = 0xffffffff;
          __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                               ::Links(int)::s_Sentinel);
        }
        iVar8 = *(int *)(param_1 + 4);
        iVar12 = *(int *)(iVar8 + 4 + iVar10);
        if (iVar12 == -1) goto LAB_001f5636;
      }
      if ((CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
           ::Links(int)::s_Sentinel == '\0') &&
         (iVar12 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                        ::Links(int)::s_Sentinel), iVar12 != 0)) {
        CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
        ::Links(int)::s_Sentinel = -1;
        DAT_00341804 = -1;
        DAT_00341808 = 0xffffffff;
        __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                             ::Links(int)::s_Sentinel);
      }
      iVar8 = *(int *)(param_1 + 4);
      iVar12 = *(int *)(iVar8 + iVar10);
    } while (iVar12 != -1);
  }
LAB_001f5636:
  iVar12 = -1;
  fVar14 = *(float *)(sv_max_queries_window._28_4_ + 0x2c);
LAB_001f5645:
  if (*(uint *)(param_1 + 0x14) < 0x400) {
    local_24 = 1;
    local_20 = 0;
    local_2c = iVar1;
    local_28 = iVar3;
    CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
    ::Insert(param_1,(iprate_s *)&local_2c);
  }
LAB_001f5652:
  iVar1 = *(int *)(param_1 + 0x24) + 1;
  *(int *)(param_1 + 0x24) = iVar1;
  if ((float)(iVar3 - *(int *)(param_1 + 0x28)) <= fVar14) {
    uVar4 = 1;
    if (*(float *)(sv_max_queries_sec_global._28_4_ + 0x2c) <= (float)iVar1 / fVar14 &&
        (float)iVar1 / fVar14 != *(float *)(sv_max_queries_sec_global._28_4_ + 0x2c)) {
      if (*(int *)(sv_logblocks_summary._28_4_ + 0x30) != 0) {
        uVar4 = netadr_s::ToString((netadr_s *)&param_2,false);
        CLog::Printf((CLog *)g_Log,
                     "Global traffic from %s was blocked for exceeding rate limits with %d in %.f sec\n"
                     ,uVar4,iVar1,(double)fVar14);
      }
      *(undefined1 *)(*(int *)(param_1 + 4) + 0x1c + iVar12 * 0x20) = 1;
      *(int *)(*(int *)(param_1 + 4) + 0x14 + iVar12 * 0x20) = iVar3;
      uVar4 = 0;
    }
    return uVar4;
  }
  *(undefined4 *)(param_1 + 0x24) = 1;
  *(int *)(param_1 + 0x28) = iVar3;
  return 1;
LAB_001f59f1:
  uVar9 = *(uint *)(param_1 + 0x14);
  while( true ) {
    if ((uVar9 < 0x2ab) || (*(int *)(param_1 + 8) <= iVar10)) goto LAB_001f55a3;
    if ((iVar12 < 0) || ((*(int *)(param_1 + 8) <= iVar12 || (*(int *)(param_1 + 0x1c) < iVar12))))
    break;
    if ((CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
         ::Links(int)::s_Sentinel == '\0') &&
       (iVar8 = __cxa_guard_acquire(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                                     ::Links(int)::s_Sentinel), iVar8 != 0)) {
      CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
      ::Links(int)::s_Sentinel = -1;
      DAT_00341804 = -1;
      DAT_00341808 = 0xffffffff;
      __cxa_guard_release(&CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
                           ::Links(int)::s_Sentinel);
    }
    iVar8 = iVar12 * 0x20;
    if (((iVar12 == *(int *)(*(int *)(param_1 + 4) + iVar8)) ||
        (iVar7 = *(int *)(param_1 + 4) + iVar8, iVar3 - *(int *)(iVar7 + 0x14) < 0x3d)) ||
       (iVar1 == *(int *)(iVar7 + 0x10))) break;
    iVar7 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
            ::PrevInorder(param_1,iVar12);
    CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
    ::Unlink(param_1,iVar12);
    *(int *)(*(int *)(param_1 + 4) + iVar8) = iVar12;
    *(undefined4 *)(*(int *)(param_1 + 4) + 4 + iVar8) = *(undefined4 *)(param_1 + 0x18);
    *(int *)(param_1 + 0x18) = iVar12;
    uVar9 = *(int *)(param_1 + 0x14) - 1;
    *(uint *)(param_1 + 0x14) = uVar9;
    iVar12 = iVar7;
  }
  iVar10 = iVar10 + 1;
  iVar12 = CUtlRBTree<CIPRateLimit::iprate_s,int,bool(*)(CIPRateLimit::iprate_s_const&,CIPRateLimit::iprate_s_const&),CUtlMemory<UtlRBTreeNode_t<CIPRateLimit::iprate_s,int>,int>>
           ::PrevInorder(param_1,iVar12);
  goto LAB_001f59f1;
}

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)