SepDuplicateTokenUserAndGroups
NTSTATUS __stdcall SepDuplicateTokenUserAndGroups(_TOKEN *ExistingToken, _TOKEN *NewToken){
unsigned int IntegrityLevelIndex;
unsigned int v3;
NTSTATUS v6;
NTSTATUS result;
unsigned int UserAndGroupCount;
__int64 v9;
void *IntegrityLevelSidValue;
VOID *v11;
IntegrityLevelIndex = ExistingToken->IntegrityLevelIndex;
v3 = 0;
v11 = 0i64;
v6 = 0;
if( IntegrityLevelIndex != -1 )
{
result = SepDuplicateSid(ExistingToken->UserAndGroups[IntegrityLevelIndex].Sid, &v11);
v6 = result;
if( result < 0 )
return result;
NewToken->IntegrityLevelSidValue = v11;
}
if( _InterlockedIncrement64(&ExistingToken->TokenSidValues->ReferenceCount) <= 1 )
__fastfail(0xEu);
NewToken->TokenSidValues = ExistingToken->TokenSidValues;
UserAndGroupCount = ExistingToken->UserAndGroupCount;
NewToken->UserAndGroupCount = UserAndGroupCount;
if( UserAndGroupCount )
{
do
{
v9 = v3;
if( v3 == IntegrityLevelIndex )
IntegrityLevelSidValue = NewToken->IntegrityLevelSidValue;
else
IntegrityLevelSidValue = ExistingToken->UserAndGroups[v3].Sid;
NewToken->UserAndGroups[v3++].Sid = IntegrityLevelSidValue;
NewToken->UserAndGroups[v9].Attributes = ExistingToken->UserAndGroups[v9].Attributes;
}
while( v3 < NewToken->UserAndGroupCount );
}
return v6;
}Referenced by:
SepDuplicateToken
SepFilterToken