IopRemovePageFromPageMap
VOID __fastcall IopRemovePageFromPageMap(
_RTL_BITMAP_EX *BitMap,
UINT64 *MaxAdditionalPageCount,
UINT64 PageFrameIndex,
UINT64 NumberOfPages,
UINT8 SuccessIfInvalidAddress){
unsigned __int64 v5;
unsigned __int64 SizeOfBitMap;
UINT64 v9;
unsigned __int64 *Buffer;
unsigned __int64 v11;
unsigned __int64 v12;
UINT64 v13;
unsigned __int64 *v14;
__int64 i;
unsigned __int64 v16;
unsigned __int64 v17;
v5 = PageFrameIndex;
if( NumberOfPages )
{
SizeOfBitMap = BitMap->SizeOfBitMap;
v9 = PageFrameIndex + NumberOfPages - 1;
if( PageFrameIndex < BitMap->SizeOfBitMap )
{
if( v9 >= SizeOfBitMap )
{
if( !SuccessIfInvalidAddress )
return;
v9 = SizeOfBitMap - 1;
NumberOfPages = SizeOfBitMap - PageFrameIndex;
}
if( NumberOfPages )
{
if( MaxAdditionalPageCount )
{
do
{
Buffer = BitMap->Buffer;
v11 = v5 & -(__int64)(v5 < BitMap->SizeOfBitMap);
v12 = BitMap->SizeOfBitMap - 1;
while( 1 )
{
if( v12 - v11 == -1i64 )
goto LABEL_12;
v14 = &Buffer[v11 >> 6];
for( i = ~*v14 | ((1i64 << (v11 & 0x3F)) - 1); i == -1; i = ~*v14 )
{
if( ++v14 > &Buffer[v12 >> 6] )
goto LABEL_12;
}
_BitScanForward64(&v16, ~i);
v13 = v16 + ((v14 - Buffer) << 6);
if( v13 > v12 )
{
LABEL_12:
v13 = -1i64;
}
else if( v13 != -1i64 )
{
break;
}
if( !v11 )
break;
v17 = v5 + 1;
if( v5 + 1 > BitMap->SizeOfBitMap )
v17 = BitMap->SizeOfBitMap;
v12 = v17 - 1;
v11 = 0i64;
}
if( v13 < v5 )
break;
if( v13 == -1i64 )
break;
RtlClearBitsEx(BitMap, v13, 1ui64);
++*MaxAdditionalPageCount;
v5 = v13 + 1;
}
while( v13 + 1 <= v9 );
}
else
{
RtlClearBitsEx(BitMap, PageFrameIndex, NumberOfPages);
}
}
}
}
}Referenced by:
IoFreeDumpRange