MmFreeSecureKernelPages

NTSTATUS __stdcall MmFreeSecureKernelPages(PMDL MemoryDescriptorList){
  int v1; 
  int v2; 
  PMDL v3; 
  UINT64 *v4; 
  unsigned __int64 v5; 
  UINT64 v6; 
  unsigned int v7; 
  _MMPFN *v8; 
  int v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  _BYTE MemoryDescriptorLista[176]; 

  v2 = v1;
  v3 = MemoryDescriptorList;
  memset(MemoryDescriptorLista, 0i64, sizeof(MemoryDescriptorLista));
  v4 = (UINT64 *)&v3[1];
  v5 = (unsigned __int64)&v3[1] + 8 * ((unsigned __int64)v3->ByteCount >> 12);
  LODWORD(v6) = *(_DWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267)
                                      + 8
                                      * (((unsigned __int64)MmGetPfnDb()[(__int64)v3[1].Next].u4._bf_0 >> 39) & 0x3FF))
                          + 4i64);
  if( (v6 & 8) != 0 )
  {
    v7 = 0;
    if( (unsigned __int64)v4 < v5 )
    {
      do
      {
        v8 = &MmGetPfnDb()[*v4];
        LOBYTE(v9) = MiIsPfnFromSlabAllocation((INT64)v8);
        if( v9 )
        {
          if( !v2 )
          {
            v10 = MiLockPageInline(v8);
            v8->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
            _InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v10);
          }
          _InterlockedDecrement64((_QWORD *)&stru_140C4DB30 + 66);
          LODWORD(v6) = MiFreeSmallPageFromMdl(*v4, 0i64);
        }
        else
        {
          v6 = *v4;
          v11 = v7++;
          *(_QWORD *)&MemoryDescriptorLista[8 * v11 + 48] = *v4;
          if( v7 == 16 )
          {
            *(_QWORD *)MemoryDescriptorLista = 0i64;
            *(_DWORD *)&MemoryDescriptorLista[8] = 131248;
            *(_QWORD *)&MemoryDescriptorLista[32] = 0i64;
            *(_QWORD *)&MemoryDescriptorLista[40] = 0x10000i64;
            LODWORD(v6) = (unsigned int)MmFreePagesFromMdl((PMDL)MemoryDescriptorLista);
            v7 = 0;
          }
        }
        ++v4;
      }
      while( (unsigned __int64)v4 < v5 );
      v3 = MemoryDescriptorList;
      if( v7 )
      {
        v12 = v7 << 12;
        *(_QWORD *)MemoryDescriptorLista = 0i64;
        *(_QWORD *)&MemoryDescriptorLista[32] = 0i64;
        *(_WORD *)&MemoryDescriptorLista[8] = 8 * ((v12 >> 12) + 6);
        *(_WORD *)&MemoryDescriptorLista[10] = 2;
        *(_DWORD *)&MemoryDescriptorLista[44] = 0;
        *(_DWORD *)&MemoryDescriptorLista[40] = v12;
        LODWORD(v6) = (unsigned int)MmFreePagesFromMdl((PMDL)MemoryDescriptorLista);
      }
    }
    v3->MdlFlags &= ~2u;
  }
  else
  {
    LODWORD(v6) = (unsigned int)MmFreePagesFromMdl(v3);
  }
  return v6;
}

Referenced by:

MmAllocateSecureKernelPages
PspIumAllocatePhysicalPages
PspIumFreePartitionState
PspIumFreePhysicalPages