SepLinkLogonSessions

NTSTATUS __stdcall SepLinkLogonSessions(_TOKEN *pAdminToken, VOID *hLUAToken, INT8 PreviousMode){
  _TOKEN *v5; 
  _SEP_LOGON_SESSION_REFERENCES *v6; 
  NTSTATUS v8; 
  int v9; 
  _SEP_LOGON_SESSION_REFERENCES *v10; 
  _SEP_LOGON_SESSION_REFERENCES *LogonSession; 
  _TOKEN *Token; 
  PVOID Object; 
  _SEP_LOGON_SESSION_REFERENCES *ReturnSession; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  PVOID DuplicateToken; 

  Token = 0i64;
  DuplicateToken = 0i64;
  v5 = 0i64;
  ReturnSession = 0i64;
  v6 = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeCreateTokenPrivilege, PreviousMode) )
  {
    v9 = -1073741727;
    goto LABEL_20;
  }
  if( pAdminToken->LogonSession->Token )
    goto LABEL_26;
  Object = 0i64;
  v8 = ObReferenceObjectByHandle(hLUAToken, 0x88ui64, (_OBJECT_TYPE *)SeTokenObjectType, PreviousMode, &Object, 0i64);
  v5 = (_TOKEN *)Object;
  v9 = v8;
  if( v8 < 0 )
  {
LABEL_20:
    if( Token )
      ObfDereferenceObjectWithTag(Token, 0x746C6644ui64);
    if( DuplicateToken )
      ObfDereferenceObjectWithTag(DuplicateToken, 0x746C6644ui64);
    if( v6 )
      SepDeReferenceLogonSessionDirect(v6);
    goto LABEL_15;
  }
  v10 = (_SEP_LOGON_SESSION_REFERENCES *)*((_QWORD *)Object + 27);
  if( v10->Token )
    goto LABEL_26;
  LogonSession = pAdminToken->LogonSession;
  if( LogonSession == v10 )
  {
    LogonSession->Flags |= 4u;
    v9 = 0;
    goto LABEL_15;
  }
  if( pAdminToken->TokenType != TokenPrimary || *((_DWORD *)Object + 48) != 1 )
  {
LABEL_26:
    v9 = -1073741811;
    goto LABEL_20;
  }
  ObjectAttributes.Length = 48;
  memset(&ObjectAttributes.RootDirectory, 0, 20);
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  v9 = SepDuplicateToken(
         pAdminToken,
         &ObjectAttributes,
         0,
         TokenPrimary,
         SecurityAnonymous,
         0,
         0,
         (_TOKEN **)&DuplicateToken);
  if( v9 < 0 )
    goto LABEL_20;
  v9 = SepDuplicateToken(v5, &ObjectAttributes, 0, TokenPrimary, SecurityAnonymous, 0, 0, &Token);
  if( v9 < 0 )
    goto LABEL_20;
  v9 = SepReferenceLogonSession((_LUID *)DuplicateToken + 3, &ReturnSession);
  if( v9 < 0 )
    goto LABEL_18;
  *(_QWORD *)(*((_QWORD *)DuplicateToken + 27) + 48i64) = DuplicateToken;
  *(_LUID *)(*((_QWORD *)DuplicateToken + 27) + 16i64) = Token->LogonSession->LogonId;
  *(_DWORD *)(*((_QWORD *)DuplicateToken + 27) + 32i64) |= 2u;
  Token->LogonSession->Token = Token;
  Token->LogonSession->BuddyLogonId = *(_LUID *)(*((_QWORD *)DuplicateToken + 27) + 8i64);
  Token->LogonSession->Flags |= 4u;
  if( SeTokenLeakTracking )
  {
    SepRemoveTokenLogonSession(Token);
    SepRemoveTokenLogonSession((_TOKEN *)DuplicateToken);
  }
  v9 = SepStopReferencingLogonSession(Token);
  if( v9 < 0 || (v9 = SepStopReferencingLogonSession((_TOKEN *)DuplicateToken), v9 < 0) )
  {
LABEL_18:
    v6 = ReturnSession;
    goto LABEL_20;
  }
LABEL_15:
  if( v5 )
    ObfDereferenceObjectWithTag(v5, 0x746C6644ui64);
  return v9;
}

Referenced by:

NtSetInformationToken