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