MiClearRangeInPartitionTree
NTSTATUS __stdcall MiClearRangeInPartitionTree(_RTL_BALANCED_NODE **Tree, INT64 a2, UINT64 a3){
UINT64 v3;
INT64 v4;
INT64 v5;
__int64 v7;
UINT64 v8;
_RTL_BITMAP_EX *v9;
unsigned __int64 v10;
unsigned __int64 v11;
_RTL_BITMAP_EX *v12;
UINT64 v13;
unsigned __int64 SizeOfBitMap;
unsigned __int64 *Buffer;
unsigned __int64 v16;
unsigned __int64 *v17;
bool v18;
bool i;
v3 = a3;
v4 = a2 & 0x7FFFFFFFFFFC0000i64;
v5 = a2;
v7 = a2 - (a2 & 0x7FFFFFFFFFFC0000i64);
v8 = (v7 + a3 + 0x3FFFF) >> 18;
if( v8 )
{
while( 1 )
{
v9 = (_RTL_BITMAP_EX *)*Tree;
if( *Tree )
{
v10 = v4 & 0x7FFFFFFFFFFFFFFFi64;
do
{
v11 = (__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64;
if( v10 < v11 )
{
v9 = (_RTL_BITMAP_EX *)v9->SizeOfBitMap;
}
else
{
if( v10 <= v11 )
break;
v9 = (_RTL_BITMAP_EX *)v9->Buffer;
}
}
while( v9 );
}
v12 = v9 + 2;
v13 = v3;
if( ((unsigned __int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64) - v5 + 0x40000 <= v3 )
v13 = ((__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64) - v5 + 0x40000;
RtlClearBitsEx(v9 + 2, v5 - ((__int64)v9[1].Buffer & 0x7FFFFFFFFFFFFFFFi64), v13);
SizeOfBitMap = v12->SizeOfBitMap;
if( !v12->SizeOfBitMap )
goto LABEL_24;
if( SizeOfBitMap <= 1 )
break;
Buffer = v9[2].Buffer;
v16 = *Buffer;
v17 = &Buffer[(SizeOfBitMap - 1) >> 6];
if( Buffer != v17 )
{
for( i = v16 == 0; i; i = *Buffer == 0 )
{
if( ++Buffer == v17 )
{
v18 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)SizeOfBitMap - 1)) & *Buffer) == 0;
goto LABEL_22;
}
}
goto LABEL_24;
}
v18 = (v16 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)SizeOfBitMap))) == 0;
LABEL_22:
if( v18 )
goto LABEL_23;
LABEL_24:
v5 += v13;
v7 = (v4 ^ (v4 + 0x40000)) & 0x7FFFFFFFFFFFFFFFi64;
v3 -= v13;
v4 ^= v7;
if( !--v8 )
return v7;
}
if( _bittest64((const signed __int64 *)v9[2].Buffer, 0) )
goto LABEL_24;
LABEL_23:
RtlAvlRemoveNode((UINT64 *)Tree, (INT64 *)v9);
ExFreePoolWithTag(v9[2].Buffer, 0);
ExFreePoolWithTag(v9, 0);
goto LABEL_24;
}
return v7;
}Referenced by:
MiAddMdlToPartitionTree