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