CBaseServer::ReplyReservationRequest
0x0010e3b0 · 2548 bytes · __thiscall
_ZN11CBaseServer23ReplyReservationRequestER8netadr_sR7bf_read
Decompiled
undefined (3 params)
/* CBaseServer::ReplyReservationRequest(netadr_s&, bf_read&) */
void __thiscall
CBaseServer::ReplyReservationRequest(CBaseServer *this,netadr_s *param_1,bf_read *param_2)
{
float fVar1;
undefined4 *puVar2;
uint *puVar3;
uint uVar4;
char cVar5;
uint uVar6;
int iVar7;
int iVar8;
undefined4 uVar9;
uint uVar10;
undefined4 uVar11;
KeyValues *this_00;
char *pcVar12;
uchar *puVar13;
int in_GS_OFFSET;
double dVar14;
undefined8 uVar15;
uint local_6d4;
IceKey local_6b0 [56];
uint local_678;
uint local_674;
uchar local_420 [8];
uchar auStack_418 [1016];
int local_20;
iVar7 = *(int *)(param_2 + 0x14);
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (iVar7 < 0x20) {
uVar10 = *(uint *)(param_2 + 0x10);
puVar3 = *(uint **)(param_2 + 0x18);
if (puVar3 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar3 + 1;
param_2[4] = (bf_read)0x1;
}
else if (*(uint **)(param_2 + 0x1c) < puVar3) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar3 + 1;
uVar6 = *puVar3;
*(uint *)(param_2 + 0x10) = uVar6;
if (param_2[4] == (bf_read)0x0) {
*(int *)(param_2 + 0x14) = iVar7;
uVar10 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar6) << ((byte)iVar7 & 0x1f) |
uVar10;
*(uint *)(param_2 + 0x10) = uVar6 >> ((byte)(0x20 - iVar7) & 0x1f);
goto LAB_0010e3fc;
}
}
iVar7 = GetHostVersion();
if (iVar7 != 0) goto LAB_0010e405;
}
else {
*(int *)(param_2 + 0x14) = iVar7 + -0x20;
uVar10 = *(uint *)(param_2 + 0x10);
if (iVar7 + -0x20 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else {
if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
goto LAB_0010e3f5;
}
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
LAB_0010e3f5:
*(undefined4 *)(param_2 + 0x10) = 0;
}
LAB_0010e3fc:
uVar6 = GetHostVersion();
if (uVar6 != uVar10) goto LAB_0010e405;
}
if (*(int *)(this + 0x170) == 0 && *(int *)(this + 0x16c) == 0) {
iVar7 = (**(code **)(*(int *)this + 0xc))(this);
iVar8 = (**(code **)(*(int *)this + 0x14))(this);
if (iVar7 == iVar8 || iVar7 - iVar8 < 0) {
uVar10 = (**(code **)(*(int *)this + 0xd8))(this,param_1);
cVar5 = CanAcceptChallengesFrom(this,param_1);
if (cVar5 == '\0') {
uVar9 = netadr_s::ToString((netadr_s *)(this + 0x1ac),false);
uVar11 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from address %s, but challenges exclusive for %s\n",uVar11,uVar9
);
}
else if (uVar10 == 0) {
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from unknown address %s\n",uVar9);
}
else {
iVar7 = *(int *)(param_2 + 0x14);
if (iVar7 < 0x20) {
local_6d4 = *(uint *)(param_2 + 0x10);
puVar3 = *(uint **)(param_2 + 0x18);
if (puVar3 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
local_6d4 = 0;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar3 + 1;
param_2[4] = (bf_read)0x1;
}
else {
if (*(uint **)(param_2 + 0x1c) < puVar3) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar3 + 1;
uVar6 = *puVar3;
*(uint *)(param_2 + 0x10) = uVar6;
if (param_2[4] == (bf_read)0x0) {
*(int *)(param_2 + 0x14) = iVar7;
uVar4 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7];
*(uint *)(param_2 + 0x10) = uVar6 >> ((byte)(0x20 - iVar7) & 0x1f);
local_6d4 = (uVar4 & uVar6) << ((byte)iVar7 & 0x1f) | local_6d4;
goto LAB_0010e655;
}
}
local_6d4 = 0;
}
}
else {
*(int *)(param_2 + 0x14) = iVar7 + -0x20;
local_6d4 = *(uint *)(param_2 + 0x10);
if (iVar7 + -0x20 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else {
if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
goto LAB_0010e648;
}
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
LAB_0010e648:
*(undefined4 *)(param_2 + 0x10) = 0;
}
LAB_0010e655:
if ((local_6d4 - 1 < 0x400) && ((local_6d4 & 7) == 0)) {
IceKey::IceKey(local_6b0,1);
local_674 = uVar10 ^ 0xaa98e42c;
local_678 = uVar10 ^ 0x5ef8ce12;
/* try { // try from 0010e803 to 0010e905 has its CatchHandler @ 0010ede5 */
IceKey::set(local_6b0,(uchar *)&local_678);
CBitRead::ReadBytes((CBitRead *)param_2,local_420,local_6d4);
puVar13 = local_420;
do {
IceKey::decrypt(local_6b0,puVar13,puVar13);
puVar13 = puVar13 + 8;
} while (puVar13 != auStack_418 + (local_6d4 - 1 & 0xfffffff8));
CBitRead::StartReading((CBitRead *)param_2,local_420,local_6d4,0,-1);
iVar7 = *(int *)(param_2 + 0x14);
if (iVar7 < 0x20) {
uVar10 = *(uint *)(param_2 + 0x10);
puVar2 = *(undefined4 **)(param_2 + 0x18);
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
param_2[4] = (bf_read)0x1;
}
else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
if (param_2[4] == (bf_read)0x0) {
uVar9 = *(undefined4 *)(param_2 + 0x14);
*(int *)(param_2 + 0x14) = iVar7;
uVar10 = (*(uint *)(param_2 + 0x10) & (&CBitBuffer::s_nMaskTable)[0x20 - iVar7]) <<
((byte)uVar9 & 0x1f) | uVar10;
*(uint *)(param_2 + 0x10) =
*(uint *)(param_2 + 0x10) >> ((byte)(0x20 - iVar7) & 0x1f);
goto LAB_0010e8cf;
}
LAB_0010e8d6:
uVar9 = netadr_s::ToString(param_1,false);
Msg("ReplyReservationRequest: Reservation request with bogus payload data from %s [%d bytes]\n"
,uVar9,local_6d4);
}
else {
*(int *)(param_2 + 0x14) = iVar7 + -0x20;
uVar10 = *(uint *)(param_2 + 0x10);
if (iVar7 + -0x20 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else {
if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
goto LAB_0010e8c8;
}
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
LAB_0010e8c8:
*(undefined4 *)(param_2 + 0x10) = 0;
}
LAB_0010e8cf:
if (uVar10 != 0xfeedbeef) goto LAB_0010e8d6;
}
IceKey::~IceKey(local_6b0);
uVar15 = CBitRead::ReadLongLong((CBitRead *)param_2);
pcVar12 = (char *)((ulonglong)uVar15 >> 0x20);
uVar10 = (uint)uVar15;
iVar7 = *(int *)(param_2 + 0x14);
if (iVar7 < 0x20) {
uVar6 = *(uint *)(param_2 + 0x10);
puVar3 = *(uint **)(param_2 + 0x18);
if (puVar3 == *(uint **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(uint **)(param_2 + 0x18) = puVar3 + 1;
param_2[4] = (bf_read)0x1;
}
else if (*(uint **)(param_2 + 0x1c) < puVar3) {
param_2[4] = (bf_read)0x1;
*(undefined4 *)(param_2 + 0x10) = 0;
}
else {
*(uint **)(param_2 + 0x18) = puVar3 + 1;
uVar4 = *puVar3;
*(uint *)(param_2 + 0x10) = uVar4;
if (param_2[4] == (bf_read)0x0) {
*(int *)(param_2 + 0x14) = iVar7;
uVar6 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar4) <<
((byte)iVar7 & 0x1f) | uVar6;
*(uint *)(param_2 + 0x10) = uVar4 >> ((byte)(0x20 - iVar7) & 0x1f);
goto LAB_0010e96b;
}
}
fVar1 = *(float *)(sv_reservation_timeout._28_4_ + 0x2c);
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from %s accepted: server reserved with reservation cookie 0x%llx for %.1f seconds\n"
,uVar9,uVar10,pcVar12,(double)fVar1);
DevMsg(" settings size = %d\n",0);
*(float *)(this + 0x174) = (float)((double)fVar1 + net_time);
SetReservationCookie(CONCAT44(uVar10,this),pcVar12,"ReplyReservationRequest");
*(undefined4 *)(this + 0x17c) = 0;
}
else {
*(int *)(param_2 + 0x14) = iVar7 + -0x20;
uVar6 = *(uint *)(param_2 + 0x10);
if (iVar7 + -0x20 == 0) {
puVar2 = *(undefined4 **)(param_2 + 0x18);
*(undefined4 *)(param_2 + 0x14) = 0x20;
if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
*(undefined4 *)(param_2 + 0x14) = 1;
*(undefined4 *)(param_2 + 0x10) = 0;
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
}
else {
if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
param_2[4] = (bf_read)0x1;
goto LAB_0010e964;
}
*(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
*(undefined4 *)(param_2 + 0x10) = *puVar2;
}
}
else {
LAB_0010e964:
*(undefined4 *)(param_2 + 0x10) = 0;
}
LAB_0010e96b:
fVar1 = *(float *)(sv_reservation_timeout._28_4_ + 0x2c);
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from %s accepted: server reserved with reservation cookie 0x%llx for %.1f seconds\n"
,uVar9,uVar10,pcVar12,(double)fVar1);
DevMsg(" settings size = %d\n",uVar6);
*(float *)(this + 0x174) = (float)((double)fVar1 + net_time);
SetReservationCookie(CONCAT44(uVar10,this),pcVar12,"ReplyReservationRequest");
*(undefined4 *)(this + 0x17c) = 0;
if (0 < (int)uVar6) {
this_00 = KeyValues::operator_new((KeyValues *)0x2c,uVar10);
/* try { // try from 0010ea57 to 0010ea5b has its CatchHandler @ 0010edcd */
KeyValues::KeyValues(this_00,"",(IKeyValuesSystem *)0x0,false);
if (uVar6 < 0x259) {
/* try { // try from 0010ec00 to 0010ec04 has its CatchHandler @ 0010ee27 */
CUtlBuffer::CUtlBuffer((CUtlBuffer *)local_6b0,0,0,0);
/* try { // try from 0010ec16 to 0010ec7a has its CatchHandler @ 0010edfd */
CBitRead::ReadBytes((CBitRead *)param_2,&local_678,uVar6);
CUtlBuffer::Put((CUtlBuffer *)local_6b0,&local_678,uVar6);
KeyValues::ReadAsBinary(this_00,(CUtlBuffer *)local_6b0);
(**(code **)(*serverGameDLL + 0x94))(serverGameDLL,this_00);
uVar9 = KeyValues::GetInt(this_00,"Members/numSlots",0);
*(undefined4 *)(this + 0x17c) = uVar9;
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)local_6b0);
}
if (this_00 != (KeyValues *)0x0) {
KeyValues::deleteThis();
}
}
}
this[0x1b8] = (CBaseServer)0x1;
this[0x1b9] = (CBaseServer)0x1;
*(undefined4 *)(this + 0x1bc) = *(undefined4 *)param_1;
*(undefined4 *)(this + 0x1c0) = *(undefined4 *)(param_1 + 4);
*(undefined2 *)(this + 0x1c4) = *(undefined2 *)(param_1 + 8);
goto LAB_0010e405;
}
}
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("ReplyReservationRequest: Reservation request with bogus payload size from %s [%d bytes]\n"
,uVar9,local_6d4);
}
}
else {
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from %s rejected: server not empty\n",uVar9);
}
}
else {
dVar14 = (double)*(float *)(this + 0x174) - net_time;
uVar9 = netadr_s::ToString(param_1,false);
DevMsg("Reservation request from %s rejected: server already reserved (for %d more seconds)\n",
uVar9,(int)dVar14);
}
this[0x1b8] = (CBaseServer)0x1;
this[0x1b9] = (CBaseServer)0x0;
*(undefined4 *)(this + 0x1bc) = *(undefined4 *)param_1;
*(undefined4 *)(this + 0x1c0) = *(undefined4 *)(param_1 + 4);
*(undefined2 *)(this + 0x1c4) = *(undefined2 *)(param_1 + 8);
SendReservationStatus(this);
LAB_0010e405:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
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.