KeyValues::ReadAsBinary
0x00044b10 · 2665 bytes · __thiscall
_ZN9KeyValues12ReadAsBinaryER10CUtlBuffer
Decompiled
undefined (2 params)
/* KeyValues::ReadAsBinary(CUtlBuffer&) */
bool __thiscall KeyValues::ReadAsBinary(KeyValues *this,CUtlBuffer *param_1)
{
short sVar1;
undefined2 uVar2;
char cVar3;
KeyValues *pKVar4;
uint *puVar5;
void *pvVar6;
int iVar7;
int iVar8;
KeyValues KVar9;
int iVar10;
int iVar11;
uint uVar12;
undefined4 *puVar13;
uint uVar14;
int in_GS_OFFSET;
bool bVar15;
char *pcVar16;
undefined *puVar17;
short local_44a;
int local_448;
KeyValues *local_440;
undefined4 local_434;
uint local_430;
undefined4 local_42c;
uint local_428;
char local_420 [1023];
undefined1 local_21;
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if ((((byte)param_1[0x15] & 1) == 0) && (param_1[0x14] == (CUtlBuffer)0x0)) {
RemoveEverything(this);
Init(this,*(IKeyValuesSystem **)(this + 0x14),(bool)this[0x18]);
if (((byte)param_1[0x15] & 1) == 0) {
KVar9 = (KeyValues)0x0;
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 == '\0') goto LAB_00044bc3;
KVar9 = *(KeyValues *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)))
;
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
else {
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
}
if (KVar9 != (KeyValues)0xb) {
LAB_00044bc3:
local_440 = this;
do {
local_440[0x10] = KVar9;
CUtlBuffer::GetString(param_1,local_420,0x400);
pcVar16 = local_420;
local_21 = 0;
SetName(local_440,pcVar16);
switch(KVar9) {
case (KeyValues)0x0:
pKVar4 = operator_new((KeyValues *)0x2c,(uint)pcVar16);
Init(pKVar4,*(IKeyValuesSystem **)(this + 0x14),false);
/* try { // try from 00044e76 to 00044e7a has its CatchHandler @ 000455e7 */
SetName(pKVar4,"");
*(KeyValues **)(local_440 + 0x20) = pKVar4;
cVar3 = ReadAsBinary(pKVar4,param_1);
if (cVar3 == '\0') goto LAB_00044b3f;
break;
case (KeyValues)0x1:
CUtlBuffer::GetString(param_1,local_420,0x400);
local_21 = 0;
iVar11 = _V_strlen(local_420);
pvVar6 = operator_new__(iVar11 + 1U);
*(void **)(local_440 + 4) = pvVar6;
_V_memcpy(pvVar6,local_420,iVar11 + 1U);
break;
case (KeyValues)0x2:
if (((byte)param_1[0x15] & 1) == 0) {
LAB_000451c0:
cVar3 = CUtlBuffer::CheckGet(param_1,4);
uVar12 = 0;
if (cVar3 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar11 = *(int *)(param_1 + 0xc);
uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
}
else {
puVar13 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar13 == (undefined4 *)0x0) {
puVar13 = &local_434;
}
local_42c = local_434;
local_42c._1_3_ = (undefined3)(local_434 >> 8);
local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 3));
local_42c._2_2_ = (undefined2)(local_434 >> 0x10);
local_42c._0_2_ =
CONCAT11(*(undefined1 *)((int)puVar13 + 2),*(undefined1 *)((int)puVar13 + 3));
local_42c._3_1_ = (undefined1)(local_434 >> 0x18);
local_42c._0_3_ = CONCAT12(*(undefined1 *)((int)puVar13 + 1),(undefined2)local_42c);
local_42c = CONCAT13(*(undefined1 *)puVar13,(undefined3)local_42c);
_V_memcpy(&local_434,&local_42c,4);
iVar11 = *(int *)(param_1 + 0xc);
uVar12 = local_434;
}
*(int *)(param_1 + 0xc) = iVar11 + 4;
}
}
else {
local_434 = 0;
CUtlBuffer::Scanf(param_1,"%d",&local_434);
uVar12 = local_434;
}
goto LAB_00044df4;
case (KeyValues)0x3:
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,4);
uVar12 = 0;
if (cVar3 != '\0') {
iVar11 = *(int *)(param_1 + 0xc);
uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
local_434 = uVar12;
if (((byte)param_1[0x34] & 1) != 0) {
local_434._3_1_ = (undefined1)(uVar12 >> 0x18);
local_434._2_1_ = (undefined1)(uVar12 >> 0x10);
local_42c._0_2_ = CONCAT11(local_434._2_1_,local_434._3_1_);
local_434._1_1_ = (undefined1)(uVar12 >> 8);
local_42c._0_3_ = CONCAT12(local_434._1_1_,(undefined2)local_42c);
local_434._0_1_ = (undefined1)uVar12;
local_42c = CONCAT13((undefined1)local_434,(undefined3)local_42c);
_V_memcpy(&local_434,&local_42c,4);
iVar11 = *(int *)(param_1 + 0xc);
}
*(int *)(param_1 + 0xc) = iVar11 + 4;
uVar12 = local_434;
}
}
else {
local_434 = 0;
CUtlBuffer::Scanf(param_1,"%f",&local_434);
uVar12 = local_434;
}
*(uint *)(local_440 + 0xc) = uVar12;
break;
case (KeyValues)0x4:
if (((byte)param_1[0x15] & 1) == 0) goto LAB_000451c0;
local_434 = 0;
CUtlBuffer::Scanf(param_1,"%u",&local_434);
uVar12 = local_434;
LAB_00044df4:
*(uint *)(local_440 + 0xc) = uVar12;
break;
case (KeyValues)0x5:
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,2);
if (cVar3 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar11 = *(int *)(param_1 + 0xc);
local_44a = *(short *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
}
else {
puVar13 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar13 == (undefined4 *)0x0) {
puVar13 = &local_434;
}
uVar2 = local_42c._2_2_;
local_42c = CONCAT22(local_42c._2_2_,(short)local_434);
local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 1));
local_42c._0_2_ = CONCAT11(*(undefined1 *)puVar13,*(undefined1 *)((int)puVar13 + 1))
;
local_42c = CONCAT22(uVar2,(undefined2)local_42c);
_V_memcpy(&local_434,&local_42c,2);
iVar11 = *(int *)(param_1 + 0xc);
local_44a = (short)local_434;
}
*(int *)(param_1 + 0xc) = iVar11 + 2;
goto LAB_00044fab;
}
local_448 = 0;
iVar11 = 0;
local_44a = 0;
}
else {
local_434 = local_434 & 0xffff0000;
CUtlBuffer::Scanf(param_1,"%d",&local_434);
local_44a = (short)local_434;
LAB_00044fab:
local_448 = (int)local_44a;
if (local_448 < 0) goto LAB_00044b3f;
iVar11 = local_448 * 2;
}
if (*(int *)(param_1 + 0x1c) - *(int *)(param_1 + 0xc) < iVar11) goto LAB_00044b3f;
iVar11 = 0;
pvVar6 = operator_new__(local_448 * 4 + 4);
*(void **)(local_440 + 8) = pvVar6;
if (local_448 != 0) {
while( true ) {
iVar8 = iVar11 * 4;
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,2);
iVar10 = 0;
if (cVar3 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar7 = *(int *)(param_1 + 0xc);
sVar1 = *(short *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
}
else {
puVar13 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) +
*(int *)param_1);
if (puVar13 == (undefined4 *)0x0) {
puVar13 = &local_434;
}
uVar2 = local_42c._2_2_;
local_42c = CONCAT22(local_42c._2_2_,(short)local_434);
local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 1));
local_42c._0_2_ =
CONCAT11(*(undefined1 *)puVar13,*(undefined1 *)((int)puVar13 + 1));
local_42c = CONCAT22(uVar2,(undefined2)local_42c);
_V_memcpy(&local_434,&local_42c,2);
iVar7 = *(int *)(param_1 + 0xc);
sVar1 = (short)local_434;
}
iVar10 = (int)sVar1;
*(int *)(param_1 + 0xc) = iVar7 + 2;
}
}
else {
local_434 = local_434 & 0xffff0000;
CUtlBuffer::Scanf(param_1,"%d",&local_434);
iVar10 = (int)(short)local_434;
}
iVar11 = iVar11 + 1;
*(int *)((int)pvVar6 + iVar8) = iVar10;
if (iVar11 == local_448) break;
pvVar6 = *(void **)(local_440 + 8);
}
pvVar6 = *(void **)(local_440 + 8);
}
*(undefined4 *)((int)pvVar6 + local_44a * 4) = 0;
break;
case (KeyValues)0x6:
KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 != '\0') {
KVar9 = *(KeyValues *)
(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
}
else {
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
}
local_440[0xc] = KVar9;
KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 != '\0') {
KVar9 = *(KeyValues *)
(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
}
else {
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
}
local_440[0xd] = KVar9;
KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 != '\0') {
KVar9 = *(KeyValues *)
(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
}
else {
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
}
local_440[0xe] = KVar9;
KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
if (((byte)param_1[0x15] & 1) == 0) {
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 != '\0') {
KVar9 = *(KeyValues *)
(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
}
}
else {
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
}
local_440[0xf] = KVar9;
break;
case (KeyValues)0x7:
puVar5 = operator_new__(8);
*(uint **)(local_440 + 4) = puVar5;
if (((byte)param_1[0x15] & 1) == 0) {
uVar12 = 0;
uVar14 = 0;
cVar3 = CUtlBuffer::CheckGet(param_1,8);
if (cVar3 != '\0') {
if (((byte)param_1[0x34] & 1) == 0) {
iVar11 = *(int *)(param_1 + 0xc);
uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
uVar14 = *(uint *)(*(int *)param_1 + 4 + (iVar11 - *(int *)(param_1 + 0x20)));
}
else {
puVar13 = (undefined4 *)
((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
if (puVar13 == (undefined4 *)0x0) {
puVar13 = &local_434;
}
local_42c = local_434;
local_428 = local_430;
iVar11 = 0;
do {
iVar8 = iVar11 + 1;
*(undefined1 *)((int)&local_42c + iVar11) =
*(undefined1 *)((int)puVar13 + (7 - iVar11));
iVar11 = iVar8;
} while (iVar8 != 8);
_V_memcpy(&local_434,&local_42c,8);
iVar11 = *(int *)(param_1 + 0xc);
uVar12 = local_434;
uVar14 = local_430;
}
*(int *)(param_1 + 0xc) = iVar11 + 8;
}
}
else {
local_434 = 0;
local_430 = 0;
CUtlBuffer::Scanf(param_1,"%I64d",&local_434);
uVar12 = local_434;
uVar14 = local_430;
}
*puVar5 = uVar12;
puVar5[1] = uVar14;
}
if (param_1[0x14] != (CUtlBuffer)0x0) goto LAB_00044b3f;
if (((byte)param_1[0x15] & 1) == 0) {
puVar17 = (undefined *)0x1;
KVar9 = (KeyValues)0x0;
cVar3 = CUtlBuffer::CheckGet(param_1,1);
if (cVar3 != '\0') {
KVar9 = *(KeyValues *)
(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
*(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
goto LAB_00044d5c;
}
}
else {
puVar17 = &DAT_000b2b9a;
local_42c = local_42c & 0xffffff00;
CUtlBuffer::Scanf(param_1,"%u",&local_42c);
KVar9 = local_42c._0_1_;
LAB_00044d5c:
if (KVar9 == (KeyValues)0xb) break;
}
pKVar4 = operator_new((KeyValues *)0x2c,(uint)puVar17);
Init(pKVar4,*(IKeyValuesSystem **)(this + 0x14),false);
/* try { // try from 00044d9e to 00044da2 has its CatchHandler @ 000455f9 */
SetName(pKVar4,"");
*(KeyValues **)(local_440 + 0x1c) = pKVar4;
local_440 = pKVar4;
} while( true );
}
bVar15 = param_1[0x14] == (CUtlBuffer)0x0;
}
else {
LAB_00044b3f:
bVar15 = false;
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return bVar15;
}
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.