PsSetProcessTelemetryAppState

UINT64 __stdcall PsSetProcessTelemetryAppState(_EPROCESS *Process, _PS_TELEMETRY_APP_STATE NewState){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *p_ProcessLock; 
  unsigned int v6; 
  unsigned __int64 v7; 
  unsigned __int64 bf_920; 
  _PS_DEEP_FREEZE_STATS DeepFreezeStats; 
  _PS_TELEMETRY_APP_STATE_UPDATE_INFO UpdateInfo; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  p_ProcessLock = &Process->ProcessLock;
  memset(&DeepFreezeStats, 0, sizeof(DeepFreezeStats));
  memset(&UpdateInfo, 0, sizeof(UpdateInfo));
  while( 1 )
  {
    PsGetProcessDeepFreezeStats(Process, &DeepFreezeStats);
    v6 = 0;
    v7 = DeepFreezeStats.CurrentUnbiasedTime
       - DeepFreezeStats.TotalFrozenUnbiasedTime
       - Process->CreateUnbiasedInterruptTime;
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(p_ProcessLock, 0i64);
    bf_920 = Process->_bf_920;
    if( bf_920 >> 61 != 3 && Process->LastAppStateUpdateTime <= DeepFreezeStats.CurrentTime )
    {
      UpdateInfo.LastUpdateTime = Process->LastAppStateUpdateTime;
      UpdateInfo.LastAppState = bf_920 >> 61;
      UpdateInfo.LastUnbiasedUptime = bf_920 & 0x1FFFFFFFFFFFFFFFi64;
      if( NewState == PsTelemetryAppStateHeartbeat && bf_920 >> 61 == 1 )
        NewState = PsTelemetryAppStateHeartbeatSuspended;
      Process->LastAppStateUpdateTime = DeepFreezeStats.CurrentTime;
      Process->_bf_920 = v7 & 0x1FFFFFFFFFFFFFFFi64 | ((__int64)(int)NewState << 61);
      v6 = 1;
    }
    if( (_InterlockedExchangeAdd64(&p_ProcessLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(p_ProcessLock);
    KeAbPostRelease(p_ProcessLock);
    KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
    if( (unsigned __int64)Process->_bf_920 >> 61 == 3 )
      break;
    if( v6 )
      goto LABEL_10;
  }
  if( !v6 )
    return v6;
LABEL_10:
  UpdateInfo.CurrentTime = DeepFreezeStats.CurrentTime;
  UpdateInfo.CurrentUnbiasedTime = DeepFreezeStats.CurrentUnbiasedTime;
  UpdateInfo.TotalFrozenTime = DeepFreezeStats.TotalFrozenUnbiasedTime;
  UpdateInfo.NewUnbiasedUptime = v7;
  UpdateInfo.NewAppState = NewState;
  EtwTraceAppStateChange(Process, &UpdateInfo);
  return v6;
}

Referenced by:

EtwpPsProvProcessEnumCallback
PsFreezeProcess
PsSetProcessFaultInformation
PsThawProcess
PspExitProcess