SepTokenFromAccessInformation
VOID __stdcall SepTokenFromAccessInformation(_TOKEN_ACCESS_INFORMATION *AccessInformation, _TOKEN *Token){
_TOKEN_TYPE TokenType;
_TOKEN_PRIVILEGES *Privileges;
unsigned int v6;
unsigned int PrivilegeCount;
unsigned int *p_Attributes;
__int64 v9;
int v10;
unsigned int v11;
void *PackageSid;
void *TrustLevelSid;
unsigned int Flags;
unsigned int UserAndGroupCount;
unsigned int *v16;
memset(Token, 0i64, sizeof(_TOKEN));
Token->AuthenticationId = AccessInformation->AuthenticationId;
TokenType = AccessInformation->TokenType;
Token->TokenType = TokenType;
if( TokenType == TokenImpersonation )
Token->ImpersonationLevel = AccessInformation->ImpersonationLevel;
Privileges = AccessInformation->Privileges;
v6 = 0;
PrivilegeCount = Privileges->PrivilegeCount;
Token->Privileges.Present = 0i64;
Token->Privileges.Enabled = 0i64;
Token->Privileges.EnabledByDefault = 0i64;
if( PrivilegeCount )
{
p_Attributes = &Privileges->Privileges[0].Attributes;
v9 = PrivilegeCount;
do
{
v10 = *(p_Attributes - 2);
if( (unsigned int)(v10 - 2) <= 0x22 )
{
Token->Privileges.Present |= 1i64 << v10;
v11 = *p_Attributes;
if( (*p_Attributes & 2) != 0 )
{
Token->Privileges.Enabled |= 1i64 << v10;
v11 = *p_Attributes;
}
if( (v11 & 1) != 0 )
Token->Privileges.EnabledByDefault |= 1i64 << v10;
}
p_Attributes += 3;
--v9;
}
while( v9 );
}
Token->UserAndGroupCount = AccessInformation->SidHash->SidCount;
Token->UserAndGroups = AccessInformation->SidHash->SidAttr;
RtlSidHashInitialize(AccessInformation->SidHash->SidAttr, AccessInformation->SidHash->SidCount, &Token->SidHash);
Token->RestrictedSidCount = AccessInformation->RestrictedSidHash->SidCount;
Token->RestrictedSids = AccessInformation->RestrictedSidHash->SidAttr;
RtlSidHashInitialize(
AccessInformation->RestrictedSidHash->SidAttr,
AccessInformation->RestrictedSidHash->SidCount,
&Token->RestrictedSidHash);
Token->CapabilityCount = AccessInformation->CapabilitiesHash->SidCount;
Token->Capabilities = AccessInformation->CapabilitiesHash->SidAttr;
RtlSidHashInitialize(
AccessInformation->CapabilitiesHash->SidAttr,
AccessInformation->CapabilitiesHash->SidCount,
&Token->CapabilitiesHash);
PackageSid = AccessInformation->PackageSid;
if( PackageSid )
Token->Package = PackageSid;
TrustLevelSid = AccessInformation->TrustLevelSid;
if( TrustLevelSid )
Token->TrustLevelSid = TrustLevelSid;
Flags = AccessInformation->Flags;
UserAndGroupCount = Token->UserAndGroupCount;
Token->IntegrityLevelIndex = -1;
Token->TokenFlags = Flags;
Token->MandatoryPolicy = AccessInformation->MandatoryPolicy.Policy;
if( UserAndGroupCount )
{
v16 = &Token->UserAndGroups->Attributes;
do
{
if( (*v16 & 0x40) != 0 && Token->IntegrityLevelIndex == -1 )
Token->IntegrityLevelIndex = v6;
++v6;
v16 += 4;
}
while( v6 < UserAndGroupCount );
}
Token->pSecurityAttributes = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *)AccessInformation->SecurityAttributes;
}Referenced by:
SeAccessCheckFromState
SeQuerySecurityAttributesTokenAccessInformation
SeTokenFromAccessInformation