_Unwind_IteratePhdrCallback
0x000af100 · 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_000af140:
local_40 = (uint *)0x0;
local_44 = (uint *)0x0;
}
else {
if (DAT_000d2d84 == param_1[5] && adds_8594 == param_1[4]) {
local_5c = (int *)param_1[6];
uVar9 = param_1[7];
if (uVar9 == DAT_000e6e14 && 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_000af217;
}
} while ((local_40[1] != 0 || *local_40 != 0) &&
(puVar3 = local_40, puVar4 = (uint *)local_40[5],
(uint *)local_40[5] != (uint *)0x0));
goto LAB_000af150;
}
goto LAB_000af140;
}
}
else {
local_5c = (int *)param_1[6];
uVar9 = param_1[7];
}
subs_8595 = (uint)local_5c;
puVar12 = &DAT_000e6e38;
adds_8594 = param_1[4];
DAT_000d2d84 = param_1[5];
DAT_000e6e14 = 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_000e6edc = 0;
local_40 = (uint *)0x0;
local_44 = (uint *)0x0;
param_3[5] = 0;
}
LAB_000af150:
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_000af1ad:
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_000af1ad;
}
}
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_000af217:
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_000af5e7:
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_000af5e7;
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 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.