MmFreeSecureKernelPages

NTSTATUS __stdcall MmFreeSecureKernelPages(PMDL MemoryDescriptorList){
  int v1; 
  int v2; 
  PMDL v3; 
  UINT64 *v4; 
  unsigned __int64 v5; 
  UINT64 v6; 
  unsigned int v7; 
  char *v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  unsigned int v11; 
  struct _MDL MemoryDescriptorLista; 
  __int64 v15[16]; 
  v2 = v1;
  v3 = MemoryDescriptorList;
  memset((INT64)&MemoryDescriptorLista, 0i64);
  v4 = (UINT64 *)&v3[1];
  v5 = (unsigned __int64)&v3[1] + 8 * ((unsigned __int64)v3->ByteCount >> 12);
  LODWORD(v6) = *(_DWORD *)(*(_QWORD *)(qword_140C4E388
                                      + 8 * ((*((_QWORD *)MmGetPfnDb() + 6 * (__int64)v3[1].Next + 5) >> 39) & 0x3FFi64))
                          + 4i64);
  if( (v6 & 8) != 0 )
  {
    v7 = 0;
    if( (unsigned __int64)v4 < v5 )
    {
      do
      {
        v8 = (char *)MmGetPfnDb() + 48 * *v4;
        if( MiIsPfnFromSlabAllocation((INT64)v8) )
        {
          if( !v2 )
          {
            v9 = (unsigned __int8)MiLockPageInline((INT64)v8);
            *((_QWORD *)v8 + 5) &= 0x8FFFFFFFFFFFFFFFui64;
            _InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v9);
          }
          _InterlockedDecrement64(&qword_140C4DD40);
          LODWORD(v6) = MiFreeSmallPageFromMdl(*v4, 0i64);
        }
        else
        {
          v6 = *v4;
          v10 = v7++;
          v15[v10] = *v4;
          if( v7 == 16 )
          {
            MemoryDescriptorLista.Next = 0i64;
            *(_DWORD *)&MemoryDescriptorLista.Size = 131248;
            MemoryDescriptorLista.StartVa = 0i64;
            *(_QWORD *)&MemoryDescriptorLista.ByteCount = 0x10000i64;
            MmFreePagesFromMdl(&MemoryDescriptorLista);
            v7 = 0;
          }
        }
        ++v4;
      }
      while( (unsigned __int64)v4 < v5 );
      v3 = MemoryDescriptorList;
      if( v7 )
      {
        v11 = v7 << 12;
        MemoryDescriptorLista.Next = 0i64;
        MemoryDescriptorLista.StartVa = 0i64;
        MemoryDescriptorLista.Size = 8 * ((v11 >> 12) + 6);
        MemoryDescriptorLista.MdlFlags = 2;
        MemoryDescriptorLista.ByteOffset = 0;
        MemoryDescriptorLista.ByteCount = v11;
        MmFreePagesFromMdl(&MemoryDescriptorLista);
      }
    }
    v3->MdlFlags &= ~2u;
  }
  else
  {
    MmFreePagesFromMdl(v3);
  }
  return v6;
}

Referenced by:

MmAllocateSecureKernelPages
PspIumAllocatePhysicalPages
PspIumFreePartitionState
PspIumFreePhysicalPages