NET_ReceiveDatagram
0x001c67d0 · 2663 bytes · __cdecl
_Z19NET_ReceiveDatagramiP11netpacket_s
Decompiled
undefined (2 params)
/* NET_ReceiveDatagram(int, netpacket_s*) */
undefined4 NET_ReceiveDatagram(int param_1,netpacket_s *param_2)
{
byte bVar1;
undefined4 *puVar2;
uint uVar3;
char cVar4;
int iVar5;
size_t sVar6;
undefined4 uVar7;
size_t sVar8;
ushort *puVar9;
void *__dest;
uchar *puVar10;
uint uVar11;
int *piVar12;
uint uVar13;
uint uVar14;
uint *puVar15;
undefined4 uVar16;
int iVar17;
int in_GS_OFFSET;
bool bVar18;
size_t local_207c;
undefined4 local_206c;
int local_2068 [2];
uint local_2060;
uint local_205c;
undefined1 local_2058;
sockaddr local_2050;
uchar *local_2040;
uint local_203c;
int local_2038;
int local_2034;
uchar local_2030 [4096];
uchar *local_1030;
size_t local_102c;
undefined4 local_1028;
undefined4 local_1024;
uchar local_1020 [4096];
int local_20;
local_2050.sa_family = 0;
local_2050.sa_data[0] = '\0';
local_2050.sa_data[1] = '\0';
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_2050.sa_data[2] = '\0';
local_2050.sa_data[3] = '\0';
local_2050.sa_data[4] = '\0';
local_2050.sa_data[5] = '\0';
local_2050.sa_data[6] = '\0';
local_2050.sa_data[7] = '\0';
local_2050.sa_data[8] = '\0';
local_2050.sa_data[9] = '\0';
local_2050.sa_data[10] = '\0';
local_2050.sa_data[0xb] = '\0';
local_2050.sa_data[0xc] = '\0';
local_2050.sa_data[0xd] = '\0';
local_206c = 0x10;
iVar5 = (**(code **)(*(int *)g_pSteamSocketMgr + 0x18))
(g_pSteamSocketMgr,
*(undefined4 *)(*(int *)(param_2 + 0xc) * 0x10 + net_sockets + 8),
*(undefined4 *)(param_2 + 0x18),0x37ab0,0,&local_2050,&local_206c);
netadr_s::SetFromSockadr((netadr_s *)param_2,&local_2050);
if (iVar5 < 1) {
uVar16 = 0;
if (iVar5 != -1) goto LAB_001c69f8;
NET_GetLastError();
if (net_error == 0x5a) {
uVar7 = NET_ErrorString(0x5a);
ConDMsg("NET_ReceivePacket: %s\n",uVar7);
goto LAB_001c69f8;
}
if (net_error < 0x5b) {
if (net_error == 0xb) goto LAB_001c6f51;
}
else if ((net_error == 0x68) || (net_error == 0x6f)) {
LAB_001c6f51:
uVar16 = 0;
goto LAB_001c69f8;
}
uVar16 = 0;
uVar7 = NET_ErrorString(net_error);
ConDMsg("NET_ReceivePacket: %s\n",uVar7);
goto LAB_001c69f8;
}
bVar18 = net_dedicatedForXbox != '\0';
local_2040 = local_2030;
*(int *)(param_2 + 0x44) = iVar5;
local_203c = 0x1000;
local_2038 = -1;
local_2034 = 0x1000;
if ((bVar18) && (net_dedicatedForXboxInsecure == '\0')) {
puVar9 = *(ushort **)(param_2 + 0x18);
if (*puVar9 == 0xffff) goto LAB_001c69a8;
uVar11 = (uint)*puVar9;
uVar13 = (iVar5 - uVar11) - 2;
if ((int)uVar13 < 1) {
uVar14 = 0;
LAB_001c6e1f:
_V_memmove(puVar9,puVar9 + 1,uVar11);
*(uint *)(param_2 + 0x40) = uVar11;
goto LAB_001c69b9;
}
puVar9 = (ushort *)((int)puVar9 + uVar11 + 2);
uVar14 = (uint)*puVar9;
puVar9 = puVar9 + 1;
local_2060 = 0x1000;
/* try { // try from 001c6918 to 001c69e7 has its CatchHandler @ 001c7266 */
cVar4 = CLZSS::IsCompressed((CLZSS *)local_2068,(uchar *)puVar9);
iVar5 = local_2034;
uVar3 = local_203c;
if (cVar4 == '\0') {
if ((int)local_203c < (int)uVar13) {
if (local_2038 < 0) {
local_2038 = local_2034;
if (local_203c == 0) {
local_2040 = (uchar *)0x0;
}
else {
puVar10 = malloc(local_203c);
memcpy(puVar10,local_2040,uVar3);
local_2040 = puVar10;
}
if (iVar5 < 0) goto LAB_001c6e00;
}
local_203c = uVar13;
if (local_2040 == (uchar *)0x0) {
local_2040 = malloc(uVar13);
}
else {
local_2040 = realloc(local_2040,uVar13);
}
}
LAB_001c6e00:
_V_memcpy(local_2040,puVar9,uVar13);
LAB_001c6e1c:
puVar9 = *(ushort **)(param_2 + 0x18);
goto LAB_001c6e1f;
}
local_207c = 0;
if (8 < uVar13) {
local_207c = CLZSS::GetActualSize((CLZSS *)local_2068,(uchar *)puVar9);
}
iVar5 = local_2034;
uVar3 = local_203c;
if (local_207c == uVar14 + 7 >> 3) {
if ((int)local_203c < (int)local_207c) {
if (local_2038 < 0) {
local_2038 = local_2034;
if (local_203c == 0) {
local_2040 = (uchar *)0x0;
}
else {
puVar10 = malloc(local_203c);
memcpy(puVar10,local_2040,uVar3);
local_2040 = puVar10;
}
if (iVar5 < 0) goto LAB_001c6962;
}
local_203c = local_207c;
if (local_2040 == (uchar *)0x0) {
local_2040 = malloc(local_207c);
}
else {
local_2040 = realloc(local_2040,local_207c);
}
}
LAB_001c6962:
sVar6 = CLZSS::SafeUncompress
((CLZSS *)local_2068,(uchar *)puVar9,uVar13,local_2040,local_207c);
if (local_207c == sVar6) goto LAB_001c6e1c;
}
goto LAB_001c69a0;
}
LAB_001c69a8:
*(int *)(param_2 + 0x40) = iVar5;
if (0x37aaf < iVar5) {
/* try { // try from 001c6a7b to 001c6ba5 has its CatchHandler @ 001c7266 */
uVar16 = netadr_s::ToString((netadr_s *)param_2,false);
ConDMsg("NET_ReceiveDatagram: Oversize packet from %s\n",uVar16);
uVar16 = 0;
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_2040);
goto LAB_001c69f8;
}
uVar14 = 0;
LAB_001c69b9:
piVar12 = *(int **)(param_2 + 0x18);
iVar5 = *piVar12;
if (iVar5 == -2) {
uVar16 = NET_GetLong(param_1,param_2);
if ((char)uVar16 != '\0') {
piVar12 = *(int **)(param_2 + 0x18);
iVar5 = *piVar12;
goto LAB_001c69c7;
}
}
else {
LAB_001c69c7:
if (iVar5 == -3) {
if (((4 < *(uint *)(param_2 + 0x40)) &&
(uVar11 = *(uint *)(param_2 + 0x40) - 4, uVar11 < 0x37aa1)) &&
(local_2060 = 0x1000, 8 < uVar11)) {
sVar6 = CLZSS::GetActualSize((CLZSS *)local_2068,(uchar *)(piVar12 + 1));
if (sVar6 - 1 < 0x37aa0) {
puVar10 = local_1020;
local_102c = 0x1000;
local_1028 = 0xffffffff;
local_1024 = 0x1000;
if (0x1000 < (int)sVar6) {
local_1028 = 0x1000;
local_1030 = puVar10;
__dest = malloc(0x1000);
memcpy(__dest,puVar10,0x1000);
local_1030 = __dest;
local_102c = sVar6;
puVar10 = realloc(__dest,sVar6);
}
local_1030 = puVar10;
/* try { // try from 001c6c19 to 001c6c1d has its CatchHandler @ 001c7240 */
sVar8 = CLZSS::SafeUncompress
((CLZSS *)local_2068,(uchar *)(piVar12 + 1),uVar11,puVar10,sVar6);
if ((sVar6 != sVar8) || (sVar8 == 0)) {
uVar16 = 0;
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_1030);
goto LAB_001c69ea;
}
/* try { // try from 001c7048 to 001c704c has its CatchHandler @ 001c7240 */
_V_memcpy(*(void **)(param_2 + 0x18),local_1030,sVar8);
*(size_t *)(param_2 + 0x40) = sVar8;
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_1030);
goto LAB_001c69d0;
}
}
LAB_001c69a0:
uVar16 = 0;
}
else {
LAB_001c69d0:
if (uVar14 != 0) {
bVar1 = *(byte *)(*(int *)(param_2 + 0x18) + 8);
iVar5 = *(int *)(param_2 + 0x40);
cVar4 = ShouldChecksumPackets();
if (cVar4 != '\0') {
CBitRead::Seek((CBitRead *)(param_2 + 0x1c),0x48);
iVar17 = *(int *)(param_2 + 0x30);
uVar11 = *(uint *)(param_2 + 0x2c);
if (iVar17 < 0x10) {
puVar15 = *(uint **)(param_2 + 0x34);
if (puVar15 == *(uint **)(param_2 + 0x38)) {
*(undefined4 *)(param_2 + 0x30) = 1;
uVar13 = 0;
*(undefined4 *)(param_2 + 0x2c) = 0;
*(uint **)(param_2 + 0x34) = puVar15 + 1;
param_2[0x20] = (netpacket_s)0x1;
}
else {
if (*(uint **)(param_2 + 0x38) < puVar15) {
param_2[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_2 + 0x2c) = 0;
}
else {
*(uint **)(param_2 + 0x34) = puVar15 + 1;
uVar3 = *puVar15;
*(uint *)(param_2 + 0x2c) = uVar3;
if (param_2[0x20] == (netpacket_s)0x0) {
uVar13 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar17];
*(int *)(param_2 + 0x30) = iVar17 + 0x10;
uVar13 = (uVar13 & uVar3) << ((byte)iVar17 & 0x1f) | uVar11;
*(uint *)(param_2 + 0x2c) = uVar3 >> ((byte)(0x10 - iVar17) & 0x1f);
goto LAB_001c6b0f;
}
}
uVar13 = 0;
}
}
else {
*(int *)(param_2 + 0x30) = iVar17 + -0x10;
uVar13 = uVar11 & 0xffff;
if (iVar17 + -0x10 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x34);
*(undefined4 *)(param_2 + 0x30) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x38)) {
*(undefined4 *)(param_2 + 0x30) = 1;
*(undefined4 *)(param_2 + 0x2c) = 0;
*(undefined4 **)(param_2 + 0x34) = puVar2 + 1;
}
else if (*(undefined4 **)(param_2 + 0x38) < puVar2) {
param_2[0x20] = (netpacket_s)0x1;
*(undefined4 *)(param_2 + 0x2c) = 0;
}
else {
*(undefined4 **)(param_2 + 0x34) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x2c) = *puVar2;
}
}
else {
*(uint *)(param_2 + 0x2c) = uVar11 >> 0x10;
}
}
LAB_001c6b0f:
CBitRead::Seek((CBitRead *)(param_2 + 0x1c),0);
if (*(int *)(param_2 + 0x40) - 0xcU < 0x37aa0) {
/* try { // try from 001c6ea6 to 001c6fd3 has its CatchHandler @ 001c7266 */
uVar11 = BufferToShortChecksum
((void *)(*(int *)(param_2 + 0x18) + 0xb),
*(int *)(param_2 + 0x40) - 0xb);
if ((uVar11 & 0xffff) == uVar13) goto LAB_001c6c48;
ConMsg("corrupted packet detected\n");
uVar16 = 0;
}
else {
ConMsg("corrupted packet detected (checksumbytes %d)\n");
uVar16 = 0;
}
goto LAB_001c69ea;
}
LAB_001c6c48:
/* try { // try from 001c6c51 to 001c6e37 has its CatchHandler @ 001c7266 */
bf_write::bf_write((bf_write *)local_2068);
bf_write::SetDebugName((bf_write *)local_2068,"X360 Fixup");
bf_write::StartWriting
((bf_write *)local_2068,*(void **)(param_2 + 0x18),0x37ab0,
iVar5 * 8 - ((int)(uint)bVar1 >> 5),-1);
bf_write::WriteBits((bf_write *)local_2068,local_2040,uVar14);
if ((int)local_205c % 8 - 1U < 2) {
if ((int)local_2060 < (int)(local_205c + 6)) {
local_205c = local_2060;
local_2058 = 1;
}
else {
iVar17 = ((int)local_205c >> 5) * 4;
puVar15 = (uint *)(local_2068[0] + iVar17);
*puVar15 = *puVar15 & *(uint *)(&DAT_003f2db8 + (local_205c & 0x1f) * 0x84);
iVar5 = 0x20 - (local_205c & 0x1f);
if (iVar5 < 6) {
puVar15 = (uint *)(local_2068[0] + 4 + iVar17);
*puVar15 = *puVar15 & (&g_BitWriteMasks)[6 - iVar5];
}
local_205c = local_205c + 6;
}
}
*(int *)(param_2 + 0x40) = (int)(local_205c + 7) >> 3;
cVar4 = ShouldChecksumPackets();
if (cVar4 != '\0') {
bf_write::SeekToBit((bf_write *)local_2068,0x48);
uVar14 = BufferToShortChecksum
((void *)(*(int *)(param_2 + 0x18) + 0xb),
*(int *)(param_2 + 0x40) - 0xb);
if ((int)(local_205c + 0x10) <= (int)local_2060) {
uVar11 = local_205c & 0x1f;
iVar17 = ((int)local_205c >> 5) * 4;
puVar15 = (uint *)(local_2068[0] + iVar17);
*puVar15 = *puVar15 & *(uint *)(&DAT_003f2de0 + uVar11 * 0x84) |
(uVar14 & 0xffff) << (sbyte)uVar11;
iVar5 = 0x20 - uVar11;
if (iVar5 < 0x10) {
puVar15 = (uint *)(local_2068[0] + 4 + iVar17);
*puVar15 = (uVar14 & 0xffff) >> ((byte)iVar5 & 0x1f) |
(&g_BitWriteMasks)[0x10 - iVar5] & *puVar15;
}
}
}
}
uVar16 = NET_LagPacket(true,param_2);
}
}
LAB_001c69ea:
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_2040);
LAB_001c69f8:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return uVar16;
}
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.