SepCreateSidValuesBlock

NTSTATUS __stdcall SepCreateSidValuesBlock(
        _SEP_SID_VALUES_BLOCK **SidValues,
        _SID_AND_ATTRIBUTES *User,
        UINT64 GroupCount,
        _SID_AND_ATTRIBUTES *Groups,
        UINT64 GroupsLength,
        UINT64 IntegrityLevelIndexInGroups){
  unsigned int v6; 
  _SEP_SID_VALUES_BLOCK **v9; 
  unsigned int v11; 
  int v12; 
  unsigned int v13; 
  VOID **PoolWithTag; 
  VOID **v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned __int8 *v18; 
  unsigned __int8 *Sid; 
  __int64 v20; 
  VOID **v21; 

  v6 = GroupCount;
  v9 = SidValues;
  if( !SidValues )
    return -1073741811;
  *SidValues = 0i64;
  v11 = v6;
  v12 = GroupsLength;
  if( (unsigned int)IntegrityLevelIndexInGroups < v6 )
  {
    _mm_lfence();
    v11 = v6 - 1;
    v12 = GroupsLength - 4 * *((unsigned __int8 *)Groups[(unsigned int)IntegrityLevelIndexInGroups].Sid + 1) - 8;
  }
  v13 = (((4 * *((unsigned __int8 *)User->Sid + 1) + 11) & 0xFFFFFFFC) + 27 + ((v12 + 7) & 0xFFFFFFF8)) & 0xFFFFFFFC;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, v13, 1985176915i64);
  v21 = PoolWithTag;
  v15 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  memset(PoolWithTag, 0i64, v13);
  v16 = v6 + 1;
  *(_DWORD *)v15 = v13;
  v17 = 0;
  v15[1] = (VOID *)1;
  v18 = (unsigned __int8 *)(v15 + 3);
  if( !v16 )
    goto LABEL_15;
  do
  {
    if( v17 )
    {
      v20 = v17 - 1;
      if( (_DWORD)v20 == (_DWORD)IntegrityLevelIndexInGroups )
        goto LABEL_13;
      Sid = (unsigned __int8 *)Groups[v20].Sid;
    }
    else
    {
      Sid = (unsigned __int8 *)User->Sid;
    }
    RtlCopySid(4 * (unsigned int)Sid[1] + 8, v18, Sid);
    v18 += (4i64 * v18[1] + 11) & 0xFFFFFFFCi64;
LABEL_13:
    ++v17;
  }
  while( v17 < v16 );
  v15 = v21;
  v9 = SidValues;
LABEL_15:
  *v9 = (_SEP_SID_VALUES_BLOCK *)v15;
  *((_DWORD *)v15 + 4) = v11 + 1;
  return 0;
}

Referenced by:

SepSetTokenUserAndGroups