IopRemovePageFromPageMap
NTSTATUS __stdcall 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 v12;
unsigned __int64 v13;
UINT64 v14;
unsigned __int64 *v15;
__int64 i;
unsigned __int64 v17;
unsigned __int64 v18;
v5 = PageFrameIndex;
if( NumberOfPages )
{
SizeOfBitMap = BitMap->SizeOfBitMap;
v9 = PageFrameIndex + NumberOfPages - 1;
if( PageFrameIndex < BitMap->SizeOfBitMap )
{
if( v9 >= SizeOfBitMap )
{
if( !SuccessIfInvalidAddress )
return -1073741503;
v9 = SizeOfBitMap - 1;
NumberOfPages = SizeOfBitMap - PageFrameIndex;
}
if( NumberOfPages )
{
if( MaxAdditionalPageCount )
{
do
{
Buffer = BitMap->Buffer;
v12 = v5 & -(__int64)(v5 < BitMap->SizeOfBitMap);
v13 = BitMap->SizeOfBitMap - 1;
while( 1 )
{
if( v13 - v12 == -1i64 )
goto LABEL_14;
v15 = &Buffer[v12 >> 6];
for( i = ~*v15 | ((1i64 << (v12 & 0x3F)) - 1); i == -1; i = ~*v15 )
{
if( ++v15 > &Buffer[v13 >> 6] )
goto LABEL_14;
}
_BitScanForward64(&v17, ~i);
v14 = v17 + ((v15 - Buffer) << 6);
if( v14 > v13 )
{
LABEL_14:
v14 = -1i64;
}
else if( v14 != -1i64 )
{
break;
}
if( !v12 )
break;
v18 = v5 + 1;
if( v5 + 1 > BitMap->SizeOfBitMap )
v18 = BitMap->SizeOfBitMap;
v13 = v18 - 1;
v12 = 0i64;
}
if( v14 < v5 )
break;
if( v14 == -1i64 )
break;
RtlClearBitsEx((INT64)BitMap, v14, 1ui64);
++*MaxAdditionalPageCount;
v5 = v14 + 1;
}
while( v14 + 1 <= v9 );
}
else
{
RtlClearBitsEx((INT64)BitMap, PageFrameIndex, NumberOfPages);
}
}
}
else if( !SuccessIfInvalidAddress )
{
return -1073741503;
}
}
return 0;
}Referenced by:
IoFreeDumpRange