MiFreeSmallPageFromMdl

NTSTATUS __stdcall MiFreeSmallPageFromMdl(UINT64 PageFrameIndex, UINT64 Flags){
  char v2; 
  signed __int64 v3; 
  _MMPFN *v5; 
  _BOOL8 v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  bool v9; 
  int v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  _QWORD *v13; 
  unsigned __int64 v14; 
  UINT64 BitsMustBeChanged; 
  UINT64 BitsMustBeChangeda; 
  UINT64 v18; 

  v2 = Flags;
  v3 = 48 * PageFrameIndex;
  v5 = &MmGetPfnDb()[PageFrameIndex];
  v6 = 0i64;
  v7 = MiLockPageInline(v5);
  LODWORD(BitsMustBeChanged) = 0;
  v8 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v5->u4._bf_0 >> 39) & 0x3FF));
  MiUpdateLargePageBitMap(v8, PageFrameIndex, 1ui64, 0i64, BitsMustBeChanged);
  v5->u2._bf_0 &= 0xC000000000000000ui64;
  v9 = v5->u3.ReferenceCount == 2;
  v5->u3.ReferenceCount -= 2;
  if( v9 )
  {
    LOBYTE(v10) = MiIsPfnFromSlabAllocation((INT64)v5);
    if( !v10 )
      v6 = (*((_BYTE *)&v5->u3 + 3) & 0x40) == 0;
    if( (v2 & 1) != 0 )
    {
      v12 = 1i64;
      *((_BYTE *)&v5->u3 + 2) &= ~0x10u;
    }
    else
    {
      v13 = (_QWORD *)*(&stru_140C4DB30 + 530);
      if( *(&stru_140C4DB30 + 530) && (((unsigned __int64)v5->u4._bf_0 >> 60) & 7) == 1 )
      {
        v14 = v3 / 48;
        while( v13 )
        {
          v11 = v13[3];
          if( v14 < v11 )
          {
            v13 = (_QWORD *)*v13;
          }
          else
          {
            if( v14 - v11 < v13[4] )
            {
              v12 = 256i64;
              goto LABEL_16;
            }
            v13 = (_QWORD *)v13[1];
          }
        }
      }
      v12 = 2i64;
    }
LABEL_16:
    MiInsertPageInFreeOrZeroedList(PageFrameIndex, v12, v11, 0i64, BitsMustBeChangeda, v18);
  }
  else
  {
    *((_BYTE *)&v5->u3 + 2) |= 7u;
    v5->u2._bf_0 |= 0x4000000000000000ui64;
  }
  _InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v7);
  if( v6 )
    MiFreeLargePageCharges(v8, v6);
  return v6;
}

Referenced by:

MiFreeMdlPageRun
MmFreeSecureKernelPages