ParseSteamInfFile
0x00216580 · 712 bytes · __cdecl
_Z17ParseSteamInfFilePKcRj
Decompiled
undefined (2 params)
/* ParseSteamInfFile(char const*, unsigned int&) */
void ParseSteamInfFile(char *param_1,uint *param_2)
{
undefined4 *puVar1;
code *pcVar2;
int iVar3;
char *pcVar4;
int iVar5;
int iVar6;
int iVar7;
undefined4 uVar8;
uint uVar9;
int *piVar10;
int in_GS_OFFSET;
undefined4 uStack_150;
int local_14c;
char *local_148 [2];
int local_140 [4];
uint *local_130 [4];
undefined1 local_120 [255];
undefined1 local_21;
int local_20;
local_130[0] = param_2;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_14c = g_pFileSystem + 4;
local_140[0] = 0;
local_148[1] = "r";
local_148[0] = param_1;
uStack_150 = 0x2165c8;
pcVar4 = (char *)(**(code **)(*(int *)(g_pFileSystem + 4) + 8))();
piVar10 = &local_14c;
if (pcVar4 == (char *)0x0) {
LAB_002166e0:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
*(undefined **)((int)piVar10 + -4) = &UNK_0021685e;
__stack_chk_fail();
}
local_14c = g_pFileSystem + 4;
uStack_150 = 0x2165e7;
local_148[0] = pcVar4;
iVar5 = (**(code **)(*(int *)(g_pFileSystem + 4) + 0x18))();
iVar3 = -((iVar5 + 0x10U & 0xfffffff0) + 0x10);
iVar7 = (int)local_130 + iVar3;
puVar1 = *(undefined4 **)(g_pFileSystem + 4);
*(char **)((int)local_140 + iVar3) = pcVar4;
*(int *)((int)&local_14c + iVar3) = g_pFileSystem + 4;
*(int *)((int)local_140 + iVar3 + -4) = iVar5;
*(int *)((int)local_148 + iVar3) = iVar7;
pcVar2 = (code *)*puVar1;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216616;
iVar6 = (*pcVar2)();
iVar5 = *(int *)(g_pFileSystem + 4);
*(char **)((int)local_148 + iVar3) = pcVar4;
*(int *)((int)&local_14c + iVar3) = g_pFileSystem + 4;
pcVar2 = *(code **)(iVar5 + 0xc);
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216630;
(*pcVar2)();
*(undefined1 *)(iVar7 + iVar6) = 0;
iVar5 = 0;
do {
*(int *)((int)&local_14c + iVar3) = iVar7;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216648;
iVar7 = COM_Parse(*(char **)((int)&local_14c + iVar3));
piVar10 = (int *)((int)&local_14c + iVar3);
while( true ) {
if (iVar7 == 0) goto LAB_002166e0;
*(undefined1 **)((int)&local_14c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21665e;
iVar6 = _V_strlen(*(char **)((int)&local_14c + iVar3));
piVar10 = (int *)((int)&local_14c + iVar3);
if ((iVar6 < 1) || (piVar10 = (int *)((int)&local_14c + iVar3), 3 < iVar5)) goto LAB_002166e0;
*(char **)((int)&local_14c + iVar3) = "PatchVersion=";
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216673;
uVar8 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(char **)((int)local_148 + iVar3) = "PatchVersion=";
*(undefined4 *)((int)local_140 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_14c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21668b;
iVar6 = V_strnicmp(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
if (iVar6 != 0) break;
*(char **)((int)&local_14c + iVar3) = "PatchVersion=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21669e;
iVar6 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(undefined4 *)((int)local_140 + iVar3 + -4) = 0xff;
*(undefined1 **)((int)&local_14c + iVar3) = local_120;
*(undefined1 **)((int)local_148 + iVar3) = &com_token + iVar6;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2166b7;
V_strncpy(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
*(undefined1 **)((int)local_148 + iVar3) = local_120;
*(undefined1 **)((int)&local_14c + iVar3) = g_sVersionString;
local_21 = 0;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2166cb;
CUtlString::operator=
(*(CUtlString **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3));
*(int *)((int)&local_14c + iVar3) = iVar7;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2166d3;
iVar7 = COM_Parse(*(char **)((int)&local_14c + iVar3));
piVar10 = (int *)((int)&local_14c + iVar3);
}
*(char **)((int)&local_14c + iVar3) = "NetworkVersion=";
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21670c;
uVar8 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(char **)((int)local_148 + iVar3) = "NetworkVersion=";
*(undefined4 *)((int)local_140 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_14c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216724;
iVar6 = V_strnicmp(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
if (iVar6 == 0) {
*(char **)((int)&local_14c + iVar3) = "NetworkVersion=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216737;
iVar6 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(undefined4 *)((int)local_140 + iVar3 + -4) = 0xff;
*(undefined1 **)((int)&local_14c + iVar3) = local_120;
*(undefined1 **)((int)local_148 + iVar3) = &com_token + iVar6;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216750;
V_strncpy(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
*(undefined1 **)((int)local_148 + iVar3) = local_120;
*(undefined1 **)((int)&local_14c + iVar3) = g_sNetworkVersionString;
local_21 = 0;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216764;
CUtlString::operator=
(*(CUtlString **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3));
}
else {
*(char **)((int)&local_14c + iVar3) = "ProductName=";
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21677c;
uVar8 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(char **)((int)local_148 + iVar3) = "ProductName=";
*(undefined4 *)((int)local_140 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_14c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216794;
iVar6 = V_strnicmp(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
if (iVar6 == 0) {
*(char **)((int)&local_14c + iVar3) = "ProductName=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2167a7;
iVar6 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(undefined4 *)((int)local_140 + iVar3 + -4) = 0xff;
*(undefined1 **)((int)&local_14c + iVar3) = local_120;
*(undefined1 **)((int)local_148 + iVar3) = &com_token + iVar6;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2167c0;
V_strncpy(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
*(undefined1 **)((int)local_148 + iVar3) = local_120;
*(undefined1 **)((int)&local_14c + iVar3) = g_sProductString;
local_21 = 0;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2167d4;
CUtlString::operator=
(*(CUtlString **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3));
}
else {
*(char **)((int)&local_14c + iVar3) = "AppID=";
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x2167ec;
uVar8 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(char **)((int)local_148 + iVar3) = "AppID=";
*(undefined4 *)((int)local_140 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_14c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216804;
iVar6 = V_strnicmp(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
if (iVar6 == 0) {
*(char **)((int)&local_14c + iVar3) = "AppID=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21681b;
iVar6 = _V_strlen(*(char **)((int)&local_14c + iVar3));
*(undefined4 *)((int)local_140 + iVar3 + -4) = 0x1f;
*(undefined1 **)((int)&local_14c + iVar3) = local_120;
*(undefined1 **)((int)local_148 + iVar3) = &com_token + iVar6;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x216834;
V_strncpy(*(char **)((int)&local_14c + iVar3),*(char **)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
*(undefined4 *)((int)local_140 + iVar3 + -4) = 10;
*(undefined4 *)((int)local_148 + iVar3) = 0;
*(undefined1 **)((int)&local_14c + iVar3) = local_120;
*(undefined4 *)((int)&uStack_150 + iVar3) = 0x21684c;
uVar9 = strtol(*(char **)((int)&local_14c + iVar3),*(char ***)((int)local_148 + iVar3),
*(int *)((int)local_140 + iVar3 + -4));
*local_130[0] = uVar9;
}
}
}
} while( true );
}
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.