SepSetServerSiloToken

NTSTATUS __stdcall SepSetServerSiloToken(VOID *InToken, _EJOB *DestServerSilo){
  INT64 v2; 
  _ETHREAD *CurrentThread; 
  int v6; 
  signed __int32 v8[10]; 
  _SEP_LOGON_SESSION_REFERENCES *ReturnSession; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  ReturnSession = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite(*((_QWORD *)InToken + 6), 1, v2);
  _InterlockedOr(v8, 0);
  if( (*((_DWORD *)InToken + 50) & 0x20) != 0 )
  {
    v6 = -1073741816;
  }
  else
  {
    v6 = SepReferenceLogonSessionSilo((_LUID *)InToken + 3, DestServerSilo, &ReturnSession);
    if( v6 < 0 )
      goto LABEL_10;
    if( SeTokenLeakTracking )
      SepRemoveTokenLogonSession((_TOKEN *)InToken);
    SepDeReferenceLogonSessionDirect(*((_SEP_LOGON_SESSION_REFERENCES **)InToken + 27));
    *((_QWORD *)InToken + 27) = ReturnSession;
    if( SeTokenLeakTracking )
      SepAddTokenLogonSession((_TOKEN *)InToken);
  }
  if( v6 >= 0 )
    *((_QWORD *)InToken + 7) = ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement);
LABEL_10:
  _InterlockedOr(v8, 0);
  ExReleaseResourceLite(*((PERESOURCE *)InToken + 6));
  KeLeaveCriticalRegion();
  return v6;
}

Referenced by:

SepCopyAnonymousTokenAndSetSilo
SepCopyClientTokenAndSetSilo