MiReleaseDriverPtes

VOID __stdcall MiReleaseDriverPtes(UINT64 SessionImage, _MMPTE *PointerPte, UINT64 ExactPtes){
  __int64 v3; 
  __int64 v5; 
  _ETHREAD *CurrentThread; 
  __int64 v7; 
  _RTL_BITMAP *v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  _RTL_BITMAP *v11; 
  unsigned __int64 Buffer; 
  __int64 v13; 
  void *v14; 
  __int64 v15; 
  int v16; 
  unsigned __int64 NumberToClear; 
  unsigned __int64 StartingIndex; 

  v16 = SessionImage;
  v3 = (unsigned int)ExactPtes;
  v5 = (unsigned int)SessionImage;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = (_QWORD)MmGetPteBase() << 25;
  v8 = 0i64;
  v9 = 0i64;
  v10 = (((_QWORD)PointerPte << 25) - v7) >> 16;
  MiLockDriverMappings(CurrentThread);
  v15 = v5;
  v11 = (_RTL_BITMAP *)*(&qword_140C4CA70 + v5);
  if( !v11 )
    goto LABEL_16;
  do
  {
    Buffer = (unsigned __int64)v11->Buffer;
    if( (unsigned __int64)PointerPte >= Buffer )
    {
      v9 = (-(__int64)((*(&v11[2].SizeOfBitMap + 1) & 1) != 0) & 0xFFFFFFFFFFFFFFF1ui64) + 16;
      if( (unsigned __int64)PointerPte < Buffer + 8 * v9 * v11[1].SizeOfBitMap )
        break;
    }
    v8 = v11;
    v11 = *(_RTL_BITMAP **)&v11->SizeOfBitMap;
  }
  while( v11 );
  if( !v11 )
LABEL_16:
    KeBugCheckEx(0x1Au, (PVOID)0x2102, (PVOID)v10, (PVOID)(unsigned int)((_DWORD)v3 << 12), 0i64);
  NumberToClear = (~(v9 - 1) & (v9 + v3 - 1)) / v9;
  StartingIndex = (((char *)PointerPte - (char *)v11->Buffer) >> 3) / v9;
  if( !RtlAreBitsSet(v11 + 1, (unsigned int)StartingIndex, (unsigned int)NumberToClear) )
    KeBugCheckEx(0x1Au, (PVOID)0x2103, (PVOID)v10, (PVOID)(unsigned int)((_DWORD)v3 << 12), 0i64);
  if( (*(&v11[2].SizeOfBitMap + 1) & 2) != 0
    || (RtlClearBits(v11 + 1, StartingIndex, NumberToClear), !RtlNumberOfSetBits((UINT64 *)&v11[1].SizeOfBitMap)) )
  {
    v13 = (((__int64)v11->Buffer << 25) - v7) >> 16;
    MiReturnSystemVa(
      (VOID *)v13,
      (VOID *)(v13 + (((unsigned int)v9 * v11[1].SizeOfBitMap) << 12)),
      (_MI_SYSTEM_VA_TYPE)(12 - (v16 != 0)),
      0i64);
    v14 = *(void **)&v11->SizeOfBitMap;
    if( v8 )
      *(_QWORD *)&v8->SizeOfBitMap = v14;
    else
      *(&qword_140C4CA70 + v15) = v14;
    MiUnlockDriverMappings(CurrentThread);
    ExFreePoolWithTag(v11, 0);
  }
  else
  {
    MiUnlockDriverMappings(CurrentThread);
  }
}

Referenced by:

MiReleaseSystemImageVa
MiReturnSystemImageAddress
MmUnmapLockedRestartPages