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