bf_write::WriteBits
0x00097640 · 1011 bytes · __thiscall
_ZN8bf_write9WriteBitsEPKvi.part.10
Decompiled
undefined (3 params)
/* bf_write::WriteBits(void const*, int) [clone .part.10] */
byte __thiscall bf_write::WriteBits(bf_write *this,void *param_1,int param_2)
{
uint uVar1;
int *in_EAX;
uint uVar2;
int iVar3;
int in_ECX;
uint uVar4;
uint *in_EDX;
uint *puVar5;
uint uVar6;
int iVar7;
byte local_30;
uint *local_2c;
int local_28;
uint *local_24;
int local_20;
local_24 = in_EDX;
local_20 = in_ECX;
if (((uint)in_EDX & 3) != 0) {
for (; 7 < local_20; local_20 = local_20 + -8) {
uVar2 = in_EAX[3];
uVar6 = *in_EDX;
if (in_EAX[2] < (int)(uVar2 + 8)) {
in_EAX[3] = in_EAX[2];
*(undefined1 *)(in_EAX + 4) = 1;
}
else {
uVar4 = uVar2 & 0x1f;
iVar3 = ((int)uVar2 >> 5) * 4;
puVar5 = (uint *)(iVar3 + *in_EAX);
*puVar5 = (uint)(byte)uVar6 << (sbyte)uVar4 |
*puVar5 & *(uint *)(&DAT_000d6ae0 + uVar4 * 0x84);
iVar7 = 0x20 - uVar4;
if (iVar7 < 8) {
puVar5 = (uint *)(*in_EAX + 4 + iVar3);
*puVar5 = (uint)(byte)((byte)uVar6 >> ((byte)iVar7 & 0x1f)) |
(&g_BitWriteMasks)[8 - iVar7] & *puVar5;
}
in_EAX[3] = in_EAX[3] + 8;
}
if (((uint)((int)in_EDX + 1) & 3) == 0) {
local_20 = local_20 + -8;
local_24 = (uint *)((int)in_EDX + 1);
goto LAB_00097717;
}
in_EDX = (uint *)((int)in_EDX + 1);
}
goto joined_r0x000978e8;
}
LAB_00097717:
if (local_20 < 0x20) {
local_2c = local_24;
}
else {
uVar2 = in_EAX[3];
if ((uVar2 & 7) == 0) {
iVar3 = local_20 >> 3;
_V_memcpy((void *)(((int)uVar2 >> 3) + *in_EAX),local_24,iVar3);
local_2c = (uint *)(iVar3 + (int)local_24);
local_20 = local_20 + iVar3 * -8;
in_EAX[3] = in_EAX[3] + iVar3 * 8;
}
else {
local_28 = *in_EAX;
iVar3 = ((int)uVar2 >> 5) * 4;
uVar6 = uVar2 & 0x1f;
local_30 = 0x20 - (sbyte)uVar6;
uVar4 = *(uint *)(local_28 + iVar3) & *(uint *)(&DAT_000d6b40 + uVar6 * 0x84);
if (local_20 < (int)(0x40 - uVar6)) {
*(uint *)(local_28 + iVar3) = uVar4;
local_2c = local_24;
}
else {
uVar1 = local_20 - (0x40 - uVar6) >> 5;
local_2c = local_24 + uVar1 + 1;
puVar5 = local_24;
local_24 = (uint *)uVar4;
while( true ) {
uVar4 = *puVar5;
puVar5 = puVar5 + 1;
*(uint *)(local_28 + iVar3) = (uint)local_24 | uVar4 << (sbyte)uVar6;
iVar3 = iVar3 + 4;
in_EAX[3] = in_EAX[3] + 0x20;
local_24 = (uint *)(uVar4 >> (local_30 & 0x1f));
if (puVar5 == local_2c) break;
local_28 = *in_EAX;
}
local_20 = local_20 + -0x20 + uVar1 * -0x20;
*(uint **)(*in_EAX + (((int)uVar2 >> 5) + 1 + uVar1) * 4) = local_24;
if (local_20 < 0x20) goto LAB_00097800;
}
uVar2 = *local_2c;
uVar6 = in_EAX[3];
if (in_EAX[2] < (int)(uVar6 + 0x20)) {
in_EAX[3] = in_EAX[2];
*(undefined1 *)(in_EAX + 4) = 1;
}
else {
iVar3 = ((int)uVar6 >> 5) * 4;
uVar6 = uVar6 & 0x1f;
puVar5 = (uint *)(*in_EAX + iVar3);
*puVar5 = uVar2 << (sbyte)uVar6 | *puVar5 & *(uint *)(&DAT_000d6b40 + uVar6 * 0x84);
iVar7 = 0x20 - uVar6;
if (iVar7 != 0x20) {
puVar5 = (uint *)(*in_EAX + 4 + iVar3);
*puVar5 = uVar2 >> ((byte)iVar7 & 0x1f) | (&g_BitWriteMasks)[0x20 - iVar7] & *puVar5;
}
in_EAX[3] = in_EAX[3] + 0x20;
}
local_2c = local_2c + 1;
local_20 = local_20 + -0x20;
}
}
LAB_00097800:
in_EDX = local_2c;
if (7 < local_20) {
uVar2 = local_20 - 8U >> 3;
in_EDX = (uint *)((int)local_2c + uVar2 + 1);
do {
while( true ) {
uVar6 = in_EAX[3];
uVar4 = *local_2c;
if ((int)(uVar6 + 8) <= in_EAX[2]) break;
local_2c = (uint *)((int)local_2c + 1);
in_EAX[3] = in_EAX[2];
*(undefined1 *)(in_EAX + 4) = 1;
if (local_2c == in_EDX) goto LAB_000978b6;
}
iVar3 = ((int)uVar6 >> 5) * 4;
uVar6 = uVar6 & 0x1f;
puVar5 = (uint *)(iVar3 + *in_EAX);
iVar7 = 0x20 - uVar6;
*puVar5 = (uint)(byte)uVar4 << (sbyte)uVar6 |
*puVar5 & *(uint *)(&DAT_000d6ae0 + uVar6 * 0x84);
if (iVar7 < 8) {
puVar5 = (uint *)(*in_EAX + 4 + iVar3);
*puVar5 = (uint)(byte)((byte)uVar4 >> ((byte)iVar7 & 0x1f)) |
(&g_BitWriteMasks)[8 - iVar7] & *puVar5;
}
in_EAX[3] = in_EAX[3] + 8;
local_2c = (uint *)((int)local_2c + 1);
} while (local_2c != in_EDX);
LAB_000978b6:
local_20 = (local_20 - 8U) + uVar2 * -8;
}
joined_r0x000978e8:
if (local_20 != 0) {
uVar2 = in_EAX[3];
uVar6 = *in_EDX;
if (in_EAX[2] < (int)(local_20 + uVar2)) {
in_EAX[3] = in_EAX[2];
*(undefined1 *)(in_EAX + 4) = 1;
return 0;
}
uVar4 = uVar2 & 0x1f;
iVar7 = ((int)uVar2 >> 5) * 4;
puVar5 = (uint *)(*in_EAX + iVar7);
iVar3 = 0x20 - uVar4;
*puVar5 = (uint)(byte)uVar6 << (sbyte)uVar4 |
(&g_BitWriteMasks)[uVar4 * 0x21 + local_20] & *puVar5;
if (iVar3 < local_20) {
puVar5 = (uint *)(*in_EAX + 4 + iVar7);
*puVar5 = (&g_BitWriteMasks)[local_20 - iVar3] & *puVar5 |
(uint)(byte)((byte)uVar6 >> ((byte)iVar3 & 0x1f));
}
in_EAX[3] = in_EAX[3] + local_20;
}
return *(byte *)(in_EAX + 4) ^ 1;
}
SourceMod gamedata
paste intoaddons/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.
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.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.