L L4D2node

_Unwind_IteratePhdrCallback

0x0029f070 · 1332 bytes · unknown

Decompiled

undefined (0 params)

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

undefined4 _Unwind_IteratePhdrCallback(uint *param_1,uint param_2,uint *param_3)

{
  char *pcVar1;
  bool bVar2;
  uint *puVar3;
  uint *puVar4;
  int *piVar5;
  bool bVar6;
  uint *puVar7;
  undefined4 uVar8;
  uint uVar9;
  int *piVar10;
  int iVar11;
  undefined4 *puVar12;
  int iVar13;
  uint uVar14;
  uint uVar15;
  char *pcVar16;
  uint uVar17;
  int *local_5c;
  int *local_58;
  uint local_50;
  uint local_4c;
  int *local_48;
  uint *local_44;
  uint *local_40;
  undefined4 local_3c;
  uint local_38;
  int local_34;
  uint local_30;
  uint local_2c;
  undefined4 local_28;
  undefined4 local_24;
  
  puVar7 = frame_hdr_cache_head;
  local_58 = (int *)*param_1;
  piVar10 = (int *)param_1[2];
  if ((param_3[5] == 0) || (param_2 < 0x20)) {
    if (param_2 < 0xe) {
      return 0xffffffff;
    }
LAB_0029f0b0:
    local_40 = (uint *)0x0;
    local_44 = (uint *)0x0;
  }
  else {
    if (DAT_00342d24 == param_1[5] && adds_8594 == param_1[4]) {
      local_5c = (int *)param_1[6];
      uVar9 = param_1[7];
      if (uVar9 == DAT_00409814 && local_5c == (int *)subs_8595) {
        if (frame_hdr_cache_head != (uint *)0x0) {
          puVar3 = (uint *)0x0;
          puVar4 = frame_hdr_cache_head;
          do {
            local_40 = puVar4;
            local_44 = puVar3;
            if ((*local_40 <= *param_3) && (*param_3 < local_40[1])) {
              local_58 = (int *)local_40[2];
              local_48 = (int *)local_40[3];
              if (frame_hdr_cache_head != local_40) {
                frame_hdr_cache_head = local_40;
                local_44[5] = local_40[5];
                local_40[5] = (uint)puVar7;
              }
              goto LAB_0029f187;
            }
          } while ((local_40[1] != 0 || *local_40 != 0) &&
                  (puVar3 = local_40, puVar4 = (uint *)local_40[5],
                  (uint *)local_40[5] != (uint *)0x0));
          goto LAB_0029f0c0;
        }
        goto LAB_0029f0b0;
      }
    }
    else {
      local_5c = (int *)param_1[6];
      uVar9 = param_1[7];
    }
    subs_8595 = (uint)local_5c;
    puVar12 = &DAT_00409838;
    adds_8594 = param_1[4];
    DAT_00342d24 = param_1[5];
    DAT_00409814 = uVar9;
    do {
      puVar12[-6] = 0;
      puVar12[-5] = 0;
      puVar12[-1] = puVar12;
      puVar12 = puVar12 + 6;
    } while (puVar12 != &seen_objects);
    frame_hdr_cache_head = &frame_hdr_cache;
    DAT_004098dc = 0;
    local_40 = (uint *)0x0;
    local_44 = (uint *)0x0;
    param_3[5] = 0;
  }
LAB_0029f0c0:
  iVar13 = (ushort)param_1[3] - 1;
  if (iVar13 == -1) {
    return 0;
  }
  local_4c = 0;
  local_50 = 0;
  bVar2 = false;
  local_48 = (int *)0x0;
  local_5c = (int *)0x0;
LAB_0029f11d:
  do {
    iVar11 = *piVar10;
    if (iVar11 == 1) {
      uVar17 = (int)local_58 + piVar10[2];
      uVar9 = *param_3;
      piVar5 = local_48;
      if (uVar17 <= uVar9) {
        uVar15 = piVar10[5] + uVar17;
        uVar14 = uVar15;
        if (uVar15 <= uVar9) {
          uVar17 = local_50;
          uVar14 = local_4c;
        }
        local_4c = uVar14;
        bVar6 = true;
        if (uVar15 <= uVar9) {
          bVar6 = bVar2;
        }
        bVar2 = bVar6;
        iVar13 = iVar13 + -1;
        piVar10 = piVar10 + 8;
        local_50 = uVar17;
        if (iVar13 == -1) break;
        goto LAB_0029f11d;
      }
    }
    else {
      piVar5 = piVar10;
      if ((iVar11 != 0x6474e550) && (piVar5 = local_48, iVar11 == 2)) {
        local_5c = piVar10;
      }
    }
    local_48 = piVar5;
    iVar13 = iVar13 + -1;
    piVar10 = piVar10 + 8;
  } while (iVar13 != -1);
  if (!bVar2) {
    return 0;
  }
  if (0x1f < param_2) {
    puVar7 = frame_hdr_cache_head;
    if ((local_44 != (uint *)0x0) && (local_40 != (uint *)0x0)) {
      local_44[5] = local_40[5];
      puVar7 = frame_hdr_cache_head;
      frame_hdr_cache_head = local_40;
      local_40[5] = (uint)puVar7;
      puVar7 = local_40;
    }
    puVar7[4] = (uint)local_5c;
    puVar7[2] = (uint)local_58;
    *puVar7 = local_50;
    puVar7[3] = (uint)local_48;
    puVar7[1] = local_4c;
  }
LAB_0029f187:
  if (local_48 == (int *)0x0) {
    return 0;
  }
  pcVar16 = (char *)((int)local_58 + local_48[2]);
  if (*pcVar16 != '\x01') {
    return 1;
  }
  puVar7 = param_3 + 2;
  base_from_cb_data_isra_4(puVar7);
  uVar8 = read_encoded_value_with_base(pcVar16 + 4,&local_3c);
  if ((pcVar16[2] != -1) && (pcVar16[3] == ';')) {
    base_from_cb_data_isra_4(puVar7);
    piVar10 = (int *)read_encoded_value_with_base(uVar8,&local_38);
    if (local_38 == 0) {
      return 1;
    }
    if (((uint)piVar10 & 3) == 0) {
      pcVar1 = (char *)*param_3;
      if (pcVar1 < pcVar16 + *piVar10) {
        return 1;
      }
      local_38 = local_38 - 1;
      local_58 = piVar10 + local_38 * 2;
      if (pcVar16 + *local_58 <= pcVar1) {
LAB_0029f557:
        iVar13 = local_58[1];
        get_cie_encoding();
        iVar11 = size_of_encoded_value();
        read_encoded_value_with_base(pcVar16 + iVar13 + iVar11 + 8,&local_34);
        iVar11 = *local_58;
        if ((char *)*param_3 < pcVar16 + iVar11 + local_34) {
          param_3[4] = (uint)(pcVar16 + iVar13);
        }
        param_3[3] = (uint)(pcVar16 + iVar11);
        return 1;
      }
      if (local_38 != 0) {
        uVar9 = 0;
        do {
          uVar17 = local_38 + uVar9 >> 1;
          local_58 = piVar10 + uVar17 * 2;
          uVar14 = uVar9;
          if ((pcVar16 + *local_58 <= pcVar1) &&
             (uVar14 = uVar17 + 1, iVar13 = uVar17 * 2, uVar17 = local_38,
             pcVar1 < pcVar16 + piVar10[iVar13 + 2])) {
            if (uVar9 < local_38) goto LAB_0029f557;
            break;
          }
          local_38 = uVar17;
          uVar9 = uVar14;
        } while (uVar14 < uVar17);
      }
                    /* WARNING: Subroutine does not return */
      abort();
    }
  }
  local_30 = param_3[1];
  local_28 = local_3c;
  local_34 = 0;
  local_24 = 4;
  local_2c = param_3[2];
  uVar9 = linear_search_fdes(*param_3);
  param_3[4] = uVar9;
  if (uVar9 != 0) {
    get_cie_encoding();
    base_from_cb_data_isra_4(puVar7);
    read_encoded_value_with_base(param_3[4] + 8,&local_38);
    param_3[3] = local_38;
  }
  return 1;
}

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)