MiInitializePoolCommitPacket

INT64 __fastcall MiInitializePoolCommitPacket(
        INT64 *a1,
        UINT64 *a2,
        INT64 a3,
        UINT64 a4,
        CHAR a5,
        UINT64 a6,
        INT64 a7,
        INT64 a8){
  INT64 v8; 
  ULONG_PTR v9; 
  unsigned int ProtectionMask; 
  unsigned int v11; 
  ULONG_PTR v12; 
  unsigned int v13; 
  int v14; 
  __int16 v15; 
  __int64 v16; 
  int v17; 
  INT64 *v18; 
  __int64 v19; 
  __int64 v20; 
  bool v21; 
  INT64 result; 
  INT64 LargePageChain; 
  INT64 PoolPages; 
  UINT64 v25; 
  __int128 v26; 
  __int64 v27; 
  __int128 v28; 
  v8 = *a1;
  v9 = *a2;
  *(_WORD *)(a8 + 78) = 0;
  *(_QWORD *)a8 = v8;
  ProtectionMask = MiMakeProtectionMask((unsigned int)a4);
  if( ProtectionMask > 0x18 || (v14 = 16777298, !_bittest(&v14, ProtectionMask)) )
    KeBugCheckEx(0x1Au, 0x5300ui64, v12, v9, v11);
  *(_QWORD *)(a8 + 16) = 0i64;
  *(_QWORD *)(a8 + 40) = 5i64;
  v15 = 8 * (ProtectionMask & 0x1F);
  *(_WORD *)(a8 + 78) = v15;
  *(_QWORD *)(a8 + 48) = &qword_140C4F380;
  *(_QWORD *)(a8 + 56) = (char *)MmGetPteBase() + (((v12 + v9 - 1) >> 9) & 0x7FFFFFFFF8i64);
  v16 = ((__int64)((((v12 + v9 - 1) >> 9) & 0x7FFFFFFFF8i64) - ((v12 >> 9) & 0x7FFFFFFFF8i64)) >> 3) + 1;
  if( (a5 & 1) != 0 )
  {
    *(_WORD *)(a8 + 78) = v15 | 2;
    if( (a5 & 0x20) != 0 )
    {
      *(_DWORD *)(a8 + 44) = 2;
      v17 = 1;
      v18 = (INT64 *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64) + 256i64);
    }
    else
    {
      v17 = 6;
      v18 = &qword_140C4EFC0;
    }
    v19 = *((unsigned __int16 *)v18 + 87);
    *(_QWORD *)(a8 + 48) = v18;
    v20 = qword_140C4E388;
    *(_DWORD *)(a8 + 40) = v17;
    v21 = (unsigned int)MiChargeCommit(*(_MI_PARTITION **)(v20 + 8 * v19), v16, 1ui64) == 0;
    goto LABEL_7;
  }
  if( (v13 & 0x20000000) == 0 )
  {
    if( a7 )
    {
      *(_QWORD *)(a8 + 16) = a7;
      *(_DWORD *)(a8 + 40) = 15;
      *(_WORD *)(a8 + 78) = v15 | 0x100;
      goto LABEL_8;
    }
    PoolPages = MiGetPoolPages(v13, (unsigned int)a6, v16);
    *(_QWORD *)(a8 + 16) = PoolPages;
    v21 = PoolPages == 0;
LABEL_7:
    if( !v21 )
    {
LABEL_8:
      *(_QWORD *)(a8 + 24) = 0i64;
      result = 0i64;
      *(_QWORD *)(a8 + 8) = v16;
      *(_DWORD *)(a8 + 72) = a6;
      *(_QWORD *)(a8 + 64) = 0i64;
      *(_QWORD *)(a8 + 32) = 0i64;
      return result;
    }
    return 3221225626i64;
  }
  if( (unsigned int)MiObtainPoolCharges(v16, 0i64) )
  {
    LargePageChain = MiGetLargePageChain((unsigned int)a6, v16);
    *(_QWORD *)(a8 + 16) = LargePageChain;
    if( LargePageChain )
    {
      *(_WORD *)(a8 + 78) |= 4u;
      goto LABEL_8;
    }
    v27 = v16;
    v25 = v16;
    v26 = 0i64;
    v28 = 0i64;
    MiReturnPoolCharges(&v25, 0i64);
  }
  return 3221225626i64;
}

Referenced by:

MmAllocatePoolMemory
MmAllocateSecurePoolMemory