L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)