CRConServer::RunFrame
0x0020bd00 · 1853 bytes · __thiscall
_ZN11CRConServer8RunFrameEv
Decompiled
undefined (1 param)
/* CRConServer::RunFrame() */
void __thiscall CRConServer::RunFrame(CRConServer *this)
{
short sVar1;
ushort uVar2;
int iVar3;
char cVar4;
CSocketCreator *this_00;
int iVar5;
undefined4 uVar6;
undefined4 uVar7;
uint uVar8;
ssize_t sVar9;
uint *puVar10;
uint uVar11;
int *piVar12;
int iVar13;
uint *puVar14;
undefined1 *puVar15;
uint uVar16;
int iVar17;
int iVar18;
int in_GS_OFFSET;
uint local_1040;
undefined1 local_102d;
uint local_102c;
int local_1028;
undefined4 local_1024;
uint local_1020;
undefined1 local_101c [4092];
int local_20;
puVar14 = (uint *)&stack0xffffef94;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
this_00 = (CSocketCreator *)(this + 4);
CSocketCreator::RunFrame(this_00);
this[0x5c] = (CRConServer)0x0;
iVar5 = CSocketCreator::GetAcceptedSocketCount(this_00);
local_1040 = iVar5 - 1;
puVar15 = &stack0xffffef94;
if (-1 < (int)local_1040) {
do {
puVar14[1] = local_1040;
*puVar14 = (uint)this_00;
puVar14[-1] = 0x20bd70;
iVar5 = CSocketCreator::GetAcceptedSocketData((CSocketCreator *)*puVar14,puVar14[1]);
puVar14[1] = local_1040;
*puVar14 = (uint)this_00;
puVar14[-1] = 0x20bd7e;
uVar6 = CSocketCreator::GetAcceptedSocketHandle((CSocketCreator *)*puVar14,puVar14[1]);
puVar14[1] = local_1040;
*puVar14 = (uint)this_00;
puVar14[-1] = 0x20bd90;
uVar7 = CSocketCreator::GetAcceptedSocketAddress((CSocketCreator *)*puVar14,puVar14[1]);
sVar1 = *(short *)(iVar5 + 0x56);
while (sVar1 != 0) {
piVar12 = (int *)((uint)*(ushort *)(iVar5 + 0x50) * 0x3c + *(int *)(iVar5 + 0x44));
iVar18 = piVar12[3];
puVar14[4] = 1;
puVar14[3] = piVar12[4] - iVar18;
puVar14[2] = (iVar18 - piVar12[8]) + *piVar12;
puVar14[1] = local_1040;
*puVar14 = (uint)this;
puVar14[-1] = 0x20be33;
cVar4 = SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
SUB41(puVar14[4],0));
if (cVar4 == '\0') break;
uVar2 = *(ushort *)(iVar5 + 0x50);
puVar14[1] = (uint)uVar2;
*puVar14 = iVar5 + 0x44;
puVar14[-1] = 0x20bdc9;
CUtlLinkedList<CUtlBuffer,unsigned_short,false,unsigned_short,CUtlMemory<UtlLinkedListElem_t<CUtlBuffer,unsigned_short>,unsigned_short>>
::Unlink((CUtlLinkedList<CUtlBuffer,unsigned_short,false,unsigned_short,CUtlMemory<UtlLinkedListElem_t<CUtlBuffer,unsigned_short>,unsigned_short>>
*)*puVar14,(ushort)puVar14[1]);
iVar18 = (uint)uVar2 * 0x3c + *(int *)(iVar5 + 0x44);
*puVar14 = iVar18;
puVar14[-1] = 0x20bddc;
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)*puVar14);
*(undefined2 *)(iVar18 + 0x3a) = *(undefined2 *)(iVar5 + 0x54);
sVar1 = *(short *)(iVar5 + 0x56);
*(ushort *)(iVar5 + 0x54) = uVar2;
}
uVar8 = *(uint *)(iVar5 + 8);
*puVar14 = (uint)g_ServerRemoteAccess;
puVar14[1] = uVar8;
puVar14[-1] = 0x20be4e;
uVar8 = CServerRemoteAccess::GetDataResponseSize((CServerRemoteAccess *)*puVar14,puVar14[1]);
if (0 < (int)uVar8) {
uVar16 = uVar8 + 4;
if (uVar16 < 0x1001) {
puVar14[3] = uVar8;
local_1020 = uVar8;
puVar14[2] = (uint)local_101c;
uVar8 = *(uint *)(iVar5 + 8);
*puVar14 = (uint)g_ServerRemoteAccess;
puVar14[1] = uVar8;
puVar14[-1] = 0x20be8a;
CServerRemoteAccess::ReadDataResponse
((CServerRemoteAccess *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3]);
puVar14[3] = uVar16;
puVar14[2] = (uint)&local_1020;
puVar14[4] = 0;
puVar14[1] = local_1040;
*puVar14 = (uint)this;
puVar14[-1] = 0x20beb8;
SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
SUB41(puVar14[4],0));
}
else {
*puVar14 = uVar16;
puVar14[-1] = 0x20bf98;
puVar10 = operator_new__(*puVar14);
*puVar10 = uVar8;
puVar14[3] = uVar8;
puVar14[2] = (uint)(puVar10 + 1);
uVar8 = *(uint *)(iVar5 + 8);
*puVar14 = (uint)g_ServerRemoteAccess;
puVar14[1] = uVar8;
puVar14[-1] = 0x20bfc0;
CServerRemoteAccess::ReadDataResponse
((CServerRemoteAccess *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3]);
puVar14[3] = uVar16;
puVar14[4] = 0;
puVar14[1] = local_1040;
puVar14[2] = (uint)puVar10;
*puVar14 = (uint)this;
puVar14[-1] = 0x20bfee;
SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
SUB41(puVar14[4],0));
*puVar14 = (uint)puVar10;
puVar14[-1] = 0x20bffc;
operator_delete((void *)*puVar14);
}
}
puVar14[3] = 2;
puVar14[1] = (uint)&local_102d;
puVar14[2] = 1;
local_102c = 0;
*puVar14 = uVar6;
puVar14[-1] = 0x20beea;
sVar9 = recv(*puVar14,(void *)puVar14[1],puVar14[2],puVar14[3]);
if (sVar9 == -1) {
puVar14[-1] = 0x20c00d;
cVar4 = SocketWouldBlock();
if (cVar4 == '\0') goto LAB_0020bf70;
}
else {
if ((sVar9 != 0) && (-1 < sVar9)) {
puVar14[1] = 0x541b;
puVar14[2] = (uint)&local_102c;
*puVar14 = uVar6;
puVar14[-1] = 0x20bf19;
ioctl(*puVar14,puVar14[1]);
if (local_102c < 5) goto LAB_0020bf28;
uVar8 = local_102c + *(int *)(iVar5 + 0x1c);
iVar18 = iVar5 + 0xc;
*puVar14 = iVar18;
puVar14[1] = uVar8;
puVar14[-1] = 0x20c02d;
CUtlBuffer::EnsureCapacity((CUtlBuffer *)*puVar14,puVar14[1]);
uVar8 = 0x400;
if (local_102c < 0x401) {
uVar8 = local_102c;
}
iVar3 = -((uVar8 + 0xf & 0xfffffff0) + 0x10);
uVar8 = (int)puVar14 + iVar3 + 0x23 & 0xfffffff0;
if (local_102c != 0) {
uVar16 = 0;
do {
uVar11 = local_102c - uVar16;
*(undefined4 *)((int)puVar14 + iVar3 + 0xc) = 0;
*(uint *)((int)puVar14 + iVar3 + 4) = uVar8;
if (0x400 < uVar11) {
uVar11 = 0x400;
}
*(uint *)((int)puVar14 + iVar3 + 8) = uVar11;
*(undefined4 *)((int)puVar14 + iVar3) = uVar6;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0c3;
sVar9 = recv(*(int *)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
*(size_t *)((int)puVar14 + iVar3 + 8),
*(int *)((int)puVar14 + iVar3 + 0xc));
if (sVar9 == 0) {
*(uint *)((int)puVar14 + iVar3 + 4) = local_1040;
*(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c2e4;
CSocketCreator::CloseAcceptedSocket
(*(CSocketCreator **)((int)puVar14 + iVar3),
*(int *)((int)puVar14 + iVar3 + 4));
break;
}
if (sVar9 < 0) {
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0d5;
cVar4 = SocketWouldBlock();
if (cVar4 == '\0') {
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0de;
piVar12 = __errno_location();
*(int *)((int)puVar14 + iVar3) = *piVar12;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0f4;
uVar6 = NET_ErrorString(*(int *)((int)puVar14 + iVar3));
*(char **)((int)puVar14 + iVar3) = "RCON Cmd: recv error (%s)\n";
*(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar6;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c104;
Warning();
break;
}
}
*(ssize_t *)((int)puVar14 + iVar3 + 8) = sVar9;
uVar16 = uVar16 + sVar9;
*(uint *)((int)puVar14 + iVar3 + 4) = uVar8;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c088;
CUtlBuffer::Put(*(CUtlBuffer **)((int)puVar14 + iVar3),
*(void **)((int)puVar14 + iVar3 + 4),
*(int *)((int)puVar14 + iVar3 + 8));
} while (uVar16 < local_102c);
}
*(undefined4 *)((int)puVar14 + iVar3 + 8) = 0;
*(undefined4 *)((int)puVar14 + iVar3 + 4) = 0;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c11c;
CUtlBuffer::SeekGet();
if ((*(byte *)(iVar5 + 0x21) & 1) == 0) {
*(undefined4 *)((int)puVar14 + iVar3 + 4) = 4;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c290;
cVar4 = CUtlBuffer::CheckGet
(*(CUtlBuffer **)((int)puVar14 + iVar3),
*(int *)((int)puVar14 + iVar3 + 4));
if (cVar4 != '\0') {
if ((*(byte *)(iVar5 + 0x40) & 1) == 0) {
iVar13 = *(int *)(iVar5 + 0x18);
iVar17 = *(int *)(*(int *)(iVar5 + 0xc) + (iVar13 - *(int *)(iVar5 + 0x2c)));
}
else {
piVar12 = (int *)((*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) +
*(int *)(iVar5 + 0xc));
if (piVar12 == (int *)0x0) {
piVar12 = &local_1028;
}
local_1024 = local_1028;
local_1024._1_3_ = (undefined3)((uint)local_1028 >> 8);
local_1024 = CONCAT31(local_1024._1_3_,*(undefined1 *)((int)piVar12 + 3));
local_1024._2_2_ = (undefined2)((uint)local_1028 >> 0x10);
local_1024._0_2_ =
CONCAT11(*(undefined1 *)((int)piVar12 + 2),*(undefined1 *)((int)piVar12 + 3));
local_1024._3_1_ = (undefined1)((uint)local_1028 >> 0x18);
local_1024._0_3_ =
CONCAT12(*(undefined1 *)((int)piVar12 + 1),(undefined2)local_1024);
iVar13 = *piVar12;
*(int **)((int)puVar14 + iVar3) = &local_1028;
*(undefined4 *)((int)puVar14 + iVar3 + 8) = 4;
local_1024 = CONCAT13((char)iVar13,(undefined3)local_1024);
*(undefined4 **)((int)puVar14 + iVar3 + 4) = &local_1024;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c395;
_V_memcpy(*(void **)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
*(int *)((int)puVar14 + iVar3 + 8));
iVar13 = *(int *)(iVar5 + 0x18);
iVar17 = local_1028;
}
*(int *)(iVar5 + 0x18) = iVar13 + 4;
goto LAB_0020c150;
}
iVar17 = 0;
}
else {
*(undefined **)((int)puVar14 + iVar3 + 4) = &DAT_002ad982;
*(int **)((int)puVar14 + iVar3 + 8) = &local_1028;
*(int *)((int)puVar14 + iVar3) = iVar18;
local_1028 = 0;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c14a;
CUtlBuffer::Scanf(*(CUtlBuffer **)((int)puVar14 + iVar3),
*(char **)((int)puVar14 + iVar3 + 4));
iVar17 = local_1028;
LAB_0020c150:
if (0x400 < iVar17) {
*(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar7;
*(CRConServer **)((int)puVar14 + iVar3) = this;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20bf70;
HandleFailedRconAuth
(*(CRConServer **)((int)puVar14 + iVar3),
*(netadr_s **)((int)puVar14 + iVar3 + 4));
puVar14 = (uint *)((int)puVar14 + iVar3);
goto LAB_0020bf70;
}
}
while ((0 < iVar17 && (iVar17 <= *(int *)(iVar5 + 0x1c) - *(int *)(iVar5 + 0x18)))) {
*(undefined4 *)((int)puVar14 + iVar3) = 3;
*(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar7;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c184;
SV_RedirectStart();
*(int *)((int)puVar14 + iVar3 + 0x10) = iVar17;
*(int *)((int)puVar14 + iVar3 + 0xc) =
(*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) + *(int *)(iVar5 + 0xc);
uVar6 = *(undefined4 *)(iVar5 + 8);
*(undefined1 **)((int)puVar14 + iVar3) = g_ServerRemoteAccess;
*(undefined4 *)((int)puVar14 + iVar3 + 8) = uVar6;
*(CRConServer **)((int)puVar14 + iVar3 + 4) = this;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1b2;
CServerRemoteAccess::WriteDataRequest
(*(CServerRemoteAccess **)((int)puVar14 + iVar3),
*(CRConServer **)((int)puVar14 + iVar3 + 4),
*(uint *)((int)puVar14 + iVar3 + 8),*(void **)((int)puVar14 + iVar3 + 0xc),
*(int *)((int)puVar14 + iVar3 + 0x10));
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1b7;
SV_RedirectEnd();
puVar15 = (undefined1 *)((int)puVar14 + iVar3);
if (this[0x5c] != (CRConServer)0x0) goto LAB_0020bf40;
*(int *)((int)puVar14 + iVar3 + 8) = iVar17;
*(undefined4 *)((int)puVar14 + iVar3 + 4) = 1;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1db;
CUtlBuffer::SeekGet();
if ((uint)(*(int *)(iVar5 + 0x1c) - *(int *)(iVar5 + 0x18)) < 4) break;
if ((*(byte *)(iVar5 + 0x21) & 1) == 0) {
*(undefined4 *)((int)puVar14 + iVar3 + 4) = 4;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c3b3;
cVar4 = CUtlBuffer::CheckGet
(*(CUtlBuffer **)((int)puVar14 + iVar3),
*(int *)((int)puVar14 + iVar3 + 4));
if (cVar4 == '\0') break;
if ((*(byte *)(iVar5 + 0x40) & 1) == 0) {
iVar13 = *(int *)(iVar5 + 0x18);
iVar17 = *(int *)(*(int *)(iVar5 + 0xc) + (iVar13 - *(int *)(iVar5 + 0x2c)));
}
else {
piVar12 = (int *)((*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) +
*(int *)(iVar5 + 0xc));
if (piVar12 == (int *)0x0) {
piVar12 = &local_1028;
}
local_1024 = local_1028;
local_1024._1_3_ = (undefined3)((uint)local_1028 >> 8);
local_1024 = CONCAT31(local_1024._1_3_,*(undefined1 *)((int)piVar12 + 3));
local_1024._2_2_ = (undefined2)((uint)local_1028 >> 0x10);
local_1024._0_2_ =
CONCAT11(*(undefined1 *)((int)piVar12 + 2),*(undefined1 *)((int)piVar12 + 3));
local_1024._3_1_ = (undefined1)((uint)local_1028 >> 0x18);
local_1024._0_3_ =
CONCAT12(*(undefined1 *)((int)piVar12 + 1),(undefined2)local_1024);
iVar13 = *piVar12;
*(undefined4 *)((int)puVar14 + iVar3 + 8) = 4;
local_1024 = CONCAT13((char)iVar13,(undefined3)local_1024);
*(undefined4 **)((int)puVar14 + iVar3 + 4) = &local_1024;
*(int **)((int)puVar14 + iVar3) = &local_1028;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c43a;
_V_memcpy(*(void **)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
*(int *)((int)puVar14 + iVar3 + 8));
iVar13 = *(int *)(iVar5 + 0x18);
iVar17 = local_1028;
}
*(int *)(iVar5 + 0x18) = iVar13 + 4;
}
else {
*(undefined **)((int)puVar14 + iVar3 + 4) = &DAT_002ad982;
*(int **)((int)puVar14 + iVar3 + 8) = &local_1028;
*(int *)((int)puVar14 + iVar3) = iVar18;
local_1028 = 0;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c317;
CUtlBuffer::Scanf(*(CUtlBuffer **)((int)puVar14 + iVar3),
*(char **)((int)puVar14 + iVar3 + 4));
iVar17 = local_1028;
}
}
*(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1f8;
iVar13 = CSocketCreator::GetAcceptedSocketCount
(*(CSocketCreator **)((int)puVar14 + iVar3));
if (((int)local_1040 <= iVar13) && (iVar13 != 0)) {
*(uint *)((int)puVar14 + iVar3 + 4) = local_1040;
*(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c24c;
iVar13 = CSocketCreator::GetAcceptedSocketData
(*(CSocketCreator **)((int)puVar14 + iVar3),
*(int *)((int)puVar14 + iVar3 + 4));
if (iVar5 == iVar13) {
*(undefined4 *)(iVar5 + 0x18) = 0;
*(undefined4 *)(iVar5 + 0x1c) = 0;
*(undefined4 *)(iVar5 + 0x2c) = 0;
*(undefined4 *)(iVar5 + 0x28) = 0;
*(undefined1 *)(iVar5 + 0x20) = 0;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c278;
CUtlMemory<unsigned_char,int>::Purge
(*(CUtlMemory<unsigned_char,int> **)((int)puVar14 + iVar3));
puVar14 = (uint *)((int)puVar14 + iVar3);
goto LAB_0020bf28;
}
}
*(undefined4 *)(iVar5 + 0x18) = 0;
*(undefined4 *)(iVar5 + 0x1c) = 0;
*(undefined4 *)(iVar5 + 0x2c) = 0;
*(undefined4 *)(iVar5 + 0x28) = 0;
*(undefined1 *)(iVar5 + 0x20) = 0;
*(int *)((int)puVar14 + iVar3) = iVar18;
*(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c228;
CUtlMemory<unsigned_char,int>::Purge
(*(CUtlMemory<unsigned_char,int> **)((int)puVar14 + iVar3));
puVar15 = (undefined1 *)((int)puVar14 + iVar3);
break;
}
LAB_0020bf70:
puVar14[1] = local_1040;
*puVar14 = (uint)this_00;
puVar14[-1] = 0x20bf88;
CSocketCreator::CloseAcceptedSocket((CSocketCreator *)*puVar14,puVar14[1]);
}
LAB_0020bf28:
local_1040 = local_1040 - 1;
puVar15 = (undefined1 *)puVar14;
} while (local_1040 != 0xffffffff);
}
LAB_0020bf40:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
*(undefined4 *)(puVar15 + -4) = 0x20c451;
__stack_chk_fail();
}
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.