execute_stack_op
0x0029c7a0 · 1798 bytes · unknown
Decompiled
undefined (0 params)
/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */
uint execute_stack_op(int param_1,uint param_2)
{
int iVar1;
byte bVar2;
ushort *puVar3;
uint uVar4;
byte bVar5;
byte *in_EAX;
byte *pbVar6;
byte bVar7;
byte bVar8;
byte bVar9;
byte *in_EDX;
uint uVar10;
undefined4 *puVar11;
byte *pbVar12;
byte *pbVar13;
uint auStack_51c [251];
byte *local_130;
uint local_124;
byte *local_120;
uint local_11c [67];
local_11c[0] = param_2;
if (in_EDX <= in_EAX) {
return param_2;
}
auStack_51c[0xf6] = 1;
LAB_0029c7e0:
bVar7 = *in_EAX;
uVar10 = (uint)bVar7;
pbVar6 = in_EAX + 1;
switch(uVar10 - 3 & 0xff) {
case 0:
case 9:
case 10:
pbVar6 = in_EAX + 5;
pbVar12 = *(byte **)(in_EAX + 1);
break;
default:
goto _L325;
case 3:
case 0x16:
case 0x1c:
case 0x1d:
case 0x20:
case 0x91:
if (auStack_51c[0xf6] == 0) goto _L325;
auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
puVar3 = (ushort *)local_11c[auStack_51c[0xf6]];
if (bVar7 == 0x1f) {
pbVar12 = (byte *)-(int)puVar3;
}
else if (bVar7 < 0x20) {
if (bVar7 == 6) {
pbVar12 = *(byte **)puVar3;
}
else {
if (bVar7 != 0x19) goto _L325;
pbVar12 = (byte *)(((uint)puVar3 ^ (int)puVar3 >> 0x1f) - ((int)puVar3 >> 0x1f));
}
}
else if (bVar7 == 0x23) {
bVar7 = 0;
uVar10 = 0;
pbVar12 = pbVar6;
do {
pbVar6 = pbVar12 + 1;
bVar8 = *pbVar12;
bVar9 = bVar7 & 0x1f;
bVar7 = bVar7 + 7;
uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
pbVar12 = pbVar6;
} while ((char)bVar8 < '\0');
pbVar12 = (byte *)((int)puVar3 + uVar10);
}
else if (bVar7 == 0x94) {
pbVar6 = in_EAX + 2;
bVar7 = in_EAX[1];
if (bVar7 == 2) {
pbVar12 = (byte *)(uint)*puVar3;
}
else if (bVar7 < 3) {
if (bVar7 != 1) goto _L325;
pbVar12 = (byte *)(uint)(byte)*puVar3;
}
else {
if ((bVar7 != 4) && (bVar7 != 8)) goto _L325;
pbVar12 = *(byte **)puVar3;
}
}
else {
if (bVar7 != 0x20) goto _L325;
pbVar12 = (byte *)~(uint)puVar3;
}
break;
case 5:
pbVar12 = (byte *)(uint)in_EAX[1];
pbVar6 = in_EAX + 2;
break;
case 6:
pbVar12 = (byte *)(int)(char)in_EAX[1];
pbVar6 = in_EAX + 2;
break;
case 7:
pbVar12 = (byte *)(uint)*(ushort *)(in_EAX + 1);
pbVar6 = in_EAX + 3;
break;
case 8:
pbVar12 = (byte *)(int)*(short *)(in_EAX + 1);
pbVar6 = in_EAX + 3;
break;
case 0xb:
case 0xc:
pbVar12 = *(byte **)(in_EAX + 1);
pbVar6 = in_EAX + 9;
break;
case 0xd:
pbVar12 = (byte *)0x0;
bVar7 = 0;
pbVar13 = pbVar6;
do {
pbVar6 = pbVar13 + 1;
bVar8 = *pbVar13;
bVar9 = bVar7 & 0x1f;
bVar7 = bVar7 + 7;
pbVar12 = (byte *)((uint)pbVar12 | (bVar8 & 0x7f) << bVar9);
pbVar13 = pbVar6;
} while ((char)bVar8 < '\0');
break;
case 0xe:
pbVar6 = (byte *)read_sleb128();
pbVar12 = local_120;
break;
case 0xf:
if (auStack_51c[0xf6] == 0) goto _L325;
pbVar12 = (byte *)local_11c[auStack_51c[0xf6] - 1];
break;
case 0x10:
if (auStack_51c[0xf6] != 0) {
auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
goto LAB_0029c828;
}
goto _L325;
case 0x11:
if ((int)auStack_51c[0xf6] < 2) goto _L325;
pbVar12 = (byte *)(&local_124)[auStack_51c[0xf6]];
break;
case 0x12:
pbVar6 = in_EAX + 2;
local_124 = (uint)in_EAX[1];
if ((int)(auStack_51c[0xf6] - 1) <= (int)local_124) goto _L325;
pbVar12 = (byte *)local_11c[(auStack_51c[0xf6] - 1) - local_124];
break;
case 0x13:
if (1 < (int)auStack_51c[0xf6]) {
uVar10 = local_11c[auStack_51c[0xf6] - 1];
local_11c[auStack_51c[0xf6] - 1] = local_11c[auStack_51c[0xf6] - 2];
local_11c[auStack_51c[0xf6] - 2] = uVar10;
goto LAB_0029c828;
}
goto _L325;
case 0x14:
if (2 < (int)auStack_51c[0xf6]) {
uVar10 = local_11c[auStack_51c[0xf6] - 1];
uVar4 = local_11c[auStack_51c[0xf6] - 3];
local_11c[auStack_51c[0xf6] - 1] = local_11c[auStack_51c[0xf6] - 2];
local_11c[auStack_51c[0xf6] - 2] = uVar4;
local_11c[auStack_51c[0xf6] - 3] = uVar10;
goto LAB_0029c828;
}
goto _L325;
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1e:
case 0x1f:
case 0x21:
case 0x22:
case 0x23:
case 0x24:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
case 0x2a:
case 0x2b:
if ((int)auStack_51c[0xf6] < 2) goto _L325;
uVar10 = local_11c[auStack_51c[0xf6] - 1];
auStack_51c[0xf6] = auStack_51c[0xf6] - 2;
uVar4 = local_11c[auStack_51c[0xf6]];
bVar8 = (byte)uVar10;
switch(bVar7) {
case 0x1a:
pbVar12 = (byte *)(uVar4 & uVar10);
break;
case 0x1b:
pbVar12 = (byte *)((int)uVar4 / (int)uVar10);
break;
case 0x1c:
pbVar12 = (byte *)(uVar4 - uVar10);
break;
case 0x1d:
pbVar12 = (byte *)(uVar4 % uVar10);
break;
case 0x1e:
pbVar12 = (byte *)(uVar4 * uVar10);
break;
default:
goto _L325;
case 0x21:
pbVar12 = (byte *)(uVar4 | uVar10);
break;
case 0x22:
pbVar12 = (byte *)(uVar4 + uVar10);
break;
case 0x24:
pbVar12 = (byte *)(uVar4 << (bVar8 & 0x1f));
break;
case 0x25:
pbVar12 = (byte *)(uVar4 >> (bVar8 & 0x1f));
break;
case 0x26:
pbVar12 = (byte *)((int)uVar4 >> (bVar8 & 0x1f));
break;
case 0x27:
pbVar12 = (byte *)(uVar4 ^ uVar10);
break;
case 0x29:
pbVar12 = (byte *)(uint)(uVar4 == uVar10);
break;
case 0x2a:
pbVar12 = (byte *)(uint)((int)uVar10 <= (int)uVar4);
break;
case 0x2b:
pbVar12 = (byte *)(uint)((int)uVar10 < (int)uVar4);
break;
case 0x2c:
pbVar12 = (byte *)(uint)((int)uVar4 <= (int)uVar10);
break;
case 0x2d:
pbVar12 = (byte *)(uint)((int)uVar4 < (int)uVar10);
break;
case 0x2e:
pbVar12 = (byte *)(uint)(uVar4 != uVar10);
}
break;
case 0x25:
if (auStack_51c[0xf6] != 0) {
auStack_51c[0xf6] = auStack_51c[0xf6] - 1;
pbVar6 = in_EAX + 3;
if (local_11c[auStack_51c[0xf6]] != 0) {
pbVar6 = pbVar6 + *(short *)(in_EAX + 1);
}
goto LAB_0029c828;
}
goto _L325;
case 0x2c:
pbVar6 = in_EAX + *(short *)(in_EAX + 1) + 3;
goto LAB_0029c828;
case 0x2d:
case 0x2e:
case 0x2f:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3a:
case 0x3b:
case 0x3c:
case 0x3d:
case 0x3e:
case 0x3f:
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x46:
case 0x47:
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
pbVar12 = (byte *)(uVar10 - 0x30);
break;
case 0x4d:
case 0x4e:
case 0x4f:
case 0x50:
case 0x51:
case 0x52:
case 0x53:
case 0x54:
case 0x55:
case 0x56:
case 0x57:
case 0x58:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
case 0x5e:
case 0x5f:
case 0x60:
case 0x61:
case 0x62:
case 99:
case 100:
case 0x65:
case 0x66:
case 0x67:
case 0x68:
case 0x69:
case 0x6a:
case 0x6b:
case 0x6c:
iVar1 = uVar10 - 0x50;
if (0x11 < iVar1) goto _L325;
pbVar12 = *(byte **)(param_1 + iVar1 * 4);
if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + iVar1) == '\0')) {
if (*(char *)((int)&g_pVGuiPanel + uVar10) != '\x04') goto _L325;
pbVar12 = *(byte **)pbVar12;
}
break;
case 0x6d:
case 0x6e:
case 0x6f:
case 0x70:
case 0x71:
case 0x72:
case 0x73:
case 0x74:
case 0x75:
case 0x76:
case 0x77:
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7e:
case 0x7f:
case 0x80:
case 0x81:
case 0x82:
case 0x83:
case 0x84:
case 0x85:
case 0x86:
case 0x87:
case 0x88:
case 0x89:
case 0x8a:
case 0x8b:
case 0x8c:
pbVar6 = (byte *)read_sleb128();
iVar1 = uVar10 - 0x70;
if (0x11 < iVar1) goto _L325;
puVar11 = *(undefined4 **)(param_1 + iVar1 * 4);
if (((*(byte *)(param_1 + 99) & 0x40) != 0) && (*(char *)(param_1 + 0x6c + iVar1) != '\0'))
goto LAB_0029ca52;
if (*(char *)((int)&g_pAVI + uVar10) != '\x04') goto _L325;
LAB_0029ca4f:
puVar11 = (undefined4 *)*puVar11;
goto LAB_0029ca52;
case 0x8d:
bVar7 = 0;
uVar10 = 0;
pbVar12 = pbVar6;
do {
pbVar6 = pbVar12 + 1;
bVar8 = *pbVar12;
bVar9 = bVar7 & 0x1f;
bVar7 = bVar7 + 7;
uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
pbVar12 = pbVar6;
} while ((char)bVar8 < '\0');
if (0x11 < (int)uVar10) goto _L325;
pbVar12 = *(byte **)(param_1 + uVar10 * 4);
if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + uVar10) == '\0')) {
if ((&dwarf_reg_size_table)[uVar10] != '\x04') goto _L325;
LAB_0029ca02:
pbVar12 = *(byte **)pbVar12;
}
break;
case 0x8f:
bVar7 = 0;
uVar10 = 0;
do {
bVar8 = *pbVar6;
bVar9 = bVar7 & 0x1f;
bVar7 = bVar7 + 7;
uVar10 = uVar10 | (bVar8 & 0x7f) << bVar9;
pbVar6 = pbVar6 + 1;
} while ((char)bVar8 < '\0');
pbVar6 = (byte *)read_sleb128();
if (0x11 < (int)uVar10) goto _L325;
puVar11 = *(undefined4 **)(param_1 + uVar10 * 4);
if (((*(byte *)(param_1 + 99) & 0x40) == 0) || (*(char *)(param_1 + 0x6c + uVar10) == '\0')) {
if ((&dwarf_reg_size_table)[uVar10] != '\x04') {
/* WARNING: Subroutine does not return */
abort();
}
goto LAB_0029ca4f;
}
LAB_0029ca52:
pbVar12 = (byte *)((int)puVar11 + local_124);
break;
case 0x93:
goto LAB_0029c828;
case 0xee:
bVar7 = in_EAX[1];
if (bVar7 == 0xff) goto _L325;
bVar9 = bVar7 & 0x70;
bVar8 = bVar7 & 0x70;
if (bVar9 == 0x20) {
local_130 = *(byte **)(param_1 + 0x54);
}
else if (bVar9 < 0x21) {
if ((bVar9 != 0) && (bVar9 != 0x10)) goto _L325;
LAB_0029cd4b:
local_130 = (byte *)0x0;
}
else if (bVar8 == 0x40) {
local_130 = *(byte **)(param_1 + 0x5c);
}
else {
if (bVar8 == 0x50) goto LAB_0029cd4b;
if (bVar8 != 0x30) goto _L325;
local_130 = *(byte **)(param_1 + 0x58);
}
if (bVar7 == 0x50) {
pbVar12 = *(byte **)((uint)(in_EAX + 5) & 0xfffffffc);
pbVar6 = (byte *)((undefined4 *)((uint)(in_EAX + 5) & 0xfffffffc) + 1);
}
else {
switch(bVar7 & 0xf) {
case 0:
case 3:
case 0xb:
pbVar6 = in_EAX + 6;
pbVar13 = *(byte **)(in_EAX + 2);
break;
case 1:
pbVar13 = (byte *)0x0;
bVar9 = 0;
pbVar12 = in_EAX + 2;
do {
pbVar6 = pbVar12 + 1;
bVar2 = *pbVar12;
bVar5 = bVar9 & 0x1f;
bVar9 = bVar9 + 7;
pbVar13 = (byte *)((uint)pbVar13 | (bVar2 & 0x7f) << bVar5);
pbVar12 = pbVar6;
} while ((char)bVar2 < '\0');
break;
case 2:
pbVar13 = (byte *)(uint)*(ushort *)(in_EAX + 2);
pbVar6 = in_EAX + 4;
break;
case 4:
case 0xc:
pbVar6 = in_EAX + 10;
pbVar13 = *(byte **)(in_EAX + 2);
break;
default:
goto _L325;
case 9:
pbVar6 = (byte *)read_sleb128();
pbVar13 = local_120;
break;
case 10:
pbVar6 = in_EAX + 4;
pbVar13 = (byte *)(int)*(short *)(in_EAX + 2);
}
pbVar12 = (byte *)0x0;
if (pbVar13 != (byte *)0x0) {
if (bVar8 == 0x10) {
local_130 = in_EAX + 2;
}
pbVar12 = pbVar13 + (int)local_130;
if ((char)bVar7 < '\0') goto LAB_0029ca02;
}
}
}
if (0x3f < auStack_51c[0xf6]) goto _L325;
local_11c[auStack_51c[0xf6]] = (uint)pbVar12;
auStack_51c[0xf6] = auStack_51c[0xf6] + 1;
LAB_0029c828:
in_EAX = pbVar6;
if (in_EDX <= pbVar6) {
if (auStack_51c[0xf6] != 0) {
return local_11c[auStack_51c[0xf6] - 1];
}
_L325:
/* WARNING: Subroutine does not return */
abort();
}
goto LAB_0029c7e0;
}
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.