SepCreateSidValuesBlock
INT64 __fastcall 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;
char *PoolWithTag;
char *v15;
unsigned int v16;
unsigned int v17;
unsigned __int8 *v18;
unsigned __int8 *Sid;
__int64 v20;
char *v21;
v6 = GroupCount;
v9 = SidValues;
if( !SidValues )
return 3221225485i64;
*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 = (char *)ExAllocatePoolWithTag(PagedPool, v13, 0x76536553ui64);
v21 = PoolWithTag;
v15 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
memset((INT64)PoolWithTag, 0i64);
v16 = v6 + 1;
*(_DWORD *)v15 = v13;
v17 = 0;
*((_QWORD *)v15 + 1) = 1i64;
v18 = (unsigned __int8 *)(v15 + 24);
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 * 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 0i64;
}Referenced by:
SepSetTokenUserAndGroups