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