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