L L4D2node

uw_frame_state_for

0x0029bff0 · 1913 bytes · unknown

Decompiled

undefined (0 params)

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

undefined4 uw_frame_state_for(void)

{
  char *pcVar1;
  byte bVar2;
  short *psVar3;
  int iVar4;
  byte bVar5;
  char cVar6;
  byte bVar7;
  byte bVar8;
  int in_EAX;
  int iVar9;
  size_t sVar10;
  byte *pbVar11;
  byte *pbVar12;
  uint *puVar13;
  byte bVar14;
  uint uVar15;
  int iVar16;
  int *in_EDX;
  uint uVar17;
  byte *pbVar18;
  uint *puVar19;
  int *piVar20;
  int *piVar21;
  bool bVar22;
  char *local_4c;
  uint *local_44;
  byte *local_34;
  int local_24;
  uint local_20;
  
  uVar17 = 0xc0;
  bVar22 = ((uint)in_EDX & 1) != 0;
  piVar20 = in_EDX;
  if (bVar22) {
    uVar17 = 0xbf;
    *(undefined1 *)in_EDX = 0;
    piVar20 = (int *)((int)in_EDX + 1);
  }
  piVar21 = piVar20;
  if (((uint)piVar20 & 2) != 0) {
    piVar21 = (int *)((int)piVar20 + 2);
    *(undefined2 *)piVar20 = 0;
    uVar17 = uVar17 - 2;
  }
  for (uVar15 = uVar17 >> 2; uVar15 != 0; uVar15 = uVar15 - 1) {
    *piVar21 = 0;
    piVar21 = piVar21 + 1;
  }
  piVar20 = piVar21;
  if ((uVar17 & 2) != 0) {
    piVar20 = (int *)((int)piVar21 + 2);
    *(undefined2 *)piVar21 = 0;
  }
  if (bVar22) {
    *(undefined1 *)piVar20 = 0;
  }
  *(undefined4 *)(in_EAX + 0x68) = 0;
  *(undefined4 *)(in_EAX + 0x50) = 0;
  if (*(int *)(in_EAX + 0x4c) == 0) {
    return 5;
  }
  iVar9 = _Unwind_Find_FDE((*(int *)(in_EAX + 0x4c) + -1) - (*(int *)(in_EAX + 0x60) >> 0x1f),
                           in_EAX + 0x54);
  if (iVar9 == 0) {
    psVar3 = *(short **)(in_EAX + 0x4c);
    iVar9 = *(int *)(in_EAX + 0x48);
    if (((*psVar3 != -0x47a8) || (*(int *)(psVar3 + 1) != 0x77)) ||
       (iVar16 = iVar9 + 4, psVar3[3] != -0x7f33)) {
      if ((char)*psVar3 != -0x48) {
        return 5;
      }
      if (*(int *)((int)psVar3 + 1) != 0xad) {
        return 5;
      }
      if (*(short *)((int)psVar3 + 5) != -0x7f33) {
        return 5;
      }
      iVar16 = iVar9 + 0xa0;
    }
    iVar4 = *(int *)(iVar16 + 0x1c);
    in_EDX[0x28] = 1;
    in_EDX[0x26] = 4;
    in_EDX[1] = 1;
    *in_EDX = (iVar16 + 0x2c) - iVar4;
    in_EDX[6] = (iVar16 + 0x20) - iVar4;
    in_EDX[2] = (iVar16 + 0x28) - iVar4;
    in_EDX[4] = (iVar16 + 0x24) - iVar4;
    in_EDX[0xc] = (iVar16 + 0x14) - iVar4;
    in_EDX[0xe] = (iVar16 + 0x10) - iVar4;
    in_EDX[0x10] = (iVar16 + 0x38) - iVar4;
    in_EDX[0x25] = iVar4 - iVar9;
    in_EDX[7] = 1;
    in_EDX[3] = 1;
    in_EDX[5] = 1;
    in_EDX[0xd] = 1;
    in_EDX[0xf] = 1;
    in_EDX[0xb] = 1;
    in_EDX[10] = (iVar16 + 0x18) - iVar4;
    in_EDX[0x11] = 1;
    in_EDX[0x2d] = 8;
    *(undefined1 *)((int)in_EDX + 0xbb) = 1;
    return 0;
  }
  in_EDX[0x29] = *(int *)(in_EAX + 0x5c);
  iVar16 = (iVar9 + 4) - *(int *)(iVar9 + 4);
  local_4c = (char *)(iVar16 + 9);
  sVar10 = strlen(local_4c);
  pbVar11 = (byte *)(iVar16 + 10 + sVar10);
  if ((*(char *)(iVar16 + 9) == 'e') && (*(char *)(iVar16 + 10) == 'h')) {
    iVar4 = *(int *)pbVar11;
    pbVar11 = pbVar11 + 4;
    local_4c = (char *)(iVar16 + 0xb);
    in_EDX[0x2f] = iVar4;
  }
  if (3 < *(byte *)(iVar16 + 8)) {
    if (*pbVar11 != 4) {
      return 3;
    }
    if (pbVar11[1] != 0) {
      return 3;
    }
    pbVar11 = pbVar11 + 2;
  }
  uVar17 = 0;
  bVar14 = 0;
  do {
    bVar8 = *pbVar11;
    bVar7 = bVar14 & 0x1f;
    bVar14 = bVar14 + 7;
    uVar17 = uVar17 | (bVar8 & 0x7f) << bVar7;
    pbVar11 = pbVar11 + 1;
  } while ((char)bVar8 < '\0');
  in_EDX[0x2c] = uVar17;
  uVar17 = 0;
  pbVar11 = (byte *)read_sleb128();
  bVar14 = 0;
  in_EDX[0x2b] = local_24;
  if (*(char *)(iVar16 + 8) == '\x01') {
    pbVar18 = pbVar11 + 1;
    in_EDX[0x2d] = (uint)*pbVar11;
  }
  else {
    do {
      pbVar18 = pbVar11 + 1;
      bVar8 = *pbVar11;
      bVar7 = bVar14 & 0x1f;
      bVar14 = bVar14 + 7;
      uVar17 = uVar17 | (bVar8 & 0x7f) << bVar7;
      pbVar11 = pbVar18;
    } while ((char)bVar8 < '\0');
    in_EDX[0x2d] = uVar17;
  }
  *(undefined1 *)((int)in_EDX + 0xb9) = 0xff;
  local_44 = (uint *)0x0;
  cVar6 = *local_4c;
  pcVar1 = local_4c;
  if (cVar6 == 'z') {
    uVar17 = 0;
    bVar14 = 0;
    pbVar11 = pbVar18;
    do {
      pbVar18 = pbVar11 + 1;
      bVar8 = *pbVar11;
      bVar7 = bVar14 & 0x1f;
      bVar14 = bVar14 + 7;
      uVar17 = uVar17 | (bVar8 & 0x7f) << bVar7;
      pbVar11 = pbVar18;
    } while ((char)bVar8 < '\0');
    local_44 = (uint *)(pbVar18 + uVar17);
    *(undefined1 *)((int)in_EDX + 0xba) = 1;
    pcVar1 = local_4c + 1;
    cVar6 = local_4c[1];
  }
  while (cVar6 != '\0') {
    if (cVar6 == 'L') {
      bVar14 = *pbVar18;
      pbVar18 = pbVar18 + 1;
      *(byte *)((int)in_EDX + 0xb9) = bVar14;
    }
    else if (cVar6 == 'R') {
      bVar14 = *pbVar18;
      pbVar18 = pbVar18 + 1;
      *(byte *)(in_EDX + 0x2e) = bVar14;
    }
    else if (cVar6 == 'P') {
      bVar14 = *pbVar18;
      if (bVar14 == 0xff) goto _L223;
      bVar7 = bVar14 & 0x70;
      bVar8 = bVar14 & 0x70;
      if (bVar7 == 0x20) {
        local_34 = *(byte **)(in_EAX + 0x54);
      }
      else if (bVar7 < 0x21) {
        if ((bVar7 != 0) && (bVar7 != 0x10)) goto _L223;
LAB_0029c3f0:
        local_34 = (byte *)0x0;
      }
      else if (bVar8 == 0x40) {
        local_34 = *(byte **)(in_EAX + 0x5c);
      }
      else {
        if (bVar8 == 0x50) goto LAB_0029c3f0;
        if (bVar8 != 0x30) goto _L223;
        local_34 = *(byte **)(in_EAX + 0x58);
      }
      pbVar11 = pbVar18 + 1;
      if (bVar14 == 0x50) {
        pbVar11 = pbVar18 + 4;
        pbVar18 = (byte *)((undefined4 *)((uint)pbVar11 & 0xfffffffc) + 1);
        pbVar12 = *(byte **)((uint)pbVar11 & 0xfffffffc);
      }
      else {
        switch(bVar14 & 0xf) {
        case 0:
        case 3:
        case 0xb:
          puVar13 = (uint *)(pbVar18 + 1);
          pbVar18 = pbVar18 + 5;
          uVar17 = *puVar13;
          break;
        case 1:
          bVar7 = 0;
          uVar17 = 0;
          pbVar12 = pbVar11;
          do {
            pbVar18 = pbVar12 + 1;
            bVar2 = *pbVar12;
            bVar5 = bVar7 & 0x1f;
            bVar7 = bVar7 + 7;
            uVar17 = uVar17 | (bVar2 & 0x7f) << bVar5;
            pbVar12 = pbVar18;
          } while ((char)bVar2 < '\0');
          break;
        case 2:
          uVar17 = (uint)*(ushort *)(pbVar18 + 1);
          pbVar18 = pbVar18 + 3;
          break;
        case 4:
        case 0xc:
          puVar13 = (uint *)(pbVar18 + 1);
          pbVar18 = pbVar18 + 9;
          uVar17 = *puVar13;
          break;
        default:
          goto _L223;
        case 9:
          pbVar18 = (byte *)read_sleb128();
          uVar17 = local_20;
          break;
        case 10:
          pbVar12 = pbVar18 + 1;
          pbVar18 = pbVar18 + 3;
          uVar17 = (int)*(short *)pbVar12;
        }
        pbVar12 = (byte *)0x0;
        if (uVar17 != 0) {
          if (bVar8 == 0x10) {
            local_34 = pbVar11;
          }
          pbVar12 = local_34 + uVar17;
          if ((char)bVar14 < '\0') {
            pbVar12 = *(byte **)pbVar12;
          }
        }
      }
      in_EDX[0x2a] = (int)pbVar12;
    }
    else {
      puVar13 = local_44;
      if (cVar6 != 'S') goto LAB_0029c4ec;
      *(undefined1 *)((int)in_EDX + 0xbb) = 1;
    }
    cVar6 = pcVar1[1];
    pcVar1 = pcVar1 + 1;
  }
  puVar13 = (uint *)pbVar18;
  if (local_44 == (uint *)0x0) {
LAB_0029c4ec:
    if (puVar13 == (uint *)0x0) {
      return 3;
    }
  }
  execute_cfa_program(in_EAX);
  if (*(byte *)(in_EDX + 0x2e) == 0xff) {
    iVar16 = 0;
  }
  else {
    bVar14 = *(byte *)(in_EDX + 0x2e) & 7;
    if (bVar14 == 2) {
      iVar16 = 4;
    }
    else {
      if (bVar14 < 3) {
        if (bVar14 != 0) goto _L223;
      }
      else if (bVar14 != 3) {
        iVar16 = 0x10;
        if (bVar14 != 4) goto _L223;
        goto LAB_0029c2b3;
      }
      iVar16 = 8;
    }
  }
LAB_0029c2b3:
  puVar13 = (uint *)(iVar9 + 8 + iVar16);
  puVar19 = puVar13;
  if (*(char *)((int)in_EDX + 0xba) != '\0') {
    do {
      puVar19 = (uint *)((int)puVar13 + 1);
      uVar17 = *puVar13;
      puVar13 = puVar19;
    } while ((char)(byte)uVar17 < '\0');
  }
  bVar14 = *(byte *)((int)in_EDX + 0xb9);
  if (bVar14 == 0xff) goto code_r0x0029c43a;
  bVar8 = bVar14 & 0x70;
  local_4c._0_1_ = bVar14 & 0x70;
  if (bVar8 == 0x20) {
    local_44 = *(uint **)(in_EAX + 0x54);
  }
  else if (bVar8 < 0x21) {
    if ((bVar8 != 0) && (bVar8 != 0x10)) goto _L223;
LAB_0029c5de:
    local_44 = (uint *)0x0;
  }
  else if ((byte)local_4c == 0x40) {
    local_44 = *(uint **)(in_EAX + 0x5c);
  }
  else {
    if ((byte)local_4c == 0x50) goto LAB_0029c5de;
    if ((byte)local_4c != 0x30) goto _L223;
    local_44 = *(uint **)(in_EAX + 0x58);
  }
  if (bVar14 == 0x50) {
    pbVar11 = *(byte **)((uint)((int)puVar19 + 3U) & 0xfffffffc);
  }
  else {
    switch(bVar14 & 0xf) {
    case 0:
    case 3:
    case 0xb:
      local_20 = *puVar19;
      break;
    case 1:
      bVar8 = 0;
      local_20 = 0;
      puVar13 = puVar19;
      do {
        uVar17 = *puVar13;
        bVar7 = bVar8 & 0x1f;
        bVar8 = bVar8 + 7;
        local_20 = local_20 | ((byte)uVar17 & 0x7f) << bVar7;
        puVar13 = (uint *)((int)puVar13 + 1);
      } while ((char)(byte)uVar17 < '\0');
      break;
    case 2:
      local_20 = (uint)(ushort)*puVar19;
      break;
    case 4:
    case 0xc:
      local_20 = *puVar19;
      break;
    default:
_L223:
                    /* WARNING: Subroutine does not return */
      abort();
    case 9:
      read_sleb128();
      break;
    case 10:
      local_20 = (uint)(short)(ushort)*puVar19;
    }
    pbVar11 = (byte *)0x0;
    if (local_20 != 0) {
      if ((byte)local_4c == 0x10) {
        local_44 = puVar19;
      }
      pbVar11 = (byte *)((int)local_44 + local_20);
      if ((char)bVar14 < '\0') {
        pbVar11 = *(byte **)pbVar11;
      }
    }
  }
  *(byte **)(in_EAX + 0x50) = pbVar11;
code_r0x0029c43a:
  execute_cfa_program(in_EAX);
  return 0;
}

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)