L L4D2node

search_object

0x000ae990 · 1753 bytes · unknown

Decompiled

undefined (0 params)

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

int search_object(void)

{
  size_t __size;
  byte bVar1;
  int iVar2;
  uint uVar3;
  void *pvVar4;
  uint *in_EAX;
  int iVar5;
  undefined4 uVar6;
  uint in_EDX;
  uint uVar7;
  uint uVar8;
  uint *puVar9;
  uint *puVar10;
  uint uVar11;
  code *pcVar12;
  int *piVar13;
  uint *puVar14;
  uint uVar15;
  code *local_50;
  uint local_48;
  uint *local_44;
  uint local_3c;
  uint local_34;
  uint *local_30;
  uint local_28;
  uint *local_24;
  void *local_20;
  
  bVar1 = (byte)in_EAX[4];
  if ((bVar1 & 1) != 0) goto LAB_000ae9b5;
  local_34 = in_EAX[4] >> 0xb;
  if (local_34 == 0) {
    if ((bVar1 & 2) == 0) {
      local_34 = classify_object_over_fdes();
      if (local_34 != 0xffffffff) goto LAB_000aec13;
LAB_000aea8b:
      in_EAX[4] = 0;
      in_EAX[3] = (uint)&terminator_8438;
      *(undefined2 *)(in_EAX + 4) = 0x7f8;
    }
    else {
      piVar13 = (int *)in_EAX[3];
      if (*piVar13 == 0) {
        in_EAX[4] = in_EAX[4] & 0x7ff;
      }
      else {
        local_34 = 0;
        do {
          iVar5 = classify_object_over_fdes();
          if (iVar5 == -1) goto LAB_000aea8b;
          piVar13 = piVar13 + 1;
          local_34 = local_34 + iVar5;
        } while (*piVar13 != 0);
LAB_000aec13:
        if (local_34 == (local_34 & 0x1fffff)) {
          in_EAX[4] = in_EAX[4] & 0x7ff | local_34 << 0xb;
        }
        else {
          in_EAX[4] = in_EAX[4] & 0x7ff;
        }
        if (local_34 != 0) goto LAB_000aec39;
      }
    }
  }
  else {
LAB_000aec39:
    __size = local_34 * 4 + 8;
    local_30 = malloc(__size);
    local_24 = local_30;
    if (local_30 != (uint *)0x0) {
      local_30[1] = 0;
      local_20 = malloc(__size);
      if (local_20 != (void *)0x0) {
        *(undefined4 *)((int)local_20 + 4) = 0;
      }
      if ((in_EAX[4] & 2) == 0) {
        add_fdes(in_EAX[3]);
LAB_000aecad:
        local_30 = local_24;
        if (local_24 != (uint *)0x0) goto LAB_000aecbd;
      }
      else {
        piVar13 = (int *)in_EAX[3];
        iVar5 = *piVar13;
        if (iVar5 != 0) {
          do {
            piVar13 = piVar13 + 1;
            add_fdes(iVar5);
            iVar5 = *piVar13;
          } while (iVar5 != 0);
          goto LAB_000aecad;
        }
LAB_000aecbd:
        if (local_34 != local_30[1]) goto LAB_000af092;
      }
      pvVar4 = local_20;
      local_50 = fde_mixed_encoding_compare;
      if ((in_EAX[4] & 4) == 0) {
        local_50 = fde_single_encoding_compare;
        if ((in_EAX[4] & 0x7f8) == 0) {
          local_50 = fde_unencoded_compare;
        }
      }
      if (local_20 == (void *)0x0) {
        frame_heapsort(local_30);
      }
      else {
        uVar11 = local_30[1];
        if (uVar11 == 0) {
          iVar5 = 0;
          uVar8 = 0;
          puVar9 = local_30;
        }
        else {
          local_3c = 0;
          puVar9 = local_30 + 2;
          puVar14 = &marker_8332;
          while( true ) {
            *(uint **)((int)pvVar4 + local_3c * 4 + 8) = puVar14;
            if (local_3c + 1 == uVar11) break;
            puVar10 = puVar9;
            puVar14 = &marker_8332;
            if (puVar9 != &marker_8332) {
              do {
                iVar5 = (*local_50)();
                puVar14 = puVar10;
                if (-1 < iVar5) break;
                uVar8 = (int)puVar10 - (int)(local_30 + 2) & 0xfffffffc;
                puVar10 = *(uint **)((int)pvVar4 + uVar8 + 8);
                *(undefined4 *)((int)pvVar4 + uVar8 + 8) = 0;
                puVar14 = &marker_8332;
              } while (puVar10 != &marker_8332);
            }
            puVar9 = puVar9 + 1;
            local_3c = local_3c + 1;
          }
          uVar8 = 0;
          uVar15 = 0;
          iVar5 = 0;
          do {
            if (*(int *)((int)pvVar4 + uVar15 * 4 + 8) == 0) {
              *(uint *)((int)pvVar4 + iVar5 * 4 + 8) = local_30[uVar15 + 2];
              iVar5 = iVar5 + 1;
            }
            else {
              local_30[uVar8 + 2] = local_30[uVar15 + 2];
              uVar8 = uVar8 + 1;
            }
            uVar15 = uVar15 + 1;
            puVar9 = local_24;
          } while (uVar15 != uVar11);
        }
        local_30[1] = uVar8;
        *(int *)((int)pvVar4 + 4) = iVar5;
        if (local_34 != *(int *)((int)local_20 + 4) + puVar9[1]) {
LAB_000af092:
                    /* WARNING: Subroutine does not return */
          abort();
        }
        frame_heapsort(local_20);
        pvVar4 = local_20;
        puVar9 = local_24;
        local_3c = *(int *)((int)local_20 + 4);
        if (local_3c != 0) {
          uVar11 = local_24[1];
          local_44 = local_24 + local_3c;
          do {
            local_3c = local_3c + -1;
            uVar8 = *(uint *)((int)pvVar4 + local_3c * 4 + 8);
            while (uVar11 != 0) {
              iVar5 = (*local_50)(in_EAX,puVar9[uVar11 + 1],uVar8);
              if (iVar5 < 1) goto LAB_000aefae;
              local_44[uVar11 + 1] = puVar9[uVar11 + 1];
              uVar11 = uVar11 - 1;
            }
            uVar11 = 0;
LAB_000aefae:
            local_44 = local_44 + -1;
            puVar9[local_3c + uVar11 + 2] = uVar8;
          } while (local_3c != 0);
          puVar9[1] = puVar9[1] + *(int *)((int)pvVar4 + 4);
        }
        free(local_20);
      }
      *local_24 = in_EAX[3];
      in_EAX[3] = (uint)local_24;
      *(byte *)(in_EAX + 4) = (byte)in_EAX[4] | 1;
    }
  }
  if (in_EDX < *in_EAX) {
    return 0;
  }
  bVar1 = (byte)in_EAX[4];
  if ((bVar1 & 1) == 0) {
    if ((bVar1 & 2) == 0) {
      iVar5 = linear_search_fdes(in_EDX);
      return iVar5;
    }
    piVar13 = (int *)in_EAX[3];
    iVar5 = *piVar13;
    while( true ) {
      if (iVar5 == 0) {
        return 0;
      }
      iVar5 = linear_search_fdes(in_EDX);
      if (iVar5 != 0) break;
      piVar13 = piVar13 + 1;
      iVar5 = *piVar13;
    }
    return iVar5;
  }
LAB_000ae9b5:
  if ((bVar1 & 4) == 0) {
    if ((in_EAX[4] & 0x7f8) == 0) {
      uVar8 = in_EAX[3];
      local_48 = *(uint *)(uVar8 + 4);
      uVar11 = 0;
      while (uVar11 < local_48) {
        uVar7 = local_48 + uVar11 >> 1;
        iVar5 = *(int *)(uVar8 + 8 + uVar7 * 4);
        iVar2 = *(int *)(iVar5 + 0xc);
        uVar15 = *(uint *)(iVar5 + 8);
        while (uVar3 = uVar7, in_EDX < uVar15) {
          if (uVar3 <= uVar11) {
            return 0;
          }
          uVar7 = uVar3 + uVar11 >> 1;
          iVar5 = *(int *)(uVar8 + 8 + uVar7 * 4);
          iVar2 = *(int *)(iVar5 + 0xc);
          local_48 = uVar3;
          uVar15 = *(uint *)(iVar5 + 8);
        }
        if (in_EDX < uVar15 + iVar2) {
          return iVar5;
        }
        uVar11 = uVar3 + 1;
      }
    }
    else {
      uVar11 = in_EAX[3];
      base_from_object_isra_3(in_EAX + 2);
      uVar8 = *(uint *)(uVar11 + 4);
      if (uVar8 != 0) {
        uVar15 = 0;
        do {
          uVar7 = uVar15 + uVar8 >> 1;
          iVar5 = *(int *)(uVar11 + 8 + uVar7 * 4);
          uVar6 = read_encoded_value_with_base(iVar5 + 8,&local_28);
          read_encoded_value_with_base(uVar6,&local_24);
          if (local_28 <= in_EDX) {
            if (in_EDX < local_28 + (int)local_24) {
              return iVar5;
            }
            uVar15 = uVar7 + 1;
            uVar7 = uVar8;
          }
          uVar8 = uVar7;
        } while (uVar15 < uVar7);
      }
    }
  }
  else {
    uVar11 = in_EAX[3];
    local_50 = *(code **)(uVar11 + 4);
    if (local_50 != (code *)0x0) {
      local_48 = 0;
      do {
        pcVar12 = (code *)(local_48 + (int)local_50 >> 1);
        iVar5 = *(int *)(uVar11 + 8 + (int)pcVar12 * 4);
        get_cie_encoding();
        base_from_object_isra_3(in_EAX + 2);
        uVar6 = read_encoded_value_with_base(iVar5 + 8,&local_28);
        read_encoded_value_with_base(uVar6,&local_24);
        if (local_28 <= in_EDX) {
          if (in_EDX < local_28 + (int)local_24) {
            return iVar5;
          }
          local_48 = (int)pcVar12 + 1;
          pcVar12 = local_50;
        }
        local_50 = pcVar12;
      } while (local_48 < local_50);
    }
  }
  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)