EtwTraceAppStateChange

VOID __stdcall EtwTraceAppStateChange(_EPROCESS *Process, _PS_TELEMETRY_APP_STATE_UPDATE_INFO *UpdateInfo){
  unsigned __int64 v4; 
  unsigned __int64 NewUnbiasedUptime; 
  unsigned __int64 v6; 
  char NewAppState; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  unsigned int ReadOperationCount; 
  unsigned int WriteOperationCount; 
  _ETW_APPSTATE_PROCESS_TERMINATE_METRICS *p_AggregateProcessTerminateMetrics; 
  char v15; 
  char v16; 
  VOID *v17; 
  UINT64 ProcessInfoFlags; 
  _ETW_OTHER_PROCESS_INFO OtherInfo; 
  _UNICODE_STRING CommandLine; 
  _EPROCESS_VALUES Values; 
  _ETW_APPSTATE_PROCESS_TERMINATE_METRICS AggregateProcessTerminateMetrics; 
  char StateChangeInfo[98]; 
  _KAPC_STATE ApcState; 
  char PackageInfo[408]; 

  memset(StateChangeInfo, 0i64, sizeof(StateChangeInfo));
  memset(&AggregateProcessTerminateMetrics, 0, sizeof(AggregateProcessTerminateMetrics));
  if( *(&stru_140C00F40 + 1806) && tlgKeywordOn((__int64)&stru_140C00F40 + 7224, 0x600000000001i64) )
  {
    EtwpInitStateChangeInfo(Process, (_ETW_APPSTATE_CHANGE_INFO *)StateChangeInfo);
    v4 = UpdateInfo->CurrentTime - UpdateInfo->LastUpdateTime;
    NewUnbiasedUptime = UpdateInfo->NewUnbiasedUptime;
    v6 = UpdateInfo->CurrentTime - Process->CreateInterruptTime;
    NewAppState = UpdateInfo->NewAppState;
    StateChangeInfo[1] = UpdateInfo->LastAppState;
    v8 = v4;
    StateChangeInfo[0] = NewAppState;
    v9 = NewUnbiasedUptime - UpdateInfo->LastUnbiasedUptime;
    *(_QWORD *)&StateChangeInfo[41] = v8 / 0x2710;
    *(_QWORD *)&StateChangeInfo[49] = v9 / 0x2710;
    *(_QWORD *)&StateChangeInfo[57] = v6 / 0x2710;
    *(_QWORD *)&StateChangeInfo[65] = NewUnbiasedUptime / 0x2710;
    *(_QWORD *)&StateChangeInfo[73] = UpdateInfo->TotalFrozenTime / 0x2710;
    if( NewAppState == 3 )
    {
      memset(&Values, 0i64, sizeof(Values));
      PsQueryStatisticsProcess(Process, &Values);
      AggregateProcessTerminateMetrics.HandleCount = ObGetProcessHandleCount((_EX_RUNDOWN_REF *)Process, 0i64);
      v10 = -1;
      v11 = -1;
      AggregateProcessTerminateMetrics.CommitCharge = Process->CommitCharge << 12;
      AggregateProcessTerminateMetrics.CommitChargePeak = Process->CommitChargePeak << 12;
      ReadOperationCount = -1;
      if( Values.ReadOperationCount < 0xFFFFFFFFi64 )
        ReadOperationCount = Values.ReadOperationCount;
      AggregateProcessTerminateMetrics.ReadCount = ReadOperationCount;
      WriteOperationCount = -1;
      if( Values.WriteOperationCount < 0xFFFFFFFFi64 )
        WriteOperationCount = Values.WriteOperationCount;
      AggregateProcessTerminateMetrics.WriteCount = WriteOperationCount;
      if( Values.ReadTransferCount / 1024 < 0xFFFFFFFFi64 )
        v11 = Values.ReadTransferCount / 1024;
      AggregateProcessTerminateMetrics.ReadSizeInKB = v11;
      if( Values.WriteTransferCount / 1024 < 0xFFFFFFFFi64 )
        v10 = Values.WriteTransferCount / 1024;
      AggregateProcessTerminateMetrics.WriteSizeInKB = v10;
      AggregateProcessTerminateMetrics.CycleCount = Values.CycleTime;
      EtwpWriteAppStateChangeWithStats(
        Process,
        (_ETW_APPSTATE_CHANGE_INFO *)StateChangeInfo,
        &AggregateProcessTerminateMetrics);
      p_AggregateProcessTerminateMetrics = &AggregateProcessTerminateMetrics;
    }
    else
    {
      EtwpWriteAppStateChange((_ETW_APPSTATE_CHANGE_INFO *)StateChangeInfo);
      p_AggregateProcessTerminateMetrics = 0i64;
    }
    if( *(&stru_140C00F40 + 1806) && tlgKeywordOn((__int64)&stru_140C00F40 + 7224, 0x400000000000i64) )
    {
      memset(PackageInfo, 0i64, sizeof(PackageInfo));
      OtherInfo = 0i64;
      LODWORD(ProcessInfoFlags) = 0;
      CommandLine = 0i64;
      v15 = 0;
      v16 = 1;
      memset(&ApcState, 0, sizeof(ApcState));
      if( KeGetCurrentThread()->ApcState.Process != Process )
      {
        if( ExAcquireRundownProtection(&Process->RundownProtect) )
        {
          KiStackAttachProcess(Process, 0i64, &ApcState);
          v15 = 1;
        }
        else
        {
          v16 = 0;
        }
      }
      v17 = PsReferencePrimaryToken(Process);
      EtwpQueryTokenPackageInfo(v17, (_ETW_PACKAGE_IDENTITY *)PackageInfo, &ProcessInfoFlags);
      ObFastDereferenceObject(&Process->Token, v17);
      if( v16 )
      {
        if( Process->Peb && EtwpAppStateChangeSummaryShouldLogCommandLine(Process) )
          EtwpQueryProcessCommandLine(Process, &CommandLine);
        EtwpQueryProcessOtherInfo(Process, &OtherInfo);
      }
      if( v15 )
      {
        KiUnstackDetachProcess(&ApcState, 0i64);
        ExReleaseRundownProtection(&Process->RundownProtect);
      }
      EtwpWriteAppStateChangeSummary(
        Process,
        (_ETW_APPSTATE_CHANGE_INFO *)StateChangeInfo,
        p_AggregateProcessTerminateMetrics,
        (_ETW_PACKAGE_IDENTITY *)PackageInfo,
        &OtherInfo,
        &CommandLine,
        (_ETW_PACKAGE_IDENTITY *)ProcessInfoFlags);
      if( CommandLine.Buffer )
        ExFreePoolWithTag(CommandLine.Buffer, 0);
    }
  }
}

Referenced by:

PsSetProcessTelemetryAppState