CNetChan::ProcessPacketHeader
0x001b0ce0 · 2784 bytes · __thiscall
_ZN8CNetChan19ProcessPacketHeaderEP11netpacket_s
Decompiled
undefined (2 params)
/* CNetChan::ProcessPacketHeader(netpacket_s*) */
uint __thiscall CNetChan::ProcessPacketHeader(CNetChan *this,netpacket_s *param_1)
{
int *piVar1;
undefined4 *puVar2;
int iVar3;
uint *puVar4;
uint uVar5;
char cVar6;
int iVar7;
undefined4 uVar8;
undefined4 uVar9;
int iVar10;
uint *puVar11;
uint *puVar12;
uint uVar13;
uint uVar14;
CNetChan *pCVar15;
uint local_40;
uint local_3c;
uint local_38;
uint local_34;
uint local_30;
ulong local_20 [4];
iVar7 = *(int *)(param_1 + 0x30);
if (iVar7 < 0x20) {
puVar4 = *(uint **)(param_1 + 0x34);
puVar12 = *(uint **)(param_1 + 0x38);
local_3c = *(uint *)(param_1 + 0x2c);
if (puVar4 == puVar12) {
puVar11 = puVar4 + 1;
*(undefined4 *)(param_1 + 0x30) = 1;
iVar7 = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar11;
param_1[0x20] = (netpacket_s)0x1;
}
else {
if (puVar4 <= puVar12) {
puVar11 = puVar4 + 1;
*(uint **)(param_1 + 0x34) = puVar11;
local_38 = *puVar4;
*(uint *)(param_1 + 0x2c) = local_38;
if (param_1[0x20] == (netpacket_s)0x0) {
*(int *)(param_1 + 0x30) = iVar7;
uVar14 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & local_38;
local_38 = local_38 >> ((byte)(0x20 - iVar7) & 0x1f);
*(uint *)(param_1 + 0x2c) = local_38;
local_3c = uVar14 << ((byte)iVar7 & 0x1f) | local_3c;
}
else {
local_3c = 0;
}
goto LAB_001b0ebe;
}
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
puVar11 = puVar4;
}
local_38 = 0;
local_3c = 0;
LAB_001b0ebe:
if (puVar11 == puVar12) {
*(undefined4 *)(param_1 + 0x30) = 1;
iVar7 = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar11 + 1;
param_1[0x20] = (netpacket_s)0x1;
}
else {
if (puVar11 <= puVar12) {
*(uint **)(param_1 + 0x34) = puVar11 + 1;
uVar14 = *puVar11;
*(uint *)(param_1 + 0x2c) = uVar14;
if (param_1[0x20] == (netpacket_s)0x0) {
*(int *)(param_1 + 0x30) = iVar7;
uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar14;
uVar14 = uVar14 >> ((byte)(0x20 - iVar7) & 0x1f);
*(uint *)(param_1 + 0x2c) = uVar14;
local_38 = uVar13 << ((byte)iVar7 & 0x1f) | local_38;
}
else {
local_38 = 0;
}
goto joined_r0x001b0ee3;
}
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
uVar14 = 0;
local_38 = 0;
joined_r0x001b0ee3:
if (iVar7 < 8) {
puVar12 = *(uint **)(param_1 + 0x38);
goto LAB_001b0eec;
}
*(int *)(param_1 + 0x30) = iVar7 + -8;
local_30 = uVar14 & 0xff;
if (iVar7 + -8 != 0) {
LAB_001b1090:
*(uint *)(param_1 + 0x2c) = uVar14 >> 8;
goto LAB_001b0f0f;
}
puVar2 = *(undefined4 **)(param_1 + 0x34);
*(undefined4 *)(param_1 + 0x30) = 0x20;
if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
goto LAB_001b0f0f;
}
if (puVar2 <= *(undefined4 **)(param_1 + 0x38)) {
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
*(undefined4 *)(param_1 + 0x2c) = *puVar2;
goto LAB_001b0f0f;
}
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
cVar6 = NET_IsMultiplayer();
}
else {
iVar10 = iVar7 + -0x20;
*(int *)(param_1 + 0x30) = iVar10;
local_3c = *(uint *)(param_1 + 0x2c);
if (iVar10 != 0) {
*(undefined4 *)(param_1 + 0x2c) = 0;
if (iVar10 < 0x20) {
local_38 = 0;
puVar11 = *(uint **)(param_1 + 0x34);
puVar12 = *(uint **)(param_1 + 0x38);
iVar7 = iVar10;
goto LAB_001b0ebe;
}
iVar7 = iVar7 + -0x40;
*(int *)(param_1 + 0x30) = iVar7;
if (iVar7 == 0) {
local_38 = 0;
puVar12 = *(uint **)(param_1 + 0x38);
puVar11 = *(uint **)(param_1 + 0x34);
goto LAB_001b1063;
}
uVar14 = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
local_38 = 0;
goto joined_r0x001b0ee3;
}
puVar11 = *(uint **)(param_1 + 0x34);
*(undefined4 *)(param_1 + 0x30) = 0x20;
puVar12 = *(uint **)(param_1 + 0x38);
if (puVar11 == puVar12) {
puVar11 = puVar11 + 1;
*(undefined4 *)(param_1 + 0x30) = 1;
local_38 = 0;
*(undefined4 *)(param_1 + 0x2c) = 0;
iVar7 = 1;
*(uint **)(param_1 + 0x34) = puVar11;
goto LAB_001b0ebe;
}
if (puVar11 < puVar12) {
*(uint **)(param_1 + 0x34) = puVar11 + 1;
local_38 = *puVar11;
*(uint *)(param_1 + 0x2c) = local_38;
puVar11 = puVar11 + 1;
}
else {
local_38 = 0;
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
LAB_001b1063:
*(undefined4 *)(param_1 + 0x30) = 0x20;
if (puVar11 != puVar12) {
if (puVar12 < puVar11) {
uVar14 = 0;
param_1[0x20] = (netpacket_s)0x1;
}
else {
*(uint **)(param_1 + 0x34) = puVar11 + 1;
uVar14 = *puVar11;
}
*(undefined4 *)(param_1 + 0x30) = 0x18;
local_30 = uVar14 & 0xff;
goto LAB_001b1090;
}
uVar14 = 0;
*(uint **)(param_1 + 0x34) = puVar12 + 1;
iVar7 = 1;
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
LAB_001b0eec:
puVar4 = *(uint **)(param_1 + 0x34);
if (puVar4 == puVar12) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar12 + 1;
param_1[0x20] = (netpacket_s)0x1;
}
else if (puVar12 < puVar4) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(uint **)(param_1 + 0x34) = puVar4 + 1;
uVar13 = *puVar4;
*(uint *)(param_1 + 0x2c) = uVar13;
if (param_1[0x20] == (netpacket_s)0x0) {
uVar5 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
uVar8 = *(undefined4 *)(param_1 + 0x30);
*(int *)(param_1 + 0x30) = iVar7 + 0x18;
*(uint *)(param_1 + 0x2c) = uVar13 >> ((byte)(8 - iVar7) & 0x1f);
local_30 = (uVar5 & uVar13) << ((byte)uVar8 & 0x1f) | uVar14;
goto LAB_001b0f0f;
}
}
local_30 = 0;
LAB_001b0f0f:
cVar6 = NET_IsMultiplayer();
}
if (cVar6 != '\0') {
iVar7 = *(int *)(param_1 + 0x30);
if (iVar7 < 0x10) {
puVar4 = *(uint **)(param_1 + 0x34);
uVar8 = *(undefined4 *)(param_1 + 0x2c);
if (puVar4 == *(uint **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar4 + 1;
param_1[0x20] = (netpacket_s)0x1;
}
else if (*(uint **)(param_1 + 0x38) < puVar4) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(uint **)(param_1 + 0x34) = puVar4 + 1;
uVar14 = *puVar4;
*(uint *)(param_1 + 0x2c) = uVar14;
if (param_1[0x20] == (netpacket_s)0x0) {
uVar13 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar7];
*(int *)(param_1 + 0x30) = iVar7 + 0x10;
local_34._0_2_ = (ushort)((uVar13 & uVar14) << ((byte)iVar7 & 0x1f)) | (ushort)uVar8;
*(uint *)(param_1 + 0x2c) = uVar14 >> ((byte)(0x10 - iVar7) & 0x1f);
goto LAB_001b0f70;
}
}
local_34._0_2_ = 0;
}
else {
*(int *)(param_1 + 0x30) = iVar7 + -0x10;
local_34._0_2_ = (ushort)*(uint *)(param_1 + 0x2c);
if (iVar7 + -0x10 == 0) {
puVar2 = *(undefined4 **)(param_1 + 0x34);
*(undefined4 *)(param_1 + 0x30) = 0x20;
if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
}
else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
*(undefined4 *)(param_1 + 0x2c) = *puVar2;
}
}
else {
*(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 0x10;
}
}
LAB_001b0f70:
iVar7 = *(int *)(param_1 + 0x3c);
if (iVar7 == 0) {
uVar14 = *(uint *)(param_1 + 0x28);
iVar10 = 0;
}
else {
uVar14 = *(uint *)(param_1 + 0x28);
iVar3 = (((uint)(*(int *)(param_1 + 0x34) - iVar7) >> 2) * 0x20 - *(int *)(param_1 + 0x30)) +
(uVar14 & 3) * 8;
iVar10 = *(int *)(param_1 + 0x24);
if (iVar3 <= *(int *)(param_1 + 0x24)) {
iVar10 = iVar3;
}
iVar10 = iVar10 >> 3;
}
CRC32_Init(local_20);
CRC32_ProcessBuffer(local_20,(void *)(iVar7 + iVar10),uVar14 - iVar10);
CRC32_Final(local_20);
if ((ushort)local_34 != (ushort)((ushort)local_20[0] ^ (ushort)(local_20[0] >> 0x10))) {
uVar8 = *(undefined4 *)(this + 0xc);
uVar9 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("%s:corrupted packet %i at %i\n",uVar9,local_3c,uVar8);
return 0xffffffff;
}
}
iVar7 = *(int *)(param_1 + 0x30);
if (iVar7 < 8) {
puVar4 = *(uint **)(param_1 + 0x34);
local_34 = *(uint *)(param_1 + 0x2c);
if (puVar4 == *(uint **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar4 + 1;
param_1[0x20] = (netpacket_s)0x1;
}
else if (*(uint **)(param_1 + 0x38) < puVar4) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(uint **)(param_1 + 0x34) = puVar4 + 1;
uVar14 = *puVar4;
*(uint *)(param_1 + 0x2c) = uVar14;
if (param_1[0x20] == (netpacket_s)0x0) {
uVar13 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
*(int *)(param_1 + 0x30) = iVar7 + 0x18;
*(uint *)(param_1 + 0x2c) = uVar14 >> ((byte)(8 - iVar7) & 0x1f);
local_34 = (uVar13 & uVar14) << ((byte)iVar7 & 0x1f) | local_34;
goto LAB_001b0dc6;
}
}
local_34 = 0;
}
else {
*(int *)(param_1 + 0x30) = iVar7 + -8;
local_34 = *(uint *)(param_1 + 0x2c) & 0xff;
if (iVar7 + -8 == 0) {
puVar2 = *(undefined4 **)(param_1 + 0x34);
*(undefined4 *)(param_1 + 0x30) = 0x20;
if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
}
else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
*(undefined4 *)(param_1 + 0x2c) = *puVar2;
}
}
else {
*(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 8;
}
}
LAB_001b0dc6:
local_40 = 0;
if ((local_30 & 0x10) != 0) {
iVar7 = *(int *)(param_1 + 0x30);
if (iVar7 < 8) {
puVar4 = *(uint **)(param_1 + 0x34);
uVar14 = *(uint *)(param_1 + 0x2c);
if (puVar4 == *(uint **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(uint **)(param_1 + 0x34) = puVar4 + 1;
param_1[0x20] = (netpacket_s)0x1;
}
else {
if (puVar4 <= *(uint **)(param_1 + 0x38)) {
*(uint **)(param_1 + 0x34) = puVar4 + 1;
uVar13 = *puVar4;
*(uint *)(param_1 + 0x2c) = uVar13;
if (param_1[0x20] == (netpacket_s)0x0) {
uVar5 = (&CBitBuffer::s_nMaskTable)[8 - iVar7];
*(int *)(param_1 + 0x30) = iVar7 + 0x18;
*(uint *)(param_1 + 0x2c) = uVar13 >> ((byte)(8 - iVar7) & 0x1f);
local_40 = (uVar5 & uVar13) << ((byte)iVar7 & 0x1f) | uVar14;
}
goto LAB_001b0e20;
}
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
local_40 = 0;
}
else {
*(int *)(param_1 + 0x30) = iVar7 + -8;
local_40 = *(uint *)(param_1 + 0x2c) & 0xff;
if (iVar7 + -8 == 0) {
puVar2 = *(undefined4 **)(param_1 + 0x34);
*(undefined4 *)(param_1 + 0x30) = 0x20;
if (puVar2 == *(undefined4 **)(param_1 + 0x38)) {
*(undefined4 *)(param_1 + 0x30) = 1;
*(undefined4 *)(param_1 + 0x2c) = 0;
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
}
else if (*(undefined4 **)(param_1 + 0x38) < puVar2) {
param_1[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_1 + 0x2c) = 0;
}
else {
*(undefined4 **)(param_1 + 0x34) = puVar2 + 1;
*(undefined4 *)(param_1 + 0x2c) = *puVar2;
}
}
else {
*(uint *)(param_1 + 0x2c) = *(uint *)(param_1 + 0x2c) >> 8;
}
}
}
LAB_001b0e20:
uVar14 = *(uint *)(this + 0xc);
if ((int)local_3c <= (int)uVar14) {
if (*(int *)(net_showdrop._28_4_ + 0x30) != 0) {
if (uVar14 == local_3c) {
uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("%s:duplicate packet %i at %i\n",uVar8,local_3c,local_3c);
return 0xffffffff;
}
uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("%s:out of order packet %i at %i\n",uVar8,local_3c,uVar14);
}
return 0xffffffff;
}
iVar7 = ~(uVar14 + local_40) + local_3c;
*(int *)(this + 0x41dc) = iVar7;
if ((0 < iVar7) && (*(int *)(net_showdrop._28_4_ + 0x30) != 0)) {
uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("%s:Dropped %i packets at %i\n",uVar8,iVar7,local_3c);
}
iVar7 = 0;
pCVar15 = this + 0x344;
do {
while (uVar14 = *(uint *)(this + 0x14), (1 << ((byte)iVar7 & 0x1f) & (local_34 ^ uVar14)) == 0)
{
if (*(int *)(pCVar15 + 0x14) != 3) {
if ((int)local_38 < *(int *)(pCVar15 + 0x10)) {
uVar8 = netadr_s::ToString((netadr_s *)(this + 0x98),false);
ConMsg("%s:reliable state invalid (%i).\n",uVar8,iVar7);
return 0xffffffff;
}
if (*(int *)(pCVar15 + 0x14) != 2) goto LAB_001b112d;
iVar10 = 0;
do {
if (*(int *)(pCVar15 + iVar10 + 8) != 0) {
iVar3 = **(int **)(this + iVar10 * 5 + 0xbc);
piVar1 = (int *)(iVar3 + 0x128);
*piVar1 = *piVar1 + *(int *)(pCVar15 + iVar10 + 8);
piVar1 = (int *)(iVar3 + 300);
*piVar1 = *piVar1 - *(int *)(pCVar15 + iVar10 + 8);
}
iVar10 = iVar10 + 4;
} while (iVar10 != 8);
}
LAB_001b1188:
iVar7 = iVar7 + 1;
*(undefined4 *)(pCVar15 + 0x14) = 0;
*(undefined4 *)(pCVar15 + 0x10) = 0xffffffff;
*(undefined4 *)(pCVar15 + 8) = 0;
*(undefined4 *)pCVar15 = 0xffffffff;
*(undefined4 *)(pCVar15 + 0xc) = 0;
*(undefined4 *)(pCVar15 + 4) = 0xffffffff;
pCVar15 = pCVar15 + 0x1c;
if (iVar7 == 8) goto LAB_001b11c1;
}
if (*(int *)(pCVar15 + 0x10) <= (int)local_38) {
if (*(int *)(pCVar15 + 0x14) == 2) {
if (*(int *)(net_showfragments._28_4_ + 0x30) != 0) {
ConMsg("Resending subchan %i: start %i, num %i\n",*(undefined4 *)(pCVar15 + 0x18),
*(undefined4 *)pCVar15,*(undefined4 *)(pCVar15 + 8));
}
*(undefined4 *)(pCVar15 + 0x14) = 1;
}
else if (*(int *)(pCVar15 + 0x14) == 3) {
uVar13 = 1 << ((byte)*(undefined4 *)(pCVar15 + 0x18) & 0x1f);
if ((uVar13 & uVar14) == 0) {
*(uint *)(this + 0x14) = uVar13 | uVar14;
}
else {
*(uint *)(this + 0x14) = ~uVar13 & uVar14;
}
goto LAB_001b1188;
}
}
LAB_001b112d:
iVar7 = iVar7 + 1;
pCVar15 = pCVar15 + 0x1c;
} while (iVar7 != 8);
LAB_001b11c1:
*(uint *)(this + 0xc) = local_3c;
*(uint *)(this + 0x10) = local_38;
netadr_s::ToString((netadr_s *)param_1,false);
CheckWaitingList(this,0);
CheckWaitingList(this,1);
FlowNewPacket(this,1,*(int *)(this + 0xc),*(int *)(this + 0x10),local_40,*(int *)(this + 0x41dc),
*(int *)(param_1 + 0x44) + 0x1c);
return local_30;
}
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.