PspIumFreePhysicalPages
VOID __fastcall PspIumFreePhysicalPages(INT64 a1, INT64 a2, UINT64 a3){
unsigned __int8 v4;
UINT64 v5;
PVOID v6;
unsigned __int8 v7;
void *v8;
struct _MDL MemoryDescriptorList;
__int64 v10[2];
MemoryDescriptorList.Next = 0i64;
MemoryDescriptorList.ByteOffset = 0;
v10[0] = a3;
memset(&MemoryDescriptorList.AllocationProcessorNumber, 0, 28);
v4 = 0;
*(_DWORD *)&MemoryDescriptorList.Size = 131128;
MemoryDescriptorList.ByteCount = 4096;
v6 = MmMapLockedPagesSpecifyCache(&MemoryDescriptorList, 0, MmCached, 0i64, 0, 0x40000020u);
if( !v6 )
{
KeAcquireSpinLockRaiseToDpc(&PspIumFreeMappingLock, v5);
v4 = v7;
LODWORD(v8) = MmMapLockedPagesWithReservedMapping(
PspIumFreeMapping,
0x466D7356ui64,
&MemoryDescriptorList,
MmCached);
v6 = v8;
}
if( *((_DWORD *)v6 + 10) )
{
if( a1 )
PspIumFreePartitionPages(
a1,
(*((_DWORD *)v6 + 10) >> 12) + (unsigned int)((*((_DWORD *)v6 + 10) & 0xFFF) != 0),
(UINT64 *)v6 + 6);
else
MmFreeSecureKernelPages((PMDL)v6);
}
if( v6 == PspIumFreeMapping )
{
MmUnmapReservedMapping(v6, 0x466D7356u, &MemoryDescriptorList);
KxReleaseSpinLock(&PspIumFreeMappingLock);
__writecr8(v4);
}
else
{
MmUnmapLockedPages(v6, &MemoryDescriptorList);
}
if( a1 )
PspIumFreePartitionPages(a1, 1i64, (UINT64 *)v10);
else
MmFreeSecureKernelPages(&MemoryDescriptorList);
}Referenced by:
PsDispatchIumService