SepNewTokenAsRestrictedAsProcessToken
INT64 __stdcall SepNewTokenAsRestrictedAsProcessToken(
_TOKEN *NewToken,
_TOKEN *ProcessToken,
UINT8 *NewTokenAsRestrictedAsProcessToken){
unsigned int TokenFlags;
unsigned int UserAndGroupCount;
int v7;
_SID_AND_ATTRIBUTES *UserAndGroups;
unsigned int v10;
int v11;
void *v12;
_SID_AND_ATTRIBUTES *v13;
unsigned int v14;
int v15;
unsigned int RestrictedSidCount;
unsigned int v17;
_SID_AND_ATTRIBUTES *RestrictedSids;
void *Sid;
void *v20;
*NewTokenAsRestrictedAsProcessToken = 0;
TokenFlags = ProcessToken->TokenFlags;
if( ((TokenFlags & 0x800) == 0 || (NewToken->TokenFlags & 0x800) != 0)
&& (!SeTokenIsRestricted(ProcessToken) || SeTokenIsRestricted(NewToken))
&& (!SeTokenIsWriteRestricted(ProcessToken) || SeTokenIsWriteRestricted(NewToken))
&& (!SeTokenIsRestricted(ProcessToken) || ProcessToken->RestrictedSidCount >= NewToken->RestrictedSidCount)
&& (~ProcessToken->Privileges.Enabled & NewToken->Privileges.Enabled) == 0
&& (~ProcessToken->Privileges.Present & NewToken->Privileges.Present) == 0
&& (~TokenFlags & NewToken->TokenFlags & 0x1000) == 0 )
{
if( SeTokenIsRestricted(ProcessToken) && (v14 = NewToken->RestrictedSidCount, v15 = 0, v14) )
{
RestrictedSidCount = ProcessToken->RestrictedSidCount;
while( 1 )
{
v17 = 0;
if( RestrictedSidCount )
{
RestrictedSids = ProcessToken->RestrictedSids;
Sid = NewToken->RestrictedSids[v15].Sid;
do
{
if( RtlEqualSid(Sid, RestrictedSids[v17].Sid) )
break;
++v17;
}
while( v17 < RestrictedSidCount );
}
if( v17 == RestrictedSidCount )
break;
if( ++v15 >= v14 )
goto LABEL_10;
}
}
else
{
LABEL_10:
UserAndGroupCount = ProcessToken->UserAndGroupCount;
v7 = 0;
if( !UserAndGroupCount )
{
LABEL_14:
*NewTokenAsRestrictedAsProcessToken = 1;
return 0i64;
}
UserAndGroups = ProcessToken->UserAndGroups;
while( 1 )
{
if( (UserAndGroups[v7].Attributes & 0x10) != 0 )
{
v10 = NewToken->UserAndGroupCount;
v11 = 0;
if( v10 )
{
v12 = UserAndGroups[v7].Sid;
v13 = NewToken->UserAndGroups;
v20 = v12;
while( !RtlEqualSid(v12, v13[v11].Sid) )
{
v12 = v20;
if( ++v11 >= v10 )
goto LABEL_13;
}
if( (v13[v11].Attributes & 0x10) == 0 )
break;
}
}
LABEL_13:
if( ++v7 >= UserAndGroupCount )
goto LABEL_14;
}
}
}
return 3221225569i64;
}Referenced by:
NtDuplicateToken
SepFilterToken