HvpRemoveFreeCellHint

VOID __fastcall HvpRemoveFreeCellHint(UINT64 P2, UINT64 P3, INT64 a3, INT64 a4, INT64 a5){
  __int64 v5; 
  char v7; 
  ULONG_PTR v8; 
  INT64 CellMap; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  unsigned int *v13; 
  __int64 v14; 
  int v15; 
  unsigned int v16; 
  __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  int v20; 
  RTL_BITMAP *v21; 
  int SetBits; 
  int v23; 
  unsigned int v24; 
  unsigned int v25; 
  v5 = (int)a4;
  v7 = 0;
  v8 = (unsigned int)P3;
  CellMap = HvpGetCellMap(P2, P3);
  if( !CellMap )
    KeBugCheckEx(0x51u, 1ui64, P2, v8, 0x310ui64);
  v11 = *(_QWORD *)(CellMap + 8) & 0xFFFFFFFFFFFFFFF0ui64;
  v12 = *(_DWORD *)(v11 + 4);
  v13 = (unsigned int *)(v11 + 32);
  v14 = *(unsigned int *)(v11 + 8);
  v15 = ((_DWORD)v5 << 31) | (v12 + 32);
  if( v11 + 32 < v11 + v14 )
  {
    do
    {
      v16 = *v13;
      if( (*v13 & 0x80000000) == 0 )
      {
        v24 = (v16 >> 3) - 1;
        if( v24 >= 0x10 )
        {
          v25 = v24 >> 4;
          if( v25 > 0xFF )
          {
            v24 = 23;
          }
          else
          {
            _BitScanReverse(&v25, v25);
            v24 = v25 + 16;
          }
        }
        if( (_DWORD)v10 == v24 && v15 != (_DWORD)v8 && v15 != (_DWORD)a5 )
        {
          v7 = 1;
          break;
        }
      }
      else
      {
        v16 = -v16;
      }
      v15 += v16;
      v13 = (unsigned int *)((char *)v13 + v16);
    }
    while( (unsigned __int64)v13 < v11 + v14 );
  }
  v17 = 632 * v5;
  v18 = v12 >> 12;
  v19 = 24 * v10;
  v20 = 1 << v10;
  v21 = (RTL_BITMAP *)(24 * v10 + 632 * v5 + P2 + 312);
  if( v7 )
  {
    *(_DWORD *)(v17 + P2 + 896) |= v20;
    *(_DWORD *)(v19 + v17 + P2 + 308) = v18;
    RtlSetBits(v21, v18, *(_DWORD *)(v11 + 8) >> 12);
  }
  else
  {
    RtlClearBits(v21, v18, (unsigned int)v14 >> 12);
    SetBits = RtlFindSetBits(v21, 1ui64, v18);
    v23 = *(_DWORD *)(v17 + P2 + 896);
    if( SetBits == -1 )
    {
      *(_DWORD *)(v17 + P2 + 896) = v23 & ~v20;
    }
    else
    {
      *(_DWORD *)(v17 + P2 + 896) = v20 | v23;
      *(_DWORD *)(v19 + v17 + P2 + 308) = SetBits;
    }
  }
}

Referenced by:

HvFreeCell
HvpDelistFreeCell
HvpDoAllocateCell