search_object
0x00bf81c0 · 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_00bf81e5;
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_00bf8443;
LAB_00bf82bb:
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_00bf82bb;
piVar13 = piVar13 + 1;
local_34 = local_34 + iVar5;
} while (*piVar13 != 0);
LAB_00bf8443:
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_00bf8469;
}
}
}
else {
LAB_00bf8469:
__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_00bf84dd:
local_30 = local_24;
if (local_24 != (uint *)0x0) goto LAB_00bf84ed;
}
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_00bf84dd;
}
LAB_00bf84ed:
if (local_34 != local_30[1]) goto LAB_00bf88c2;
}
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_00bf88c2:
/* 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_00bf87de;
local_44[uVar11 + 1] = puVar9[uVar11 + 1];
uVar11 = uVar11 - 1;
}
uVar11 = 0;
LAB_00bf87de:
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_00bf81e5:
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 intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
⚠ 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.