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