ParseSteamInfFile
0x0017cc80 · 715 bytes · __regparm3
_ZL17ParseSteamInfFilePKcRj.constprop.40
Decompiled
undefined (2 params)
/* ParseSteamInfFile(char const*, unsigned int&) [clone .constprop.40] */
bool __regparm3 ParseSteamInfFile(char *param_1,uint *param_2)
{
undefined4 *puVar1;
code *pcVar2;
int iVar3;
char *pcVar4;
int iVar5;
int iVar6;
int iVar7;
undefined4 uVar8;
long lVar9;
int *piVar10;
int in_GS_OFFSET;
bool bVar11;
undefined4 uStack_70;
int local_6c;
char *local_68 [2];
int local_60 [4];
int local_50 [4];
undefined1 local_40 [32];
int local_20;
piVar10 = &local_6c;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_6c = g_pFileSystem + 4;
local_60[0] = 0;
local_68[1] = "r";
local_68[0] = "steam.inf";
uStack_70 = 0x17ccbf;
pcVar4 = (char *)(**(code **)(*(int *)(g_pFileSystem + 4) + 8))();
bVar11 = false;
if (pcVar4 == (char *)0x0) {
LAB_0017cde6:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined **)((int)piVar10 + -4) = &UNK_0017cf4e;
__stack_chk_fail();
}
return bVar11;
}
local_6c = g_pFileSystem + 4;
uStack_70 = 0x17cce0;
local_68[0] = pcVar4;
iVar5 = (**(code **)(*(int *)(g_pFileSystem + 4) + 0x18))();
iVar3 = -((iVar5 + 0x10U & 0xfffffff0) + 0x10);
piVar10 = (int *)((int)&local_6c + iVar3);
iVar6 = (int)local_50 + iVar3;
puVar1 = *(undefined4 **)(g_pFileSystem + 4);
*(char **)((int)local_60 + iVar3) = pcVar4;
*(int *)((int)&local_6c + iVar3) = g_pFileSystem + 4;
*(int *)((int)local_60 + iVar3 + -4) = iVar5;
*(int *)((int)local_68 + iVar3) = iVar6;
pcVar2 = (code *)*puVar1;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd0f;
local_50[0] = (*pcVar2)();
iVar5 = *(int *)(g_pFileSystem + 4);
*(char **)((int)local_68 + iVar3) = pcVar4;
*(int *)((int)&local_6c + iVar3) = g_pFileSystem + 4;
pcVar2 = *(code **)(iVar5 + 0xc);
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd2a;
(*pcVar2)();
*(undefined1 *)(iVar6 + local_50[0]) = 0;
iVar5 = 0;
LAB_0017cd38:
*(int *)((int)&local_6c + iVar3) = iVar6;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd40;
iVar6 = COM_Parse(*(char **)((int)&local_6c + iVar3));
do {
if (iVar6 == 0) {
LAB_0017cde0:
bVar11 = iVar5 == 4;
goto LAB_0017cde6;
}
*(undefined1 **)((int)&local_6c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd56;
iVar7 = _V_strlen(*(char **)((int)&local_6c + iVar3));
if ((iVar7 < 1) || (3 < iVar5)) goto LAB_0017cde0;
*(char **)((int)&local_6c + iVar3) = "PatchVersion=";
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd6f;
uVar8 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(char **)((int)local_68 + iVar3) = "PatchVersion=";
*(undefined4 *)((int)local_60 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_6c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd87;
iVar7 = V_strnicmp(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
if (iVar7 != 0) break;
*(char **)((int)&local_6c + iVar3) = "PatchVersion=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cd9a;
iVar7 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(undefined4 *)((int)local_60 + iVar3 + -4) = 0x1f;
*(undefined1 **)((int)&local_6c + iVar3) = spszVersionString;
*(undefined1 **)((int)local_68 + iVar3) = &com_token + iVar7;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cdb7;
V_strncpy(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
spszVersionString[0x1f] = 0;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cdc8;
sHostVersion = VerToInt(spszVersionString);
*(int *)((int)&local_6c + iVar3) = iVar6;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cdd5;
iVar6 = COM_Parse(*(char **)((int)&local_6c + iVar3));
} while( true );
*(char **)((int)&local_6c + iVar3) = "NetworkVersion=";
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce0c;
uVar8 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(char **)((int)local_68 + iVar3) = "NetworkVersion=";
*(undefined4 *)((int)local_60 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_6c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce24;
iVar7 = V_strnicmp(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
if (iVar7 == 0) {
*(char **)((int)&local_6c + iVar3) = "NetworkVersion=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce37;
iVar7 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(undefined4 *)((int)local_60 + iVar3 + -4) = 0x1f;
*(undefined1 **)((int)&local_6c + iVar3) = spszNetworkVersionString;
*(undefined1 **)((int)local_68 + iVar3) = &com_token + iVar7;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce54;
V_strncpy(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
spszNetworkVersionString[0x1f] = 0;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce65;
sNetworkVersion = VerToInt(spszNetworkVersionString);
}
else {
*(char **)((int)&local_6c + iVar3) = "ProductName=";
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce7c;
uVar8 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(char **)((int)local_68 + iVar3) = "ProductName=";
*(undefined4 *)((int)local_60 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_6c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17ce94;
iVar7 = V_strnicmp(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
if (iVar7 == 0) {
*(char **)((int)&local_6c + iVar3) = "ProductName=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cea7;
iVar7 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(undefined4 *)((int)local_60 + iVar3 + -4) = 0x1f;
*(undefined1 **)((int)&local_6c + iVar3) = spszProductString;
*(undefined1 **)((int)local_68 + iVar3) = &com_token + iVar7;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cec4;
V_strncpy(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
spszProductString[0x1f] = 0;
}
else {
*(char **)((int)&local_6c + iVar3) = "AppID=";
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cedc;
uVar8 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(char **)((int)local_68 + iVar3) = "AppID=";
*(undefined4 *)((int)local_60 + iVar3 + -4) = uVar8;
*(undefined1 **)((int)&local_6c + iVar3) = &com_token;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cef4;
iVar7 = V_strnicmp(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
if (iVar7 == 0) {
*(char **)((int)&local_6c + iVar3) = "AppID=";
iVar5 = iVar5 + 1;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cf0b;
iVar7 = _V_strlen(*(char **)((int)&local_6c + iVar3));
*(undefined4 *)((int)local_60 + iVar3 + -4) = 0x1f;
*(undefined1 **)((int)local_68 + iVar3) = &com_token + iVar7;
*(undefined1 **)((int)&local_6c + iVar3) = local_40;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cf27;
V_strncpy(*(char **)((int)&local_6c + iVar3),*(char **)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
*(undefined4 *)((int)local_60 + iVar3 + -4) = 10;
*(undefined4 *)((int)local_68 + iVar3) = 0;
*(undefined1 **)((int)&local_6c + iVar3) = local_40;
*(undefined4 *)((int)&uStack_70 + iVar3) = 0x17cf42;
lVar9 = strtol(*(char **)((int)&local_6c + iVar3),*(char ***)((int)local_68 + iVar3),
*(int *)((int)local_60 + iVar3 + -4));
*(long *)param_1 = lVar9;
}
}
}
goto LAB_0017cd38;
}
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.