L L4D2node

execute_cfa_program

0x0029b660 · 2298 bytes · unknown

Decompiled

undefined (0 params)

/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */

void execute_cfa_program(int param_1,undefined4 *param_2)

{
  byte bVar1;
  byte bVar2;
  byte *in_EAX;
  byte *pbVar3;
  undefined4 *puVar4;
  byte bVar5;
  byte bVar6;
  byte *in_EDX;
  uint uVar7;
  byte *pbVar8;
  undefined1 *puVar9;
  undefined4 *puVar10;
  uint uVar11;
  int iVar12;
  undefined4 *puVar13;
  byte bVar14;
  undefined1 auStack_4c [7];
  byte local_45;
  byte *local_44;
  undefined4 *local_40;
  uint *local_3c;
  uint local_38;
  byte *local_34;
  byte *local_30;
  uint local_20 [4];
  
  bVar14 = 0;
  puVar9 = auStack_4c;
  param_2[0x24] = 0;
  if ((in_EAX < in_EDX) &&
     (uVar11 = param_2[0x29],
     uVar11 < (uint)(*(int *)(param_1 + 0x4c) - (*(int *)(param_1 + 0x60) >> 0x1f)))) {
    local_3c = local_20;
    local_40 = (undefined4 *)0x0;
    local_34 = in_EDX;
    do {
      uVar7 = (uint)*in_EAX;
      local_30 = in_EAX + 1;
      bVar5 = *in_EAX & 0xc0;
      pbVar3 = local_30;
      if (bVar5 == 0x40) {
        param_2[0x29] = (uVar7 & 0x3f) * param_2[0x2c] + uVar11;
        goto LAB_0029b707;
      }
      if (bVar5 == 0x80) {
        uVar11 = 0;
        uVar7 = uVar7 & 0x3f;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        iVar12 = uVar11 * param_2[0x2b];
        local_38 = uVar7;
joined_r0x0029b769:
        if (uVar7 < 0x12) {
          (param_2 + uVar7 * 2)[1] = 1;
          param_2[uVar7 * 2] = iVar12;
        }
        goto LAB_0029b707;
      }
      if (bVar5 == 0xc0) {
        if (0x11 < (uVar7 & 0x3f)) goto _L122;
        param_2[(uVar7 & 0x3f) * 2 + 1] = 0;
        goto LAB_0029b707;
      }
      switch(uVar7) {
      case 0:
      case 0x2d:
_L122:
        break;
      case 1:
        bVar5 = *(byte *)(param_2 + 0x2e);
        if (bVar5 == 0xff) goto _L19;
        bVar6 = bVar5 & 0x70;
        local_38 = CONCAT31(local_38._1_3_,bVar5) & 0xffffff70;
        if (bVar6 == 0x20) {
          local_44 = *(byte **)(param_1 + 0x54);
        }
        else if (bVar6 < 0x21) {
          if ((bVar6 != 0) && (bVar6 != 0x10)) goto _L19;
LAB_0029bebf:
          local_44 = (byte *)0x0;
        }
        else if ((char)local_38 == '@') {
          local_44 = *(byte **)(param_1 + 0x5c);
        }
        else {
          if ((char)local_38 == 'P') goto LAB_0029bebf;
          if ((char)local_38 != '0') goto _L19;
          local_44 = *(byte **)(param_1 + 0x58);
        }
        if (bVar5 == 0x50) {
          pbVar3 = (byte *)((undefined4 *)((uint)(in_EAX + 4) & 0xfffffffc) + 1);
          pbVar8 = *(byte **)((uint)(in_EAX + 4) & 0xfffffffc);
        }
        else {
          switch(bVar5 & 0xf) {
          case 0:
          case 3:
          case 0xb:
            pbVar3 = in_EAX + 5;
            uVar11 = *(uint *)(in_EAX + 1);
            break;
          case 1:
            uVar11 = 0;
            bVar6 = 0;
            pbVar8 = local_30;
            do {
              pbVar3 = pbVar8 + 1;
              bVar1 = *pbVar8;
              bVar2 = bVar6 & 0x1f;
              bVar6 = bVar6 + 7;
              uVar11 = uVar11 | (bVar1 & 0x7f) << bVar2;
              pbVar8 = pbVar3;
              local_45 = bVar5;
            } while ((char)bVar1 < '\0');
            break;
          case 2:
            uVar11 = (uint)*(ushort *)(in_EAX + 1);
            pbVar3 = in_EAX + 3;
            break;
          case 4:
          case 0xc:
            pbVar3 = in_EAX + 9;
            uVar11 = *(uint *)(in_EAX + 1);
            break;
          default:
_L19:
                    /* WARNING: Subroutine does not return */
            *(undefined4 *)(puVar9 + -4) = 0x29b7b5;
            abort();
          case 9:
            *(undefined4 *)(puVar9 + -4) = 0x29bedf;
            pbVar3 = (byte *)read_sleb128();
            uVar11 = local_20[0];
            break;
          case 10:
            pbVar3 = in_EAX + 3;
            uVar11 = (int)*(short *)(in_EAX + 1);
          }
          pbVar8 = (byte *)0x0;
          if (uVar11 != 0) {
            pbVar8 = local_44;
            if ((char)local_38 == '\x10') {
              pbVar8 = local_30;
            }
            pbVar8 = pbVar8 + uVar11;
            if ((char)bVar5 < '\0') {
              pbVar8 = *(byte **)pbVar8;
            }
          }
        }
        param_2[0x29] = pbVar8;
        break;
      case 2:
        pbVar3 = in_EAX + 2;
        param_2[0x29] = (uint)in_EAX[1] * param_2[0x2c] + uVar11;
        break;
      case 3:
        pbVar3 = in_EAX + 3;
        param_2[0x29] = (uint)*(ushort *)(in_EAX + 1) * param_2[0x2c] + uVar11;
        break;
      case 4:
        pbVar3 = in_EAX + 5;
        param_2[0x29] = *(int *)(in_EAX + 1) * param_2[0x2c] + uVar11;
        break;
      case 5:
        uVar7 = 0;
        bVar5 = 0;
        do {
          pbVar8 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar7 = uVar7 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar8;
        } while ((char)bVar6 < '\0');
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = pbVar8 + 1;
          bVar6 = *pbVar8;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar8 = pbVar3;
        } while ((char)bVar6 < '\0');
        iVar12 = uVar11 * param_2[0x2b];
        goto joined_r0x0029b769;
      case 6:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        goto LAB_0029b911;
      case 7:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        if (uVar11 < 0x12) {
          param_2[uVar11 * 2 + 1] = 6;
        }
        break;
      case 8:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
LAB_0029b911:
        if (uVar11 < 0x12) {
          param_2[uVar11 * 2 + 1] = 0;
        }
        break;
      case 9:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar8;
        } while ((char)bVar6 < '\0');
        bVar5 = 0;
        uVar7 = 0;
        do {
          pbVar3 = pbVar8 + 1;
          bVar6 = *pbVar8;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar7 = uVar7 | (bVar6 & 0x7f) << bVar1;
          pbVar8 = pbVar3;
        } while ((char)bVar6 < '\0');
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 2;
          param_2[uVar11 * 2] = uVar7;
        }
        break;
      case 10:
        if (local_40 == (undefined4 *)0x0) {
          puVar4 = (undefined4 *)((uint)(puVar9 + -0xb1) & 0xfffffff0);
          puVar9 = puVar9 + -0xc0;
        }
        else {
          puVar4 = local_40;
          local_40 = (undefined4 *)local_40[0x24];
        }
        puVar10 = param_2;
        puVar13 = puVar4;
        for (iVar12 = 0x29; iVar12 != 0; iVar12 = iVar12 + -1) {
          *puVar13 = *puVar10;
          puVar10 = puVar10 + (uint)bVar14 * -2 + 1;
          puVar13 = puVar13 + (uint)bVar14 * -2 + 1;
        }
        param_2[0x24] = puVar4;
        break;
      case 0xb:
        puVar4 = (undefined4 *)param_2[0x24];
        puVar10 = puVar4;
        puVar13 = param_2;
        for (iVar12 = 0x29; iVar12 != 0; iVar12 = iVar12 + -1) {
          *puVar13 = *puVar10;
          puVar10 = puVar10 + (uint)bVar14 * -2 + 1;
          puVar13 = puVar13 + (uint)bVar14 * -2 + 1;
        }
        puVar4[0x24] = local_40;
        local_40 = puVar4;
        break;
      case 0xc:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar8;
        } while ((char)bVar6 < '\0');
        bVar5 = 0;
        param_2[0x26] = uVar11;
        uVar11 = 0;
        do {
          pbVar3 = pbVar8 + 1;
          bVar6 = *pbVar8;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar8 = pbVar3;
        } while ((char)bVar6 < '\0');
        param_2[0x25] = uVar11;
        param_2[0x28] = 1;
        break;
      case 0xd:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        param_2[0x26] = uVar11;
        param_2[0x28] = 1;
        break;
      case 0xe:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        param_2[0x25] = uVar11;
        break;
      case 0xf:
        bVar5 = 0;
        param_2[0x28] = 2;
        param_2[0x27] = local_30;
        uVar11 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        pbVar3 = pbVar3 + uVar11;
        break;
      case 0x10:
        bVar5 = 0;
        uVar11 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 3;
          param_2[uVar11 * 2] = pbVar3;
        }
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = pbVar3 + 1;
          bVar6 = *pbVar3;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar3 = pbVar8;
        } while ((char)bVar6 < '\0');
        pbVar3 = pbVar8 + uVar11;
        break;
      case 0x11:
        bVar5 = 0;
        uVar11 = 0;
        do {
          bVar6 = *pbVar3;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar3 = pbVar3 + 1;
        } while ((char)bVar6 < '\0');
        *(undefined4 *)(puVar9 + -4) = 0x29bc03;
        pbVar3 = (byte *)read_sleb128();
        iVar12 = param_2[0x2b];
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 1;
          param_2[uVar11 * 2] = iVar12 * local_20[0];
        }
        break;
      case 0x12:
        bVar5 = 0;
        uVar11 = 0;
        do {
          bVar6 = *pbVar3;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar3 = pbVar3 + 1;
        } while ((char)bVar6 < '\0');
        param_2[0x26] = uVar11;
        *(undefined4 *)(puVar9 + -4) = 0x29bc64;
        pbVar3 = (byte *)read_sleb128();
        param_2[0x28] = 1;
        param_2[0x25] = local_20[0] * param_2[0x2b];
        break;
      case 0x13:
        *(undefined4 *)(puVar9 + -4) = 0x29bc91;
        pbVar3 = (byte *)read_sleb128();
        param_2[0x25] = local_20[0] * param_2[0x2b];
        break;
      case 0x14:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar8;
        } while ((char)bVar6 < '\0');
        uVar7 = 0;
        bVar5 = 0;
        do {
          pbVar3 = pbVar8 + 1;
          bVar6 = *pbVar8;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar7 = uVar7 | (bVar6 & 0x7f) << bVar1;
          pbVar8 = pbVar3;
        } while ((char)bVar6 < '\0');
        iVar12 = param_2[0x2b];
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 4;
          param_2[uVar11 * 2] = uVar7 * iVar12;
        }
        break;
      case 0x15:
        bVar5 = 0;
        uVar11 = 0;
        do {
          bVar6 = *pbVar3;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar3 = pbVar3 + 1;
        } while ((char)bVar6 < '\0');
        *(undefined4 *)(puVar9 + -4) = 0x29bd4b;
        pbVar3 = (byte *)read_sleb128();
        iVar12 = param_2[0x2b];
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 4;
          param_2[uVar11 * 2] = iVar12 * local_20[0];
        }
        break;
      case 0x16:
        bVar5 = 0;
        uVar11 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 5;
          param_2[uVar11 * 2] = pbVar3;
        }
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = pbVar3 + 1;
          bVar6 = *pbVar3;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          pbVar3 = pbVar8;
        } while ((char)bVar6 < '\0');
        pbVar3 = pbVar8 + uVar11;
        break;
      default:
        goto _L19;
      case 0x2e:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar3 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar3;
        } while ((char)bVar6 < '\0');
        *(uint *)(param_1 + 0x68) = uVar11;
        break;
      case 0x2f:
        uVar11 = 0;
        bVar5 = 0;
        do {
          pbVar8 = local_30 + 1;
          bVar6 = *local_30;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar11 = uVar11 | (bVar6 & 0x7f) << bVar1;
          local_30 = pbVar8;
        } while ((char)bVar6 < '\0');
        uVar7 = 0;
        bVar5 = 0;
        do {
          pbVar3 = pbVar8 + 1;
          bVar6 = *pbVar8;
          bVar1 = bVar5 & 0x1f;
          bVar5 = bVar5 + 7;
          uVar7 = uVar7 | (bVar6 & 0x7f) << bVar1;
          pbVar8 = pbVar3;
        } while ((char)bVar6 < '\0');
        iVar12 = param_2[0x2b];
        if (uVar11 < 0x12) {
          (param_2 + uVar11 * 2)[1] = 1;
          param_2[uVar11 * 2] = -(uVar7 * iVar12);
        }
      }
LAB_0029b707:
    } while ((pbVar3 < local_34) &&
            (uVar11 = param_2[0x29], in_EAX = pbVar3,
            uVar11 < (uint)(*(int *)(param_1 + 0x4c) - (*(int *)(param_1 + 0x60) >> 0x1f))));
  }
  return;
}

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)