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 *)¶m_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 *)¶m_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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.