PspIumAllocatePhysicalPages

INT64 __fastcall PspIumAllocatePhysicalPages(INT64 a1, VOID *a2, UINT64 a3, INT64 *a4, _DWORD *a5){
  int v6; 
  INT64 SecureKernelPages; 
  unsigned int v8; 
  struct _MDL *v9; 
  INT64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  UINT8 *v14; 
  UINT8 *v15; 
  struct _MDL MemoryDescriptorList; 
  INT64 v17; 
  v17 = 0i64;
  v6 = a1;
  memset(&MemoryDescriptorList, 0, sizeof(MemoryDescriptorList));
  SecureKernelPages = MmAllocateSecureKernelPages(a2, (unsigned int)(a1 + 1), a3, 0i64, a5);
  v8 = 0;
  v9 = (struct _MDL *)SecureKernelPages;
  if( !SecureKernelPages )
    return 3221225495i64;
  if( v6 )
  {
    v12 = *(_DWORD *)(SecureKernelPages + 40);
    *(_DWORD *)&MemoryDescriptorList.Size = 131128;
    MemoryDescriptorList.StartVa = 0i64;
    *(_QWORD *)&MemoryDescriptorList.ByteCount = 4096i64;
    v13 = v12 >> 12;
    v17 = *(_QWORD *)(SecureKernelPages + 8i64 * (v13 - 1) + 48);
    v14 = (UINT8 *)MmMapLockedPagesSpecifyCache(&MemoryDescriptorList, 0, MmCached, 0i64, 0, 0x40000010u);
    v15 = v14;
    if( !v14 )
    {
      MmFreeSecureKernelPages(v9);
      v8 = -1073741670;
      goto LABEL_9;
    }
    memmove(v14, (UINT8 *)v9, 8i64 * v13 + 48);
    *((_DWORD *)v15 + 10) -= 4096;
    MmUnmapLockedPages(v15, &MemoryDescriptorList);
    v11 = v17;
  }
  else
  {
    v11 = *(_QWORD *)(SecureKernelPages + 48);
  }
  *a4 = v11;
LABEL_9:
  ExFreePoolWithTag(v9, 0);
  return v8;
}

Referenced by:

PsDispatchIumService