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