L L4D2node

bf_write::WriteBitsFromBuffer

0x00241350 · 953 bytes · __thiscall

_ZN8bf_write19WriteBitsFromBufferEP7bf_readi

Decompiled

undefined (3 params)

/* bf_write::WriteBitsFromBuffer(bf_read*, int) */

byte __thiscall bf_write::WriteBitsFromBuffer(bf_write *this,bf_read *param_1,int param_2)

{
  undefined4 *puVar1;
  uint uVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  uint *puVar7;
  int local_18;
  uint local_14;
  
  if (0x20 < param_2) {
    local_18 = param_2;
    do {
      while (iVar4 = *(int *)(param_1 + 0x14), 0x1f < iVar4) {
        *(int *)(param_1 + 0x14) = iVar4 + -0x20;
        local_14 = *(uint *)(param_1 + 0x10);
        if (iVar4 + -0x20 == 0) {
          puVar1 = *(undefined4 **)(param_1 + 0x18);
          *(undefined4 *)(param_1 + 0x14) = 0x20;
          if (puVar1 == *(undefined4 **)(param_1 + 0x1c)) {
            *(undefined4 *)(param_1 + 0x14) = 1;
            *(undefined4 *)(param_1 + 0x10) = 0;
            *(undefined4 **)(param_1 + 0x18) = puVar1 + 1;
          }
          else {
            if (*(undefined4 **)(param_1 + 0x1c) < puVar1) {
              param_1[4] = (bf_read)0x1;
              goto LAB_002413a7;
            }
            *(undefined4 **)(param_1 + 0x18) = puVar1 + 1;
            *(undefined4 *)(param_1 + 0x10) = *puVar1;
          }
        }
        else {
LAB_002413a7:
          *(undefined4 *)(param_1 + 0x10) = 0;
        }
LAB_002413b1:
        uVar5 = *(uint *)(this + 0xc);
        iVar4 = *(int *)(this + 8);
        if ((int)(uVar5 + 0x20) <= iVar4) goto LAB_002413c2;
LAB_00241476:
        local_18 = local_18 + -0x20;
        *(int *)(this + 0xc) = iVar4;
        this[0x10] = (bf_write)0x1;
        if (local_18 < 0x21) goto LAB_00241487;
      }
      local_14 = *(uint *)(param_1 + 0x10);
      puVar7 = *(uint **)(param_1 + 0x18);
      if (puVar7 == *(uint **)(param_1 + 0x1c)) {
        *(undefined4 *)(param_1 + 0x14) = 1;
        *(undefined4 *)(param_1 + 0x10) = 0;
        *(uint **)(param_1 + 0x18) = puVar7 + 1;
        param_1[4] = (bf_read)0x1;
      }
      else if (*(uint **)(param_1 + 0x1c) < puVar7) {
        param_1[4] = (bf_read)0x1;
        *(undefined4 *)(param_1 + 0x10) = 0;
      }
      else {
        *(uint **)(param_1 + 0x18) = puVar7 + 1;
        uVar5 = *puVar7;
        *(uint *)(param_1 + 0x10) = uVar5;
        if (param_1[4] == (bf_read)0x0) {
          *(int *)(param_1 + 0x14) = iVar4;
          uVar2 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar4];
          *(uint *)(param_1 + 0x10) = uVar5 >> ((byte)(0x20 - iVar4) & 0x1f);
          local_14 = (uVar2 & uVar5) << ((byte)iVar4 & 0x1f) | local_14;
          goto LAB_002413b1;
        }
      }
      uVar5 = *(uint *)(this + 0xc);
      local_14 = 0;
      iVar4 = *(int *)(this + 8);
      if (iVar4 < (int)(uVar5 + 0x20)) goto LAB_00241476;
LAB_002413c2:
      iVar4 = ((int)uVar5 >> 5) * 4;
      uVar5 = uVar5 & 0x1f;
      puVar7 = (uint *)(*(int *)this + iVar4);
      iVar6 = 0x20 - uVar5;
      *puVar7 = local_14 << (sbyte)uVar5 | *puVar7 & *(uint *)(&DAT_003f2e20 + uVar5 * 0x84);
      if (iVar6 != 0x20) {
        puVar7 = (uint *)(*(int *)this + 4 + iVar4);
        *puVar7 = local_14 >> ((byte)iVar6 & 0x1f) | (&g_BitWriteMasks)[0x20 - iVar6] & *puVar7;
      }
      local_18 = local_18 + -0x20;
      *(int *)(this + 0xc) = *(int *)(this + 0xc) + 0x20;
    } while (0x20 < local_18);
LAB_00241487:
    param_2 = (param_2 + -0x20) - (param_2 - 0x21U & 0xffffffe0);
  }
  iVar4 = *(int *)(param_1 + 0x14);
  uVar5 = *(uint *)(param_1 + 0x10);
  if (iVar4 < param_2) {
    puVar7 = *(uint **)(param_1 + 0x18);
    if (puVar7 == *(uint **)(param_1 + 0x1c)) {
      *(undefined4 *)(param_1 + 0x14) = 1;
      *(undefined4 *)(param_1 + 0x10) = 0;
      *(uint **)(param_1 + 0x18) = puVar7 + 1;
      param_1[4] = (bf_read)0x1;
    }
    else if (*(uint **)(param_1 + 0x1c) < puVar7) {
      param_1[4] = (bf_read)0x1;
      *(undefined4 *)(param_1 + 0x10) = 0;
    }
    else {
      *(uint **)(param_1 + 0x18) = puVar7 + 1;
      uVar2 = *puVar7;
      *(uint *)(param_1 + 0x10) = uVar2;
      if (param_1[4] == (bf_read)0x0) {
        iVar6 = param_2 - iVar4;
        uVar3 = (&CBitBuffer::s_nMaskTable)[iVar6];
        *(int *)(param_1 + 0x14) = 0x20 - iVar6;
        *(uint *)(param_1 + 0x10) = uVar2 >> ((byte)iVar6 & 0x1f);
        local_14 = (uVar3 & uVar2) << ((byte)iVar4 & 0x1f) | uVar5;
        goto LAB_002415bf;
      }
    }
    local_14 = 0;
  }
  else {
    local_14 = (&CBitBuffer::s_nMaskTable)[param_2];
    *(int *)(param_1 + 0x14) = iVar4 - param_2;
    local_14 = local_14 & uVar5;
    if (iVar4 - param_2 == 0) {
      puVar1 = *(undefined4 **)(param_1 + 0x18);
      *(undefined4 *)(param_1 + 0x14) = 0x20;
      if (puVar1 == *(undefined4 **)(param_1 + 0x1c)) {
        *(undefined4 *)(param_1 + 0x14) = 1;
        *(undefined4 *)(param_1 + 0x10) = 0;
        *(undefined4 **)(param_1 + 0x18) = puVar1 + 1;
      }
      else {
        if (*(undefined4 **)(param_1 + 0x1c) < puVar1) {
          param_1[4] = (bf_read)0x1;
          *(undefined4 *)(param_1 + 0x10) = 0;
          uVar5 = *(uint *)(this + 0xc);
          iVar4 = *(int *)(this + 8);
          if ((int)(param_2 + uVar5) <= iVar4) goto LAB_002415d2;
          goto LAB_00241500;
        }
        *(undefined4 **)(param_1 + 0x18) = puVar1 + 1;
        *(undefined4 *)(param_1 + 0x10) = *puVar1;
      }
    }
    else {
      *(uint *)(param_1 + 0x10) = uVar5 >> ((byte)param_2 & 0x1f);
    }
  }
LAB_002415bf:
  uVar5 = *(uint *)(this + 0xc);
  iVar4 = *(int *)(this + 8);
  if ((int)(param_2 + uVar5) <= iVar4) {
LAB_002415d2:
    iVar4 = ((int)uVar5 >> 5) * 4;
    uVar5 = uVar5 & 0x1f;
    puVar7 = (uint *)(*(int *)this + iVar4);
    *puVar7 = (&g_BitWriteMasks)[uVar5 * 0x21 + param_2] & *puVar7 | local_14 << (sbyte)uVar5;
    iVar6 = 0x20 - uVar5;
    if (iVar6 < param_2) {
      puVar7 = (uint *)(*(int *)this + 4 + iVar4);
      *puVar7 = local_14 >> ((byte)iVar6 & 0x1f) | (&g_BitWriteMasks)[param_2 - iVar6] & *puVar7;
    }
    *(int *)(this + 0xc) = *(int *)(this + 0xc) + param_2;
    if (this[0x10] == (bf_write)0x0) {
      return (byte)param_1[4] ^ 1;
    }
    return 0;
  }
LAB_00241500:
  *(int *)(this + 0xc) = iVar4;
  this[0x10] = (bf_write)0x1;
  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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)