L L4D2node

BZ2_bzRead

0x00290370 · 613 bytes · unknown

Decompiled

undefined (0 params)

int BZ2_bzRead(uint *param_1,undefined4 *param_2,int param_3,int param_4)

{
  FILE *pFVar1;
  uint uVar2;
  int iVar3;
  size_t sVar4;
  
  if (param_1 != (uint *)0x0) {
    *param_1 = 0;
  }
  if (((param_2 == (undefined4 *)0x0) || (param_2[0x4f1] = 0, param_3 == 0)) || (param_4 < 0)) {
    if (param_1 != (uint *)0x0) {
      *param_1 = 0xfffffffe;
    }
    if (param_2 == (undefined4 *)0x0) {
      param_4 = 0;
    }
    else {
      param_2[0x4f1] = 0xfffffffe;
      param_4 = 0;
    }
  }
  else {
    if (*(char *)(param_2 + 0x4e4) != '\0') {
      if (param_1 != (uint *)0x0) {
        *param_1 = 0xffffffff;
      }
      param_2[0x4f1] = 0xffffffff;
      return 0;
    }
    if (param_4 == 0) {
      if (param_1 != (uint *)0x0) {
        *param_1 = 0;
      }
      param_2[0x4f1] = 0;
      param_4 = 0;
    }
    else {
      param_2[0x4ea] = param_4;
      param_2[0x4e9] = param_3;
      do {
        iVar3 = ferror((FILE *)*param_2);
        if (iVar3 != 0) {
LAB_00290580:
          if (param_1 != (uint *)0x0) {
            *param_1 = 0xfffffffa;
          }
          param_2[0x4f1] = 0xfffffffa;
          return 0;
        }
        if (param_2[0x4e6] == 0) {
          pFVar1 = (FILE *)*param_2;
          iVar3 = fgetc(pFVar1);
          if (iVar3 != -1) {
            ungetc(iVar3,pFVar1);
            sVar4 = fread(param_2 + 1,1,5000,(FILE *)*param_2);
            iVar3 = ferror((FILE *)*param_2);
            if (iVar3 != 0) goto LAB_00290580;
            param_2[0x4e3] = sVar4;
            param_2[0x4e6] = sVar4;
            param_2[0x4e5] = param_2 + 1;
          }
        }
        uVar2 = BZ2_bzDecompress(param_2 + 0x4e5);
        if ((uVar2 & 0xfffffffb) != 0) {
          if (param_1 != (uint *)0x0) {
            *param_1 = uVar2;
          }
          param_2[0x4f1] = uVar2;
          return 0;
        }
        if (uVar2 == 0) {
          pFVar1 = (FILE *)*param_2;
          iVar3 = fgetc(pFVar1);
          if (iVar3 == -1) {
            if (param_2[0x4e6] != 0) goto LAB_00290474;
            if (param_2[0x4ea] != 0) {
              if (param_1 != (uint *)0x0) {
                *param_1 = 0xfffffff9;
              }
              param_2[0x4f1] = 0xfffffff9;
              return 0;
            }
            break;
          }
          ungetc(iVar3,pFVar1);
          iVar3 = param_2[0x4ea];
        }
        else {
          if (uVar2 == 4) {
            if (param_1 != (uint *)0x0) {
              *param_1 = 4;
            }
            param_2[0x4f1] = 4;
            return param_4 - param_2[0x4ea];
          }
LAB_00290474:
          iVar3 = param_2[0x4ea];
        }
      } while (iVar3 != 0);
      if (param_1 != (uint *)0x0) {
        *param_1 = 0;
      }
      param_2[0x4f1] = 0;
    }
  }
  return param_4;
}

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.



        
        

⚠ This function has no mangled symbol — it may be internal/static. The Linux gamedata field uses @-prefix symbol resolution which requires an exported mangled name. You'll need a Linux byte signature for this one (extract via extract_signature.java).


          

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

Return-type handling cheatsheet (DHookReturn)