PspIumAllocatePartitionState
INT64 __fastcall PspIumAllocatePartitionState(INT64 a1){
VOID *v2;
_MDL *PoolWithTag;
_MDL *v4;
unsigned int v6;
INT64 v7;
int a5;
_MDL *v9;
a5 = 0;
v2 = *(VOID **)(a1 + 16);
PoolWithTag = (_MDL *)ExAllocatePoolWithTag(NonPagedPoolNx, 0xA8ui64, 0x70507549ui64);
v4 = PoolWithTag;
v9 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
LODWORD(PoolWithTag->Next) = 0;
PoolWithTag[1].ByteCount = 0;
HIDWORD(PoolWithTag->Next) = 0;
*(_QWORD *)&PoolWithTag->Size = v2;
PoolWithTag->Process = 0i64;
v6 = *(_DWORD *)(a1 + 24);
if( v6 < 8 )
v6 = 8;
*(_DWORD *)&v4[3].Size = v6;
v4[2].Next = 0i64;
v4[2].Size = 8 * ((((unsigned __int64)((unsigned __int16)v4 & 0xFFF) + 4263) >> 12) + 6);
v4[2].MdlFlags = 0;
v4[2].StartVa = (void *)((unsigned __int64)v4 & 0xFFFFFFFFFFFFF000ui64);
v4[2].ByteOffset = (unsigned __int16)v4 & 0xFFF;
v4[2].ByteCount = 168;
MiProbeAndLockPages((INT64)&v4[2], 0, 1i64);
v7 = MmAllocateSecureKernelPages(v2, *(unsigned int *)&v4[3].Size, 1ui64, 1i64, &a5);
v4[3].Process = (_EPROCESS *)v7;
if( v7 )
{
*(_DWORD *)&v4[3].AllocationProcessorNumber = *(_DWORD *)&v4[3].Size;
if( v2 )
ObfReferenceObjectWithTag(v2, 0x746C6644u);
*(_QWORD *)(a1 + 16) = v4;
*(_QWORD *)(a1 + 24) = v4[3].Next;
return 0i64;
}
else
{
if( (v4[2].MdlFlags & 2) != 0 )
MmUnlockPages(v4 + 2);
ExFreePoolWithTag(v4, 0);
return 3221225626i64;
}
}Referenced by:
PsDispatchIumService