L L4D2node

execute_stack_op

0x00bf6060 · 1798 bytes · unknown

Decompiled

undefined (0 params)

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

uint execute_stack_op(int param_1,uint param_2)

{
  int iVar1;
  byte bVar2;
  ushort *puVar3;
  uint uVar4;
  byte bVar5;
  byte *in_EAX;
  byte *pbVar6;
  byte bVar7;
  byte bVar8;
  byte bVar9;
  byte *in_EDX;
  uint uVar10;
  undefined4 *puVar11;
  byte *pbVar12;
  byte *pbVar13;
  uint auStack_51c [251];
  byte *local_130;
  uint local_124;
  byte *local_120;
  uint local_11c [67];
  
  local_11c[0] = param_2;
  if (in_EDX <= in_EAX) {
    return param_2;
  }
  auStack_51c[0xf6] = 1;
LAB_00bf60a0:
  bVar7 = *in_EAX;
  uVar10 = (uint)bVar7;
  pbVar6 = in_EAX + 1;
  switch(uVar10 - 3 & 0xff) {
  case 0:
  case 9:
  case 10:
    pbVar6 = in_EAX + 5;
    pbVar12 = *(byte **)(in_EAX + 1);
    break;
  default:
    goto _L325;
  case 3:
  case 0x16:
  case 0x1c:
  case 0x1d:
  case 0x20:
  case 0x91:
    if (auStack_51c[0xf6] == 0) goto _L325;
    auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
    puVar3 = (ushort *)local_11c[auStack_51c[0xf6]];
    if (bVar7 == 0x1f) {
      pbVar12 = (byte *)-(int)puVar3;
    }
    else if (bVar7 < 0x20) {
      if (bVar7 == 6) {
        pbVar12 = *(byte **)puVar3;
      }
      else {
        if (bVar7 != 0x19) goto _L325;
        pbVar12 = (byte *)(((uint)puVar3 ^ (int)puVar3 >> 0x1f) - ((int)puVar3 >> 0x1f));
      }
    }
    else if (bVar7 == 0x23) {
      bVar7 = 0;
      uVar10 = 0;
      pbVar12 = pbVar6;
      do {
        pbVar6 = pbVar12 + 1;
        bVar8 = *pbVar12;
        bVar9 = bVar7 & 0x1f;
        bVar7 = bVar7 + 7;
        uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
        pbVar12 = pbVar6;
      } while ((char)bVar8 < '\0');
      pbVar12 = (byte *)((int)puVar3 + uVar10);
    }
    else if (bVar7 == 0x94) {
      pbVar6 = in_EAX + 2;
      bVar7 = in_EAX[1];
      if (bVar7 == 2) {
        pbVar12 = (byte *)(uint)*puVar3;
      }
      else if (bVar7 < 3) {
        if (bVar7 != 1) goto _L325;
        pbVar12 = (byte *)(uint)(byte)*puVar3;
      }
      else {
        if ((bVar7 != 4) && (bVar7 != 8)) goto _L325;
        pbVar12 = *(byte **)puVar3;
      }
    }
    else {
      if (bVar7 != 0x20) goto _L325;
      pbVar12 = (byte *)~(uint)puVar3;
    }
    break;
  case 5:
    pbVar12 = (byte *)(uint)in_EAX[1];
    pbVar6 = in_EAX + 2;
    break;
  case 6:
    pbVar12 = (byte *)(int)(char)in_EAX[1];
    pbVar6 = in_EAX + 2;
    break;
  case 7:
    pbVar12 = (byte *)(uint)*(ushort *)(in_EAX + 1);
    pbVar6 = in_EAX + 3;
    break;
  case 8:
    pbVar12 = (byte *)(int)*(short *)(in_EAX + 1);
    pbVar6 = in_EAX + 3;
    break;
  case 0xb:
  case 0xc:
    pbVar12 = *(byte **)(in_EAX + 1);
    pbVar6 = in_EAX + 9;
    break;
  case 0xd:
    pbVar12 = (byte *)0x0;
    bVar7 = 0;
    pbVar13 = pbVar6;
    do {
      pbVar6 = pbVar13 + 1;
      bVar8 = *pbVar13;
      bVar9 = bVar7 & 0x1f;
      bVar7 = bVar7 + 7;
      pbVar12 = (byte *)((uint)pbVar12 | (bVar8 & 0x7f) << bVar9);
      pbVar13 = pbVar6;
    } while ((char)bVar8 < '\0');
    break;
  case 0xe:
    pbVar6 = (byte *)read_sleb128();
    pbVar12 = local_120;
    break;
  case 0xf:
    if (auStack_51c[0xf6] == 0) goto _L325;
    pbVar12 = (byte *)local_11c[auStack_51c[0xf6] - 1];
    break;
  case 0x10:
    if (auStack_51c[0xf6] != 0) {
      auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
      goto LAB_00bf60e8;
    }
    goto _L325;
  case 0x11:
    if ((int)auStack_51c[0xf6] < 2) goto _L325;
    pbVar12 = (byte *)(&local_124)[auStack_51c[0xf6]];
    break;
  case 0x12:
    pbVar6 = in_EAX + 2;
    local_124 = (uint)in_EAX[1];
    if ((int)(auStack_51c[0xf6] - 1) <= (int)local_124) goto _L325;
    pbVar12 = (byte *)local_11c[(auStack_51c[0xf6] - 1) - local_124];
    break;
  case 0x13:
    if (1 < (int)auStack_51c[0xf6]) {
      uVar10 = local_11c[auStack_51c[0xf6] - 1];
      local_11c[auStack_51c[0xf6] - 1] = local_11c[auStack_51c[0xf6] - 2];
      local_11c[auStack_51c[0xf6] - 2] = uVar10;
      goto LAB_00bf60e8;
    }
    goto _L325;
  case 0x14:
    if (2 < (int)auStack_51c[0xf6]) {
      uVar10 = local_11c[auStack_51c[0xf6] - 1];
      uVar4 = local_11c[auStack_51c[0xf6] - 3];
      local_11c[auStack_51c[0xf6] - 1] = local_11c[auStack_51c[0xf6] - 2];
      local_11c[auStack_51c[0xf6] - 2] = uVar4;
      local_11c[auStack_51c[0xf6] - 3] = uVar10;
      goto LAB_00bf60e8;
    }
    goto _L325;
  case 0x17:
  case 0x18:
  case 0x19:
  case 0x1a:
  case 0x1b:
  case 0x1e:
  case 0x1f:
  case 0x21:
  case 0x22:
  case 0x23:
  case 0x24:
  case 0x26:
  case 0x27:
  case 0x28:
  case 0x29:
  case 0x2a:
  case 0x2b:
    if ((int)auStack_51c[0xf6] < 2) goto _L325;
    uVar10 = local_11c[auStack_51c[0xf6] - 1];
    auStack_51c[0xf6] = auStack_51c[0xf6] - 2;
    uVar4 = local_11c[auStack_51c[0xf6]];
    bVar8 = (byte)uVar10;
    switch(bVar7) {
    case 0x1a:
      pbVar12 = (byte *)(uVar4 & uVar10);
      break;
    case 0x1b:
      pbVar12 = (byte *)((int)uVar4 / (int)uVar10);
      break;
    case 0x1c:
      pbVar12 = (byte *)(uVar4 - uVar10);
      break;
    case 0x1d:
      pbVar12 = (byte *)(uVar4 % uVar10);
      break;
    case 0x1e:
      pbVar12 = (byte *)(uVar4 * uVar10);
      break;
    default:
      goto _L325;
    case 0x21:
      pbVar12 = (byte *)(uVar4 | uVar10);
      break;
    case 0x22:
      pbVar12 = (byte *)(uVar4 + uVar10);
      break;
    case 0x24:
      pbVar12 = (byte *)(uVar4 << (bVar8 & 0x1f));
      break;
    case 0x25:
      pbVar12 = (byte *)(uVar4 >> (bVar8 & 0x1f));
      break;
    case 0x26:
      pbVar12 = (byte *)((int)uVar4 >> (bVar8 & 0x1f));
      break;
    case 0x27:
      pbVar12 = (byte *)(uVar4 ^ uVar10);
      break;
    case 0x29:
      pbVar12 = (byte *)(uint)(uVar4 == uVar10);
      break;
    case 0x2a:
      pbVar12 = (byte *)(uint)((int)uVar10 <= (int)uVar4);
      break;
    case 0x2b:
      pbVar12 = (byte *)(uint)((int)uVar10 < (int)uVar4);
      break;
    case 0x2c:
      pbVar12 = (byte *)(uint)((int)uVar4 <= (int)uVar10);
      break;
    case 0x2d:
      pbVar12 = (byte *)(uint)((int)uVar4 < (int)uVar10);
      break;
    case 0x2e:
      pbVar12 = (byte *)(uint)(uVar4 != uVar10);
    }
    break;
  case 0x25:
    if (auStack_51c[0xf6] != 0) {
      auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
      pbVar6 = in_EAX + 3;
      if (local_11c[auStack_51c[0xf6]] != 0) {
        pbVar6 = pbVar6 + *(short *)(in_EAX + 1);
      }
      goto LAB_00bf60e8;
    }
    goto _L325;
  case 0x2c:
    pbVar6 = in_EAX + *(short *)(in_EAX + 1) + 3;
    goto LAB_00bf60e8;
  case 0x2d:
  case 0x2e:
  case 0x2f:
  case 0x30:
  case 0x31:
  case 0x32:
  case 0x33:
  case 0x34:
  case 0x35:
  case 0x36:
  case 0x37:
  case 0x38:
  case 0x39:
  case 0x3a:
  case 0x3b:
  case 0x3c:
  case 0x3d:
  case 0x3e:
  case 0x3f:
  case 0x40:
  case 0x41:
  case 0x42:
  case 0x43:
  case 0x44:
  case 0x45:
  case 0x46:
  case 0x47:
  case 0x48:
  case 0x49:
  case 0x4a:
  case 0x4b:
  case 0x4c:
    pbVar12 = (byte *)(uVar10 - 0x30);
    break;
  case 0x4d:
  case 0x4e:
  case 0x4f:
  case 0x50:
  case 0x51:
  case 0x52:
  case 0x53:
  case 0x54:
  case 0x55:
  case 0x56:
  case 0x57:
  case 0x58:
  case 0x59:
  case 0x5a:
  case 0x5b:
  case 0x5c:
  case 0x5d:
  case 0x5e:
  case 0x5f:
  case 0x60:
  case 0x61:
  case 0x62:
  case 99:
  case 100:
  case 0x65:
  case 0x66:
  case 0x67:
  case 0x68:
  case 0x69:
  case 0x6a:
  case 0x6b:
  case 0x6c:
    iVar1 = uVar10 - 0x50;
    if (0x11 < iVar1) goto _L325;
    pbVar12 = *(byte **)(param_1 + iVar1 * 4);
    if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + iVar1) == '\0')) {
      if (*(char *)((int)&vec2_invalid + uVar10 + 4) != '\x04') goto _L325;
      pbVar12 = *(byte **)pbVar12;
    }
    break;
  case 0x6d:
  case 0x6e:
  case 0x6f:
  case 0x70:
  case 0x71:
  case 0x72:
  case 0x73:
  case 0x74:
  case 0x75:
  case 0x76:
  case 0x77:
  case 0x78:
  case 0x79:
  case 0x7a:
  case 0x7b:
  case 0x7c:
  case 0x7d:
  case 0x7e:
  case 0x7f:
  case 0x80:
  case 0x81:
  case 0x82:
  case 0x83:
  case 0x84:
  case 0x85:
  case 0x86:
  case 0x87:
  case 0x88:
  case 0x89:
  case 0x8a:
  case 0x8b:
  case 0x8c:
    pbVar6 = (byte *)read_sleb128();
    iVar1 = uVar10 - 0x70;
    if (0x11 < iVar1) goto _L325;
    puVar11 = *(undefined4 **)(param_1 + iVar1 * 4);
    if (((*(byte *)(param_1 + 99) & 0x40) != 0) && (*(char *)(param_1 + 0x6c + iVar1) != '\0'))
    goto LAB_00bf6312;
    if (*(char *)((int)&vec2_origin + uVar10 + 4) != '\x04') goto _L325;
LAB_00bf630f:
    puVar11 = (undefined4 *)*puVar11;
    goto LAB_00bf6312;
  case 0x8d:
    bVar7 = 0;
    uVar10 = 0;
    pbVar12 = pbVar6;
    do {
      pbVar6 = pbVar12 + 1;
      bVar8 = *pbVar12;
      bVar9 = bVar7 & 0x1f;
      bVar7 = bVar7 + 7;
      uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
      pbVar12 = pbVar6;
    } while ((char)bVar8 < '\0');
    if (0x11 < (int)uVar10) goto _L325;
    pbVar12 = *(byte **)(param_1 + uVar10 * 4);
    if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + uVar10) == '\0')) {
      if ((&dwarf_reg_size_table)[uVar10] != '\x04') goto _L325;
LAB_00bf62c2:
      pbVar12 = *(byte **)pbVar12;
    }
    break;
  case 0x8f:
    bVar7 = 0;
    uVar10 = 0;
    do {
      bVar8 = *pbVar6;
      bVar9 = bVar7 & 0x1f;
      bVar7 = bVar7 + 7;
      uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
      pbVar6 = pbVar6 + 1;
    } while ((char)bVar8 < '\0');
    pbVar6 = (byte *)read_sleb128();
    if (0x11 < (int)uVar10) goto _L325;
    puVar11 = *(undefined4 **)(param_1 + uVar10 * 4);
    if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + uVar10) == '\0')) {
      if ((&dwarf_reg_size_table)[uVar10] != '\x04') {
                    /* WARNING: Subroutine does not return */
        abort();
      }
      goto LAB_00bf630f;
    }
LAB_00bf6312:
    pbVar12 = (byte *)((int)puVar11 + local_124);
    break;
  case 0x93:
    goto LAB_00bf60e8;
  case 0xee:
    bVar7 = in_EAX[1];
    if (bVar7 == 0xff) goto _L325;
    bVar9 = bVar7 & 0x70;
    bVar8 = bVar7 & 0x70;
    if (bVar9 == 0x20) {
      local_130 = *(byte **)(param_1 + 0x54);
    }
    else if (bVar9 < 0x21) {
      if ((bVar9 != 0) && (bVar9 != 0x10)) goto _L325;
LAB_00bf660b:
      local_130 = (byte *)0x0;
    }
    else if (bVar8 == 0x40) {
      local_130 = *(byte **)(param_1 + 0x5c);
    }
    else {
      if (bVar8 == 0x50) goto LAB_00bf660b;
      if (bVar8 != 0x30) goto _L325;
      local_130 = *(byte **)(param_1 + 0x58);
    }
    if (bVar7 == 0x50) {
      pbVar12 = *(byte **)((uint)(in_EAX + 5) & 0xfffffffc);
      pbVar6 = (byte *)((undefined4 *)((uint)(in_EAX + 5) & 0xfffffffc) + 1);
    }
    else {
      switch(bVar7 & 0xf) {
      case 0:
      case 3:
      case 0xb:
        pbVar6 = in_EAX + 6;
        pbVar13 = *(byte **)(in_EAX + 2);
        break;
      case 1:
        pbVar13 = (byte *)0x0;
        bVar9 = 0;
        pbVar12 = in_EAX + 2;
        do {
          pbVar6 = pbVar12 + 1;
          bVar2 = *pbVar12;
          bVar5 = bVar9 & 0x1f;
          bVar9 = bVar9 + 7;
          pbVar13 = (byte *)((uint)pbVar13 | (bVar2 & 0x7f) << bVar5);
          pbVar12 = pbVar6;
        } while ((char)bVar2 < '\0');
        break;
      case 2:
        pbVar13 = (byte *)(uint)*(ushort *)(in_EAX + 2);
        pbVar6 = in_EAX + 4;
        break;
      case 4:
      case 0xc:
        pbVar6 = in_EAX + 10;
        pbVar13 = *(byte **)(in_EAX + 2);
        break;
      default:
        goto _L325;
      case 9:
        pbVar6 = (byte *)read_sleb128();
        pbVar13 = local_120;
        break;
      case 10:
        pbVar6 = in_EAX + 4;
        pbVar13 = (byte *)(int)*(short *)(in_EAX + 2);
      }
      pbVar12 = (byte *)0x0;
      if (pbVar13 != (byte *)0x0) {
        if (bVar8 == 0x10) {
          local_130 = in_EAX + 2;
        }
        pbVar12 = pbVar13 + (int)local_130;
        if ((char)bVar7 < '\0') goto LAB_00bf62c2;
      }
    }
  }
  if (0x3f < auStack_51c[0xf6]) goto _L325;
  local_11c[auStack_51c[0xf6]] = (uint)pbVar12;
  auStack_51c[0xf6] = auStack_51c[0xf6] + 1;
LAB_00bf60e8:
  in_EAX = pbVar6;
  if (in_EDX <= pbVar6) {
    if (auStack_51c[0xf6] != 0) {
      return local_11c[auStack_51c[0xf6] - 1];
    }
_L325:
                    /* WARNING: Subroutine does not return */
    abort();
  }
  goto LAB_00bf60a0;
}

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)