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