L L4D2node

bf_write::WriteBits

0x00b638b0 · 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_01044300 + 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_00b63987;
      }
      in_EDX = (uint *)((int)in_EDX + 1);
    }
    goto joined_r0x00b63b58;
  }
LAB_00b63987:
  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_01044360 + 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_00b63a70;
      }
      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_01044360 + 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_00b63a70:
  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_00b63b26;
      }
      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_01044300 + 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_00b63b26:
    local_20 = (local_20 - 8U) + uVar2 * -8;
  }
joined_r0x00b63b58:
  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 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)