TZip::Add
0x000ee680 · 1835 bytes · __thiscall
_ZN4TZip3AddEPKcPvjj.part.2
Decompiled
undefined (5 params)
/* TZip::Add(char const*, void*, unsigned int, unsigned int) [clone .part.2] */
int __thiscall TZip::Add(TZip *this,char *param_1,void *param_2,uint param_3,uint param_4)
{
undefined4 uVar1;
undefined4 uVar2;
short sVar3;
char cVar4;
TZip *in_EAX;
uint uVar5;
uint uVar6;
int iVar7;
undefined4 *puVar8;
undefined4 *puVar9;
int iVar10;
void *in_ECX;
uint *puVar11;
uint *puVar12;
int iVar13;
char *in_EDX;
int iVar14;
int iVar15;
zlist *pzVar16;
int in_GS_OFFSET;
bool bVar17;
bool bVar18;
byte bVar19;
undefined4 local_49e;
undefined4 local_49a;
undefined1 local_496;
undefined4 local_495;
undefined4 local_491;
undefined1 local_48d;
undefined1 local_48c;
undefined1 local_48b;
undefined1 local_48a;
undefined1 local_489;
char local_488 [4];
undefined4 local_484;
undefined2 local_380;
undefined2 local_37e;
ushort local_37c;
short local_37a;
undefined4 local_378;
undefined4 local_374;
int local_370;
int local_36c;
char *local_368;
int local_364;
uint local_360;
undefined4 local_35c;
undefined2 local_358;
undefined2 local_356;
ushort local_354;
undefined4 local_350;
int local_34c;
char local_348 [260];
undefined4 *local_244;
undefined4 *local_240;
undefined4 local_23c;
uint local_238 [65];
char local_134 [260];
undefined4 local_30;
undefined4 local_28;
undefined4 local_24;
int local_20;
bVar19 = 0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
V_strncpy((char *)&local_484,in_EDX,0x104);
puVar12 = &local_484;
if ((char)local_484 == '\0') {
LAB_000ee6c4:
iVar14 = 0x10000;
iVar10 = local_370;
goto LAB_000ee6c9;
}
do {
while ((char)local_484 == '\\') {
*(char *)puVar12 = '/';
local_484._0_1_ = *(char *)((int)puVar12 + 1);
puVar12 = (uint *)((int)puVar12 + 1);
if ((char)local_484 == '\0') goto LAB_000ee713;
}
local_484._0_1_ = *(char *)((int)puVar12 + 1);
puVar12 = (uint *)((int)puVar12 + 1);
} while ((char)local_484 != '\0');
LAB_000ee713:
bVar17 = param_1 == (char *)0x4;
puVar12 = &local_484;
if (bVar17) {
do {
puVar11 = puVar12;
uVar5 = *puVar11 + 0xfefefeff & ~*puVar11;
uVar6 = uVar5 & 0x80808080;
puVar12 = puVar11 + 1;
} while (uVar6 == 0);
if ((uVar5 & 0x8080) == 0) {
puVar12 = (uint *)((int)puVar11 + 6);
uVar6 = uVar6 >> 0x10;
}
bVar18 = *(char *)((int)puVar12 +
(int)(local_488 + (-(int)&local_484 - (uint)CARRY1((byte)uVar6,(byte)uVar6))))
!= '/';
LAB_000eea5f:
sVar3 = 0;
}
else {
bVar18 = false;
cVar4 = HasZipSuffix((char *)&local_484);
if (cVar4 != '\0') goto LAB_000eea5f;
sVar3 = 8;
}
iVar10 = local_370;
if (param_1 == (char *)0x2) {
*(undefined4 *)(in_EAX + 0x50) = 0;
*(undefined4 *)(in_EAX + 0x58) = 0;
in_EAX[0x54] = (TZip)0x0;
*(undefined4 *)(in_EAX + 0x4c) = 0;
*(undefined4 *)(in_EAX + 0x44) = 0;
*(undefined4 *)(in_EAX + 100) = 0;
*(undefined4 *)(in_EAX + 0x48) = 0;
if (in_ECX != (void *)0x0) {
iVar14 = 0x200;
goto LAB_000ee6c9;
}
}
else {
if (param_1 != &DAT_00000001) {
if (param_1 == (char *)0x3) {
iVar14 = open_mem(in_EAX,in_ECX,(uint)this);
}
else {
if (!bVar17) goto LAB_000ee6c4;
iVar14 = open_dir(in_EAX);
}
iVar10 = local_370;
if (iVar14 != 0) goto LAB_000ee6c9;
local_24 = 0;
V_strncpy(local_348,"",0x104);
V_strncpy((char *)local_238,(char *)&local_484,0x104);
puVar12 = local_238;
do {
puVar11 = puVar12;
uVar5 = *puVar11 + 0xfefefeff & ~*puVar11;
uVar6 = uVar5 & 0x80808080;
puVar12 = puVar11 + 1;
} while (uVar6 == 0);
if ((uVar5 & 0x8080) == 0) {
puVar12 = (uint *)((int)puVar11 + 6);
uVar6 = uVar6 >> 0x10;
}
local_368 = (char *)((int)puVar12 +
((-3 - (uint)CARRY1((byte)uVar6,(byte)uVar6)) - (int)local_238));
if (bVar18) {
V_strncat((char *)local_238,"/",0x104,-1);
local_368 = local_368 + 1;
}
V_strncpy(local_134,"",0x104);
local_30 = 1;
local_356 = 0;
local_380 = 0xb17;
local_37e = 0x14;
local_378 = *(undefined4 *)(in_EAX + 0x3c);
local_23c = 0;
local_35c = 0;
local_28 = 0;
local_37c = 8;
local_354 = 8;
local_374 = 0;
local_36c = *(int *)(in_EAX + 0x44);
if (sVar3 == 0) {
local_370 = 0;
if (-1 < local_36c) {
local_370 = local_36c;
}
}
else {
local_370 = 0;
}
local_358 = 0;
local_350 = *(undefined4 *)(in_EAX + 0x2c);
uVar1 = *(undefined4 *)(in_EAX + 0x34);
local_495 = 0xd5455;
local_34c = *(int *)(in_EAX + 8) + *(int *)(in_EAX + 0x10);
local_364 = 0x11;
local_360 = 9;
local_491 = CONCAT31((uint3)uVar1 & 0xff,7);
local_244 = &local_495;
local_240 = &local_49e;
local_496 = (undefined1)((uint)uVar1 >> 0x18);
local_491 = CONCAT13((char)((uint)uVar1 >> 0x10),
CONCAT12((char)((uint)uVar1 >> 8),(undefined2)local_491));
uVar1 = *(undefined4 *)(in_EAX + 0x30);
local_48c = (undefined1)uVar1;
local_48b = (undefined1)((uint)uVar1 >> 8);
local_489 = (undefined1)((uint)uVar1 >> 0x18);
uVar2 = *(undefined4 *)(in_EAX + 0x38);
local_48a = (undefined1)((uint)uVar1 >> 0x10);
local_488[0] = (char)uVar2;
local_488[1] = (char)((uint)uVar2 >> 8);
local_488[3] = (char)((uint)uVar2 >> 0x18);
local_488[2] = (char)((uint)uVar2 >> 0x10);
local_49a = local_491;
local_49e = 0x55455;
local_48d = local_496;
local_37a = sVar3;
iVar14 = putlocal((zlist *)&local_380,swrite,in_EAX);
iVar10 = local_370;
if (iVar14 != 0) {
*(undefined4 *)(in_EAX + 0x50) = 0;
iVar14 = 0x400;
*(undefined4 *)(in_EAX + 0x44) = *(undefined4 *)(in_EAX + 0x48);
goto LAB_000ee6c9;
}
iVar7 = *(int *)(in_EAX + 0x10);
iVar14 = *(int *)(in_EAX + 0xc);
*(char **)(in_EAX + 0x10) = local_368 + local_364 + iVar7 + 0x1e;
if (iVar14 != 0) {
*(undefined4 *)(in_EAX + 0x50) = 0;
*(undefined4 *)(in_EAX + 0x44) = *(undefined4 *)(in_EAX + 0x48);
goto LAB_000ee6c9;
}
if ((sVar3 == 0) || (bVar17)) {
if ((sVar3 == 0) && (!bVar17)) {
iVar7 = istore(in_EAX);
goto LAB_000eec54;
}
if (bVar17) {
*(undefined4 *)(in_EAX + 100) = 0;
iVar15 = 0;
}
else {
iVar15 = *(int *)(in_EAX + 100);
}
iVar13 = *(int *)(in_EAX + 0x48);
*(undefined4 *)(in_EAX + 0x50) = 0;
*(char **)(in_EAX + 0x10) = local_368 + local_364 + iVar7 + 0x1e + iVar15;
*(int *)(in_EAX + 0x44) = iVar13;
LAB_000eeb91:
local_374 = *(undefined4 *)(in_EAX + 0x4c);
local_36c = iVar13;
if (in_EAX[0x14] != (TZip)0x0) {
if ((local_37c & 1) == 0) {
local_37c = local_37c & 0xfff7;
}
local_37a = sVar3;
local_370 = iVar15;
local_354 = local_37c;
cVar4 = oseek(in_EAX,local_34c - *(int *)(in_EAX + 8));
if (cVar4 != '\0') {
iVar10 = putlocal((zlist *)&local_380,swrite,in_EAX);
if (iVar10 != 0) goto LAB_000eec7a;
cVar4 = oseek(in_EAX,*(uint *)(in_EAX + 0x10));
if (cVar4 != '\0') goto LAB_000eecf2;
}
iVar14 = 0x2000000;
iVar10 = local_370;
goto LAB_000ee6c9;
}
iVar14 = 0x4000000;
iVar10 = iVar15;
if ((sVar3 != local_37a) || ((iVar15 != local_370 && (sVar3 == 0)))) goto LAB_000ee6c9;
local_370 = iVar15;
iVar10 = putextended((zlist *)&local_380,swrite,in_EAX);
if (iVar10 == 0) {
*(int *)(in_EAX + 0x10) = *(int *)(in_EAX + 0x10) + 0x10;
local_37c = local_354;
LAB_000eecf2:
iVar14 = *(int *)(in_EAX + 0xc);
iVar10 = local_370;
if (iVar14 == 0) {
puVar8 = operator_new__(local_360);
memcpy(puVar8,local_240,local_360);
local_240 = puVar8;
puVar9 = operator_new(0x360);
pzVar16 = (zlist *)&local_380;
puVar8 = puVar9;
for (iVar10 = 0xd8; iVar10 != 0; iVar10 = iVar10 + -1) {
*puVar8 = *(undefined4 *)pzVar16;
pzVar16 = pzVar16 + (uint)bVar19 * -8 + 4;
puVar8 = puVar8 + (uint)bVar19 * -2 + 1;
}
iVar7 = *(int *)(in_EAX + 0x28);
iVar10 = local_370;
if (*(int *)(in_EAX + 0x28) == 0) {
*(undefined4 **)(in_EAX + 0x28) = puVar9;
}
else {
do {
iVar15 = iVar7;
iVar7 = *(int *)(iVar15 + 0x35c);
} while (iVar7 != 0);
iVar14 = 0;
*(undefined4 **)(iVar15 + 0x35c) = puVar9;
}
}
goto LAB_000ee6c9;
}
}
else {
iVar7 = ideflate(in_EAX,(zlist *)&local_380);
LAB_000eec54:
iVar15 = *(int *)(in_EAX + 100);
*(undefined4 *)(in_EAX + 0x50) = 0;
iVar14 = *(int *)(in_EAX + 0xc);
iVar13 = *(int *)(in_EAX + 0x48);
*(int *)(in_EAX + 0x10) = *(int *)(in_EAX + 0x10) + iVar15;
*(int *)(in_EAX + 0x44) = iVar13;
iVar10 = local_370;
if (iVar14 != 0) goto LAB_000ee6c9;
if (iVar7 == 0) goto LAB_000eeb91;
}
LAB_000eec7a:
iVar14 = 0x400;
iVar10 = local_370;
goto LAB_000ee6c9;
}
*(undefined4 *)(in_EAX + 0x50) = 0;
*(undefined4 *)(in_EAX + 0x58) = 0;
in_EAX[0x54] = (TZip)0x0;
*(undefined4 *)(in_EAX + 0x4c) = 0;
*(undefined4 *)(in_EAX + 0x44) = 0;
*(undefined4 *)(in_EAX + 100) = 0;
*(undefined4 *)(in_EAX + 0x48) = 0;
if ((int)in_ECX - 1U < 0xfffffffe) {
iVar14 = 0x40000;
goto LAB_000ee6c9;
}
}
iVar14 = 0x10000;
LAB_000ee6c9:
local_370 = iVar10;
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return iVar14;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
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.