From 18152753a9a942b874b5ff712691256814bb7759 Mon Sep 17 00:00:00 2001 From: Andrew Whitechapel Date: Fri, 30 Aug 2024 14:03:18 -0700 Subject: [PATCH 1/5] Update Dev Insights to final Dev Diagnostics name --- DevHome.sln | 8 +- .../Strings/en-us/Resources.resw | 12 +- src/DevHome.csproj | 2 +- src/NavConfig.jsonc | 2 +- src/Package-Can.appxmanifest | 10 +- src/Package-Dev.appxmanifest | 10 +- src/Package.appxmanifest | 10 +- src/Program.cs | 2 +- src/Properties/launchsettings.json | 6 +- tools/DevDiagnostics/DD.ico | Bin 0 -> 151604 bytes tools/DevDiagnostics/DD.png | Bin 0 -> 20891 bytes .../TestingScenarios/DevDiagnostics.md | 25 + .../DevHome.DevDiagnostics}/App.config | 140 +- .../Assets/LargeTile.scale-100.png | Bin 0 -> 7196 bytes .../Assets/LargeTile.scale-125.png | Bin 0 -> 9350 bytes .../Assets/LargeTile.scale-150.png | Bin 0 -> 11684 bytes .../Assets/LargeTile.scale-200.png | Bin 0 -> 16871 bytes .../Assets/LargeTile.scale-400.png | Bin 0 -> 44599 bytes .../Assets/SmallTile.scale-100.png | Bin 0 -> 2042 bytes .../Assets/SmallTile.scale-125.png | Bin 0 -> 2699 bytes .../Assets/SmallTile.scale-150.png | Bin 0 -> 3304 bytes .../Assets/SmallTile.scale-200.png | Bin 0 -> 4374 bytes .../Assets/SmallTile.scale-400.png | Bin 0 -> 9600 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 7884 bytes .../Assets/SplashScreen.scale-125.png | Bin 0 -> 9858 bytes .../Assets/SplashScreen.scale-150.png | Bin 0 -> 12563 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 17965 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 49228 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 3362 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 4144 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 5160 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 7161 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 16077 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 716 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 1168 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 17717 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 1583 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 2583 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 716 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 17717 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1583 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2583 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1634 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 2287 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 2891 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 3832 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 7932 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 566 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 824 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1168 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 12692 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1206 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1970 bytes .../Assets/StoreLogo.scale-100.png | Bin 0 -> 2751 bytes .../Assets/StoreLogo.scale-125.png | Bin 0 -> 3454 bytes .../Assets/StoreLogo.scale-150.png | Bin 0 -> 4201 bytes .../Assets/StoreLogo.scale-200.png | Bin 0 -> 5726 bytes .../Assets/StoreLogo.scale-400.png | Bin 0 -> 12054 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 3596 bytes .../Assets/Wide310x150Logo.scale-125.png | Bin 0 -> 4412 bytes .../Assets/Wide310x150Logo.scale-150.png | Bin 0 -> 5573 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 7884 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 17965 bytes .../Contracts/ViewModels/INavigationAware.cs | 2 +- .../Controls/AddToolControl.xaml | 6 +- .../Controls/AddToolControl.xaml.cs | 6 +- .../Controls/ClipboardMonitorControl.xaml | 4 +- .../Controls/ClipboardMonitorControl.xaml.cs | 4 +- .../Controls/DDSeparator.xaml} | 4 +- .../Controls/DDSeparator.xaml.cs} | 6 +- .../Controls/EditToolsControl.xaml | 4 +- .../Controls/EditToolsControl.xaml.cs | 4 +- .../Controls/ExpandedViewControl.xaml | 204 +- .../Controls/ExpandedViewControl.xaml.cs | 4 +- .../Controls/ExternalToolsManagementButton.cs | 4 +- .../Controls/ProcessSelectionButton.cs | 6 +- .../Controls/ProgressTextRing.xaml | 2 +- .../Controls/ProgressTextRing.xaml.cs | 2 +- .../DevHome.DevDiagnostics/DD.ico | Bin 0 -> 151604 bytes .../DevHome.DevDiagnostics/DDApp.xaml} | 130 +- .../DevHome.DevDiagnostics/DDApp.xaml.cs} | 266 +- .../DevHome.DevDiagnostics.csproj} | 479 +-- .../Helpers/ClipboardMonitorInternalTool.cs | 6 +- .../Helpers/CommonHelper.cs | 394 +-- .../Helpers/CommonInterop.cs | 42 +- .../Helpers/CountToVisibilityConverter.cs | 2 +- .../Helpers/DebugMonitor.cs | 306 +- .../Helpers/ETWHelper.cs | 374 +-- .../Helpers/EnumStringConverter.cs | 2 +- .../Helpers/ErrorLookupHelper.cs | 8 +- .../Helpers/EventViewerHelper.cs | 164 +- .../Helpers/ExpanderBehavior.cs | 4 +- .../Helpers/ExternalTool.cs | 626 ++-- .../Helpers/ExternalToolCollection.cs | 2 +- .../Helpers/ExternalTool_v1.cs | 2 +- .../Helpers/ExternalToolsHelper.cs | 600 ++-- .../Helpers/HotKeyHelper.cs | 148 +- .../Helpers/IApplicationActivationManager.cs | 2 +- .../Helpers/InsightsHelper.cs | 14 +- .../Helpers/InternalToolsHelper.cs | 2 +- .../Helpers/RestartManagerHelper.cs | 220 +- .../Helpers/ServicingHelper.cs | 102 +- .../DevHome.DevDiagnostics}/Helpers/Tool.cs | 4 +- .../Helpers/WinLogsHelper.cs | 538 ++-- .../Helpers/WindowHelper.cs | 1540 +++++----- .../Helpers/WindowHooker`1.cs | 172 +- .../DevHome.DevDiagnostics/Images/DD.ico | Bin 0 -> 151604 bytes .../Models/AppRuntimeInfo.cs | 4 +- .../Models/ClipboardContents.cs | 2 +- .../Models/ClipboardMonitor.cs | 374 +-- .../Models/FrameworkType.cs | 2 +- .../DevHome.DevDiagnostics}/Models/Insight.cs | 2 +- .../Models/InstalledAppInfo.cs | 2 +- .../DevHome.DevDiagnostics}/Models/NavLink.cs | 2 +- .../Models/PackageInfo.cs | 2 +- .../Models/PerfCounters.cs | 6 +- .../Models/ProcessModuleInfo.cs | 2 +- .../Models/RestoreState.cs | 2 +- .../DevHome.DevDiagnostics}/Models/Setting.cs | 2 +- .../Models/TargetAppData.cs | 4 +- .../Models/ThemeName.cs | 2 +- .../Models/WERAnalysis.cs | 4 +- .../Models/WERAnalysisReport.cs | 4 +- .../Models/WERAnalyzer.cs | 4 +- .../Models/WERHelper.cs | 4 +- .../Models/WERReport.cs | 2 +- .../Models/WinLogsEntry.cs | 4 +- .../NativeMethods.json | 6 +- .../DevHome.DevDiagnostics}/NativeMethods.txt | 238 +- .../Pages/AboutPage.xaml | 4 +- .../Pages/AboutPage.xaml.cs | 4 +- .../Pages/AdditionalToolsPage.xaml | 4 +- .../Pages/AdditionalToolsPage.xaml.cs | 4 +- .../Pages/AdvancedSettingsPage.xaml | 2 +- .../Pages/AdvancedSettingsPage.xaml.cs | 6 +- .../Pages/AppDetailsPage.xaml | 336 +-- .../Pages/AppDetailsPage.xaml.cs | 56 +- .../Pages/InsightsPage.xaml | 6 +- .../Pages/InsightsPage.xaml.cs | 6 +- .../Pages/ModulesPage.xaml | 156 +- .../Pages/ModulesPage.xaml.cs | 68 +- .../Pages/PreferencesPage.xaml | 2 +- .../Pages/PreferencesPage.xaml.cs | 4 +- .../Pages/ProcessListPage.xaml | 4 +- .../Pages/ProcessListPage.xaml.cs | 6 +- .../Pages/ResourceUsagePage.xaml | 122 +- .../Pages/ResourceUsagePage.xaml.cs | 70 +- .../Pages/SettingsPage.xaml | 6 +- .../Pages/SettingsPage.xaml.cs | 4 +- .../Pages/WERPage.xaml | 4 +- .../Pages/WERPage.xaml.cs | 10 +- .../Pages/WinLogsPage.xaml | 218 +- .../Pages/WinLogsPage.xaml.cs | 78 +- .../DevHome.DevDiagnostics}/Program.cs | 508 ++-- .../PublishProfiles/win-arm64.pubxml | 0 .../Properties/PublishProfiles/win-x64.pubxml | 0 .../Properties/PublishProfiles/win-x86.pubxml | 0 .../Properties/Settings.Designer.cs | 488 ++-- .../Properties/Settings.settings | 126 +- .../Properties/launchSettings.json | 14 +- .../Services/DDAppInfoService.cs} | 6 +- .../Services/DDInsightsService.cs} | 8 +- .../Services/DDNavigationService.cs} | 10 +- .../Services/DDPageService.cs} | 28 +- .../Strings/en-us/Resources.resw | 2564 ++++++++--------- .../Styles/CommandBarStyle.xaml | 6 +- .../Telemetry/FeatureState.cs | 132 +- .../Telemetry/FocusStartEventData.cs | 2 +- .../Telemetry/FocusStopEventData.cs | 2 +- .../Telemetry/LogStateChangedEventData.cs | 2 +- .../Telemetry/TelemetryReporter.cs | 342 +-- .../Telemetry/TimedStartEventBase.cs | 2 +- .../Telemetry/TimedStopEventBase.cs | 2 +- .../Telemetry/UsageEventData.cs | 2 +- .../Telemetry/VisibilityStartEventData.cs | 2 +- .../Telemetry/VisibilityStopEventData.cs | 2 +- .../Telemetry/WindowEventGenerator.cs | 330 +-- .../ViewModels/AboutViewModel.cs | 8 +- .../ViewModels/AdditionalToolsViewModel.cs | 4 +- .../ViewModels/AdvancedSettingsViewModel.cs | 4 +- .../ViewModels/AppDetailsPageViewModel.cs | 6 +- .../ViewModels/BarWindowViewModel.cs | 14 +- .../ClipboardMonitorControlViewModel.cs | 4 +- .../ExpandedViewControlViewModel.cs | 16 +- .../ViewModels/InsightsPageViewModel.cs | 8 +- .../ViewModels/ModulesPageViewModel.cs | 6 +- .../ViewModels/PreferencesViewModel.cs | 8 +- .../ViewModels/ProcessListPageViewModel.cs | 6 +- .../ViewModels/ResourceUsagePageViewModel.cs | 6 +- .../ViewModels/SettingViewModel.cs | 4 +- .../ViewModels/SettingsPageViewModel.cs | 6 +- .../ViewModels/WERPageViewModel.cs | 8 +- .../ViewModels/WinLogsPageViewModel.cs | 20 +- .../Views/BarWindow.xaml | 10 +- .../Views/BarWindow.xaml.cs | 18 +- .../Views/ClipboardMonitoringWindow.xaml | 8 +- .../Views/ClipboardMonitoringWindow.xaml.cs | 4 +- .../Views/PrimaryWindow.xaml | 26 +- .../Views/PrimaryWindow.xaml.cs | 234 +- .../DevHome.DevDiagnostics}/app.manifest | 36 +- .../appsettings_dd.json} | 60 +- .../DevHome.DevDiagnostics}/errors.db | Bin .../DevHome.DevDiagnostics}/errors.db.txt | 0 .../ErrorDBPopulateTool.csproj | 0 .../ErrorDBPopulateTool.sln | 0 .../ErrorDBPopulateTool/HRESULTS.txt | 0 .../ErrorDBPopulateTool/NTStatus.txt | 0 .../ErrorDBPopulateTool/Program.cs | 0 .../ErrorDBPopulateTool/Win32Errors.txt | 0 .../ErrorDBPopulateTool/readme.md | 0 .../TestTools/TestDumpAnalyzer/Program.cs | 0 .../TestDumpAnalyzer/TestDumpAnalyzer.csproj | 0 .../TestDumpAnalyzer/TestDumpAnalyzer.sln | 0 .../TestTools/TestServiceCaller/Program.cs | 0 .../TestServiceCaller.csproj | 0 tools/DevInsights/DI.ico | Bin 158080 -> 0 bytes tools/DevInsights/DI.png | Bin 45430 -> 0 bytes .../TestingScenarios/DevInsights.md | 28 - .../Assets/LargeTile.scale-100.png | Bin 6222 -> 0 bytes .../Assets/LargeTile.scale-125.png | Bin 8623 -> 0 bytes .../Assets/LargeTile.scale-150.png | Bin 11619 -> 0 bytes .../Assets/LargeTile.scale-200.png | Bin 18804 -> 0 bytes .../Assets/LargeTile.scale-400.png | Bin 66451 -> 0 bytes .../Assets/SmallTile.scale-100.png | Bin 1571 -> 0 bytes .../Assets/SmallTile.scale-125.png | Bin 1924 -> 0 bytes .../Assets/SmallTile.scale-150.png | Bin 2370 -> 0 bytes .../Assets/SmallTile.scale-200.png | Bin 3381 -> 0 bytes .../Assets/SmallTile.scale-400.png | Bin 9336 -> 0 bytes .../Assets/SplashScreen.scale-100.png | Bin 6691 -> 0 bytes .../Assets/SplashScreen.scale-125.png | Bin 9008 -> 0 bytes .../Assets/SplashScreen.scale-150.png | Bin 12160 -> 0 bytes .../Assets/SplashScreen.scale-200.png | Bin 19377 -> 0 bytes .../Assets/SplashScreen.scale-400.png | Bin 70558 -> 0 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 2515 -> 0 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 3154 -> 0 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 4034 -> 0 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 6095 -> 0 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 17696 -> 0 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 618 -> 0 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 905 -> 0 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 23261 -> 0 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 1166 -> 0 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 1805 -> 0 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 618 -> 0 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 23261 -> 0 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 1166 -> 0 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 1805 -> 0 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 1235 -> 0 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 1633 -> 0 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 2041 -> 0 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 2767 -> 0 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 7402 -> 0 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 511 -> 0 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 730 -> 0 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 905 -> 0 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 13872 -> 0 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 944 -> 0 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 1474 -> 0 bytes .../Assets/StoreLogo.backup.png | Bin 456 -> 0 bytes .../Assets/StoreLogo.scale-100.png | Bin 1898 -> 0 bytes .../Assets/StoreLogo.scale-125.png | Bin 2531 -> 0 bytes .../Assets/StoreLogo.scale-150.png | Bin 3082 -> 0 bytes .../Assets/StoreLogo.scale-200.png | Bin 4631 -> 0 bytes .../Assets/StoreLogo.scale-400.png | Bin 14362 -> 0 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 2686 -> 0 bytes .../Assets/Wide310x150Logo.scale-125.png | Bin 3437 -> 0 bytes .../Assets/Wide310x150Logo.scale-150.png | Bin 4368 -> 0 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 6691 -> 0 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 19377 -> 0 bytes tools/DevInsights/DevHome.DevInsights/DI.ico | Bin 158080 -> 0 bytes .../DevHome.DevInsights/Images/DI.ico | Bin 158080 -> 0 bytes .../src/Strings/en-us/Resources.resw | 10 +- .../ViewModels/UtilitiesMainPageViewModel.cs | 10 +- uitest/UtilitiesTest.cs | 6 +- 274 files changed, 6821 insertions(+), 6827 deletions(-) create mode 100644 tools/DevDiagnostics/DD.ico create mode 100644 tools/DevDiagnostics/DD.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics.UnitTest/TestingScenarios/DevDiagnostics.md rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/App.config (85%) create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-16.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-24.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-256.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-32.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-48.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-400.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-100.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-125.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-150.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-200.png create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-400.png rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Contracts/ViewModels/INavigationAware.cs (81%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/AddToolControl.xaml (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/AddToolControl.xaml.cs (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ClipboardMonitorControl.xaml (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ClipboardMonitorControl.xaml.cs (80%) rename tools/{DevInsights/DevHome.DevInsights/Controls/DISeparator.xaml => DevDiagnostics/DevHome.DevDiagnostics/Controls/DDSeparator.xaml} (91%) rename tools/{DevInsights/DevHome.DevInsights/Controls/DISeparator.xaml.cs => DevDiagnostics/DevHome.DevDiagnostics/Controls/DDSeparator.xaml.cs} (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/EditToolsControl.xaml (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/EditToolsControl.xaml.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ExpandedViewControl.xaml (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ExpandedViewControl.xaml.cs (91%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ExternalToolsManagementButton.cs (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ProcessSelectionButton.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ProgressTextRing.xaml (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Controls/ProgressTextRing.xaml.cs (98%) create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/DD.ico rename tools/{DevInsights/DevHome.DevInsights/DIApp.xaml => DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml} (97%) rename tools/{DevInsights/DevHome.DevInsights/DIApp.xaml.cs => DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml.cs} (86%) rename tools/{DevInsights/DevHome.DevInsights/DevHome.DevInsights.csproj => DevDiagnostics/DevHome.DevDiagnostics/DevHome.DevDiagnostics.csproj} (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ClipboardMonitorInternalTool.cs (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/CommonHelper.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/CommonInterop.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/CountToVisibilityConverter.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/DebugMonitor.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ETWHelper.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/EnumStringConverter.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ErrorLookupHelper.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/EventViewerHelper.cs (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ExpanderBehavior.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ExternalTool.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ExternalToolCollection.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ExternalTool_v1.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ExternalToolsHelper.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/HotKeyHelper.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/IApplicationActivationManager.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/InsightsHelper.cs (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/InternalToolsHelper.cs (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/RestartManagerHelper.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/ServicingHelper.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/Tool.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/WinLogsHelper.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/WindowHelper.cs (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Helpers/WindowHooker`1.cs (95%) create mode 100644 tools/DevDiagnostics/DevHome.DevDiagnostics/Images/DD.ico rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/AppRuntimeInfo.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/ClipboardContents.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/ClipboardMonitor.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/FrameworkType.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/Insight.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/InstalledAppInfo.cs (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/NavLink.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/PackageInfo.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/PerfCounters.cs (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/ProcessModuleInfo.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/RestoreState.cs (91%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/Setting.cs (91%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/TargetAppData.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/ThemeName.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WERAnalysis.cs (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WERAnalysisReport.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WERAnalyzer.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WERHelper.cs (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WERReport.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Models/WinLogsEntry.cs (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/NativeMethods.json (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/NativeMethods.txt (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AboutPage.xaml (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AboutPage.xaml.cs (83%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AdditionalToolsPage.xaml (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AdditionalToolsPage.xaml.cs (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AdvancedSettingsPage.xaml (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AdvancedSettingsPage.xaml.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AppDetailsPage.xaml (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/AppDetailsPage.xaml.cs (82%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/InsightsPage.xaml (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/InsightsPage.xaml.cs (84%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ModulesPage.xaml (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ModulesPage.xaml.cs (84%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/PreferencesPage.xaml (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/PreferencesPage.xaml.cs (91%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ProcessListPage.xaml (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ProcessListPage.xaml.cs (85%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ResourceUsagePage.xaml (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/ResourceUsagePage.xaml.cs (84%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/SettingsPage.xaml (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/SettingsPage.xaml.cs (80%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/WERPage.xaml (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/WERPage.xaml.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/WinLogsPage.xaml (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Pages/WinLogsPage.xaml.cs (82%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Program.cs (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/PublishProfiles/win-arm64.pubxml (100%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/PublishProfiles/win-x64.pubxml (100%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/PublishProfiles/win-x86.pubxml (100%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/Settings.Designer.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/Settings.settings (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Properties/launchSettings.json (94%) rename tools/{DevInsights/DevHome.DevInsights/Services/DIAppInfoService.cs => DevDiagnostics/DevHome.DevDiagnostics/Services/DDAppInfoService.cs} (86%) rename tools/{DevInsights/DevHome.DevInsights/Services/DIInsightsService.cs => DevDiagnostics/DevHome.DevDiagnostics/Services/DDInsightsService.cs} (90%) rename tools/{DevInsights/DevHome.DevInsights/Services/DINavigationService.cs => DevDiagnostics/DevHome.DevDiagnostics/Services/DDNavigationService.cs} (94%) rename tools/{DevInsights/DevHome.DevInsights/Services/DIPageService.cs => DevDiagnostics/DevHome.DevDiagnostics/Services/DDPageService.cs} (74%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Strings/en-us/Resources.resw (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Styles/CommandBarStyle.xaml (99%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/FeatureState.cs (94%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/FocusStartEventData.cs (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/FocusStopEventData.cs (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/LogStateChangedEventData.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/TelemetryReporter.cs (85%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/TimedStartEventBase.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/TimedStopEventBase.cs (93%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/UsageEventData.cs (91%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/VisibilityStartEventData.cs (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/VisibilityStopEventData.cs (87%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Telemetry/WindowEventGenerator.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/AboutViewModel.cs (86%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/AdditionalToolsViewModel.cs (90%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/AdvancedSettingsViewModel.cs (90%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/AppDetailsPageViewModel.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/BarWindowViewModel.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/ClipboardMonitorControlViewModel.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/ExpandedViewControlViewModel.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/InsightsPageViewModel.cs (65%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/ModulesPageViewModel.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/PreferencesViewModel.cs (90%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/ProcessListPageViewModel.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/ResourceUsagePageViewModel.cs (96%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/SettingViewModel.cs (90%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/SettingsPageViewModel.cs (95%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/WERPageViewModel.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/ViewModels/WinLogsPageViewModel.cs (92%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/BarWindow.xaml (97%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/BarWindow.xaml.cs (98%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/ClipboardMonitoringWindow.xaml (72%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/ClipboardMonitoringWindow.xaml.cs (80%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/PrimaryWindow.xaml (89%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/Views/PrimaryWindow.xaml.cs (84%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/app.manifest (91%) rename tools/{DevInsights/DevHome.DevInsights/appsettings_di.json => DevDiagnostics/DevHome.DevDiagnostics/appsettings_dd.json} (86%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/errors.db (100%) rename tools/{DevInsights/DevHome.DevInsights => DevDiagnostics/DevHome.DevDiagnostics}/errors.db.txt (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/ErrorDBPopulateTool.csproj (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/ErrorDBPopulateTool.sln (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/HRESULTS.txt (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/NTStatus.txt (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/Program.cs (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/Win32Errors.txt (100%) rename tools/{DevInsights => DevDiagnostics}/ErrorDBPopulateTool/readme.md (100%) rename tools/{DevInsights => DevDiagnostics}/TestTools/TestDumpAnalyzer/Program.cs (100%) rename tools/{DevInsights => DevDiagnostics}/TestTools/TestDumpAnalyzer/TestDumpAnalyzer.csproj (100%) rename tools/{DevInsights => DevDiagnostics}/TestTools/TestDumpAnalyzer/TestDumpAnalyzer.sln (100%) rename tools/{DevInsights => DevDiagnostics}/TestTools/TestServiceCaller/Program.cs (100%) rename tools/{DevInsights => DevDiagnostics}/TestTools/TestServiceCaller/TestServiceCaller.csproj (100%) delete mode 100644 tools/DevInsights/DI.ico delete mode 100644 tools/DevInsights/DI.png delete mode 100644 tools/DevInsights/DevHome.DevInsights.UnitTest/TestingScenarios/DevInsights.md delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/LargeTile.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/LargeTile.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/LargeTile.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/LargeTile.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/LargeTile.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SmallTile.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SmallTile.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SmallTile.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SmallTile.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SmallTile.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SplashScreen.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SplashScreen.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SplashScreen.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SplashScreen.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/SplashScreen.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square150x150Logo.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square150x150Logo.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square150x150Logo.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square150x150Logo.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square150x150Logo.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-unplated_targetsize-16.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-unplated_targetsize-256.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-unplated_targetsize-32.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.altform-unplated_targetsize-48.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-16.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-24.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-256.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-32.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Square44x44Logo.targetsize-48.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.backup.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/StoreLogo.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Wide310x150Logo.scale-100.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Wide310x150Logo.scale-125.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Wide310x150Logo.scale-150.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Wide310x150Logo.scale-200.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/Assets/Wide310x150Logo.scale-400.png delete mode 100644 tools/DevInsights/DevHome.DevInsights/DI.ico delete mode 100644 tools/DevInsights/DevHome.DevInsights/Images/DI.ico diff --git a/DevHome.sln b/DevHome.sln index 1b0603137e..01256fceaa 100644 --- a/DevHome.sln +++ b/DevHome.sln @@ -122,9 +122,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupAgent.Test", "exten EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.HostGuestCommunication", "extensions\HyperVExtension\src\HyperVExtension.HostGuestCommunication\HyperVExtension.HostGuestCommunication.csproj", "{D759CD66-494C-4A00-8075-8B65A9891349}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.DevInsights", "tools\DevInsights\DevHome.DevInsights\DevHome.DevInsights.csproj", "{CAAC0CDF-9AB8-4F43-A3EB-38D785AF5725}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.DevDiagnostics", "tools\DevDiagnostics\DevHome.DevDiagnostics\DevHome.DevDiagnostics.csproj", "{CAAC0CDF-9AB8-4F43-A3EB-38D785AF5725}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevInsights", "DevInsights", "{DB3D0F2C-1A7F-44B4-B408-B21A56212985}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiagnostics", "DevDiagnostics", "{DB3D0F2C-1A7F-44B4-B408-B21A56212985}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Customization", "Customization", "{623998FD-B0A6-4980-95D5-A5072301CA10}" EndProject @@ -181,9 +181,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Devhome.Service.IDL", "serv EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestTools", "TestTools", "{7857275B-7970-4C26-B092-FF62EA890B1E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDumpAnalyzer", "tools\DevInsights\TestTools\TestDumpAnalyzer\TestDumpAnalyzer.csproj", "{29963C5C-4CB6-4406-850A-99503CB87081}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDumpAnalyzer", "tools\DevDiagnostics\TestTools\TestDumpAnalyzer\TestDumpAnalyzer.csproj", "{29963C5C-4CB6-4406-850A-99503CB87081}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestServiceCaller", "tools\DevInsights\TestTools\TestServiceCaller\TestServiceCaller.csproj", "{024CB70C-3449-4204-9171-A25C6C25783D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestServiceCaller", "tools\DevDiagnostics\TestTools\TestServiceCaller\TestServiceCaller.csproj", "{024CB70C-3449-4204-9171-A25C6C25783D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/settings/DevHome.Settings/Strings/en-us/Resources.resw b/settings/DevHome.Settings/Strings/en-us/Resources.resw index 0254cb1f08..f7aa718c2c 100644 --- a/settings/DevHome.Settings/Strings/en-us/Resources.resw +++ b/settings/DevHome.Settings/Strings/en-us/Resources.resw @@ -553,13 +553,13 @@ Quiet background processes allows you to free up resources while developing Inline description of the Quiet background processes experimental feature on the 'Settings -> Experiments' page where you enable it. - - Dev Insights - Name of experimental feature 'Dev Insights' on the 'Settings -> Experiments' page where you enable it. + + Dev Diagnostics + Name of experimental feature 'Dev Diagnostics' on the 'Settings -> Experiments' page where you enable it. - - Dev Insights is a utility to provide deeper insights into your applications - Inline description of the Dev Insights experimental feature on the 'Settings -> Experiments' page where you enable it. + + Dev Diagnostics is a utility to provide deeper insights into your applications + Inline description of the Dev Diagnostics experimental feature on the 'Settings -> Experiments' page where you enable it. Quickstart Playground diff --git a/src/DevHome.csproj b/src/DevHome.csproj index 97bb4cd372..e2c90d5160 100644 --- a/src/DevHome.csproj +++ b/src/DevHome.csproj @@ -95,7 +95,7 @@ - + diff --git a/src/NavConfig.jsonc b/src/NavConfig.jsonc index 63489ecdd1..f714ad61a9 100644 --- a/src/NavConfig.jsonc +++ b/src/NavConfig.jsonc @@ -123,7 +123,7 @@ } }, { - "identity": "DevInsightsExperiment", + "identity": "DevDiagnosticsExperiment", "enabledByDefault": false, "buildTypeOverrides": [ { diff --git a/src/Package-Can.appxmanifest b/src/Package-Can.appxmanifest index 4277a27cb0..96abe39ccf 100644 --- a/src/Package-Can.appxmanifest +++ b/src/Package-Can.appxmanifest @@ -350,19 +350,19 @@ - - + + - + - + - + diff --git a/src/Package-Dev.appxmanifest b/src/Package-Dev.appxmanifest index cb02cfddd0..429345dcd3 100644 --- a/src/Package-Dev.appxmanifest +++ b/src/Package-Dev.appxmanifest @@ -346,19 +346,19 @@ - - + + - + - + - + diff --git a/src/Package.appxmanifest b/src/Package.appxmanifest index 94e2f13324..11b3d8e37a 100644 --- a/src/Package.appxmanifest +++ b/src/Package.appxmanifest @@ -364,19 +364,19 @@ - - + + - + - + - + diff --git a/src/Program.cs b/src/Program.cs index 31409e11fb..815f20c7ed 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -70,7 +70,7 @@ private static async Task DecideRedirection() // Currently DevHome supports one set of command line arguments, most useful when debugging different apps within the Dev Home package. // // For example: - // --utilitylaunch DevHome.DevInsights.Exe --utilityLaunchArgs "--application problemapp2" + // --utilitylaunch DevHome.DevDiagnostics.Exe --utilityLaunchArgs "--application problemapp2" // // --utilityLaunch is the name of the utility to launch // --utilityLaunchArgs are the arguments to pass to the utility. This is optional, but be sure to include the quotes if you have spaces in the arguments. diff --git a/src/Properties/launchsettings.json b/src/Properties/launchsettings.json index b442274457..1ecdf3c1fa 100644 --- a/src/Properties/launchsettings.json +++ b/src/Properties/launchsettings.json @@ -2,15 +2,15 @@ "profiles": { "DevHome (Package)": { "commandName": "MsixPackage", - "doNotLaunchApp": true, + "doNotLaunchApp": false, "nativeDebugging": false }, "DevHome (Unpackaged)": { "commandName": "Project" }, - "DevInsights (Package)": { + "DevDiagnostics (Package)": { "commandName": "MsixPackage", - "commandLineArgs": "--utilitylaunch DevHome.DevInsights.Exe ", + "commandLineArgs": "--utilitylaunch DevHome.DevDiagnostics.Exe ", "nativeDebugging": true } } diff --git a/tools/DevDiagnostics/DD.ico b/tools/DevDiagnostics/DD.ico new file mode 100644 index 0000000000000000000000000000000000000000..84014e6192492a72f9e12192525186c61e6583a3 GIT binary patch literal 151604 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�~6B*a(XPzHHZQp>4%Y&7=Brt1+AX8f7emwi59**N?EUc3s`Yt=~V453imbkG0f6hWN;4!D} zdOwMg8h6NKNnMRg&vCrZ|Lf}ng*hH$;?4m|b&XJ{x~|6a|0|Eexv{QV;MCR45R_&v zDPMpo%o-PeNnKstoEbA_AgFU0U0>tk*VL4kl`W~Mt3d<=s_O*(g^R0em{wL&?#b)X zcbxgv)r-qZpp39Zjf?L%Kn_{%`Z{Pfv!)K|0Ih&s+Jupwi&l zG~G8U-={X8r=+2l=h_plJE2cZNniHgR6H4%I1;8W4f;luFhf~h=fynZ_XvFBF;D)~ z@;VLru;W~ojw@k?QRTTWQ}taYaZTmv>q_NMT=ri~xTZ8oTMbn_#$}$GF4NRd%~#_R zM@?f~rt>UU!Zx2K63-U0Y}7B;a#1vs=Ap~$a3A*7*|^?zoc`bA`mN)9;Q?G2?-dtD z!@q$1F97e0t;kO~4t9B?&y4d2!6PzxeF;vJKIvAJ@BzIZCXH zqa9GJcol6>Yy;O`8_=Ez1~B70dqy~AdU!t@D1`f9bJPwFA41cD0@DD_aS_~(EAyw% znTACnbJ%xg{>-^^XU?3%-YfIOzqxZ}&Ag7$IYgK{SEMq>nLcwC{zRUDqyLTfIs5+s D^9AZs literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DD.png b/tools/DevDiagnostics/DD.png new file mode 100644 index 0000000000000000000000000000000000000000..50ab7fb27028f905e081a1466d18599ed13be550 GIT binary patch literal 20891 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 - - - -

- - - - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - Default - - - True - - - False - - - True - - - - - DevHome.DevInsights - DevEnv - - - - - 0 - - - True - - - 0 - - - True - - - + + + + +
+ + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + Default + + + True + + + False + + + True + + + + + DevHome.DevDiagnostics + DevEnv + + + + + 0 + + + True + + + 0 + + + True + + + \ No newline at end of file diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-100.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7823934c8ff0d8fd6d990dd1b79a2ded23b775 GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..03d2363b8847f56fba9980c210a65b72480f5617 GIT binary patch literal 11684 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-400.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..78be0d717f232f86ec37149353ccc646eaf0ee0b GIT binary patch literal 44599 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-100.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..420b465f0bfe6bc64ab49a4da97f65ff73466596 GIT binary patch literal 2042 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..c03b608186f5d71fef554943e3493a818dfd67bf GIT binary patch literal 3304 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-200.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab3da0a8dcd6784d6e748eb312f7488b47b284d GIT binary patch literal 4374 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 OgAA%`s?(t5`usofV^?1Q literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-400.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..3e57fa8dfd5737cf55b23499b68eb8acab7a2bd9 GIT binary patch literal 9600 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 G4*efq<%`h( literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-100.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..da80d9b5b64a1f59c82c3566743bcf1eb5ef0fae GIT binary patch literal 7884 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dcc19da13f80a3a5b3806bacf4aedcb3e5bd65 GIT binary patch literal 12563 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 upke&KE5`r3SN*@sg;_07kb0k^Oji? literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-200.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfb4556579afde7f34ee882cca7adaf1ee9f3bf GIT binary patch literal 17965 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 QYxDqYETHB!*WDld2c#iiiU0rr literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-125.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd6dc63d67a508ce1aee5f6d098f2c1e575d3d3 GIT binary patch literal 4144 zcmds5=Q|sW*EVX@Xy{5&qtvLjL2K7+)g}nlT4~LO5*kDZs#R2#Dvwd?F;lHkBUK4W zr6sj@ZAxMjn;41L^YQ%`ejo00KAh`5AI>?~x$bk`SXmnJ^9b{>u(0r(7#rA}_=f+$ z&3R%;CcnO%xYPc|j}R;@XMX+%Rx7D1HY9sBhu7a}5Je^;XcNxbzW(lU zD51L36suQNITzU|-|_{1_popxe+T}XV;NHmGd=6d6XLoeD0SD^lv{aGG3b_PpLvQh zJ4rH{lXMjVfStaCiAeBe8~)ugOo_dLl3tx8YiLhRIK!|Gt)U^s$%NzXnm^uaw23ek z;^8Wiu=OyHMIc&tf{W#cE!%XIoP?GDM>JQ#i*>#80%CD&Bz9}P5D6Y`fC20OSP(7b zlb#tXY!m1URo)#6pEFCHbuM2DNvJl`r0(vLPSbJgCF$$2F-(t>0VhCL8E$?Tc2? z9ZD}kA#X7YpMO|=NjZ+3_&GHgzH|tnJ(#9WaU=k_p;GE?TeA0^8bau7#$ii5vd0(n z3mKcZq>o%a|5~M`DYUKqBB~cJ7y)jm4T)7RRlIYw zJBDf5D)I_SO}H3tn_+eE`qOY_}VswFjdEyS&3((Vi$fA50KZ>lD){L`Bk*^RqF zXu>4n@Cp;eUlB(>cLv@F=W&mDLi&S%oqwcMV&%%m*ySE~f&>hM_T)W=DZQXgB zjAf14)~somHQZnz+a~>f3wnwXO3|$T{BA&f+2C=R9$jhXym`|6{vIQ#3nwm$M(_`S zH8zMNe@g*7_O>tRY=4cRYs=sX1Z-Dl)DTKUWbOc!rKKYZq}(SfWy5wK#0Ok47vt9D zsBNss!-u_Q1QlXMcL=x-cfOe>PvRn53eF1@kQ19*z?}(%_{*FEX62H~!Q@z>lp)(GQ&81%~`<1xzfsd{wbe{bG2^}(udeumEbz zP(6mw%1#<$8De&DmGtZ@&kdzcwA#7PI+Pkhdu^coeZTwC#UDPY!*{=mY|klrHx-id zML%8@SKBhXQ)>66%ozY`D`|K}e?BN}p?;;K5i`(-^SwxC9HO(;iZMYMvqdhmw!xnk4Cr}q z@v)M?N-d*h?Whl0V^-s3#wgX^@Bh{ZqqG3FX3L~z!OW&?;)kypswyP|mM`yT5;4849xK1HlKh_(XU|gKI`z&l?Kf>jb7nf;Dd~KMEluB_| z#OGqaCrLg4r!~p_SZyRLwP0yxPevQ-ZIXgjsC4#zpwnO{>M@NuI_1T3G6^O!uODhM z2XDTHMdmRX$23ZtxsHy8L<3f-S*Bnwv<@D+`8Q{ET;QF^id{w30SfwM@G|3zh1KHq zgw{vszK`PHp_TJwf!SF0Y0M?dMy|EkoVHM4)q>Nj`7Wth5KFlha9X#gqx)J{!oh_p zLiIR$9I}1NXp0#?;|4Rgyk`on^IU9I(C8&%BZ_@~oYkk_k~mUs5;eqk@On9ToE;&P z?!gzJ%%75oSs|}cFA;Q5(7yW?DI>ebWUU&NPMX?E{;4}YdDkfZ!trSKFTPVG@VWFd zNo=@T&&=YIiV&u}VwYaGx0C|aY#)F8)7`vlbNs!MhJJu~SHta4^SzI|!9nnRP*S|b zX>MJMBWgPFa~;AwNAwS$UGuh~_~k|HRH)tjpNg-MLc)iR>8A!aGP3VF*uEzyXx_EX z#xvlc(Vf5bs{>;$6hx+p9vvq6lt$3IPHeU<8qOw@RpAM}T!vwcpN<2$VG6u?pSBob zg>rdLR|Bj=2y4qYj+R_{imFZb(6)i+C4q>KJq|Z57C99ZWn*<{!ez;=;+-58hnCo+ zVJh>Q$S4tMVv&M3=8P3apdg1-$>Tgo0Ov(HmTAoCd%H_fgIR4o@)UReZw-NT909UQ z>Gkb2qB%TYpRLVBK-?|)N>pOnvszB);o01LV%VlJ842y4JbNqrpu2#vF2P*aoy~`P zz|6luLZY9kaG6OVR$#jIKDuu8-d6CM6E$~tcTtm>`QL(WEijb^%bGx9a1|P16xrLj z{p_~Dn6O7%0jf4Kx95UApS~P=7Kr|83Q1UhZG-XUDahqLO#-k?gIO`0$-U>vDZpH= zx1y~c-IZo)cy=_Z>5WC$O$YS0qTL8lNJiTYvJWmR2_aGh7mx$FAnvA6)%el;xj&X zt!r7dsa_!0By5Ay(022nGQL@hp%{y`ictRo^5G9nuN?@vYb)@8-SQw`#BQ_nyhrM> z%Z`2fN!q3yv&*w)vyC=t+Ed8h+GL;2@lO_>AXu)xn)=%ctIBQ&HpWfE>7CN973M7g zsa?00miR`@=T=s!MY9?RJy)GD=Jhx<=Go9M-{hlwmu_(+{;}#w4dbL_@p%dc`_-2x zQ|)|Z`W2}PX6wHXlic>5q3GFldzm8+ZY>m*j&IE#9Cm&a`M|g2I#N?`7J7)9=f}c) zyRA<8b~y)|qWw9JR_xvRwf0H2|JKG!4WM>?K=&^XuZDk$j!`u{70~S(Pmh<&l8(OS ziE|wJF4-N29fl{|(G7ewD*H%FdUv+0uYyf(<-v6CjsN!n~afLUp~!@;gDx}?;U z{YDI0{bI>=(@_mbU{w^=4L54ht&tW-0#IUVaa#f4N!}I2x$w#no@fQB5`Q>Iv+53T z?>uh)tzZPTIGJav%{x`+ae1eF`L1C=1lUk*V%i5M4?5KQ3y%Hmab@Gw9UasTTib_8 zLe|+4xWll{khAx))a?c?^;s1gf#4vmL#DU#!|N~BJ&q37Ku}6VS>{RvCX7SbYx^^61yC2Bp6c{up3Hpu1kHRrQ{UcG+3p#Yq@#JP-fiElevSDI1g4|G% z4^g*TP1)FeqZA*RKC6Aw;)K%3kj7GPe3=@(Kd|be3n#>@$@q`}rr{KhZmsu!5Pk}L z3ZOOn>eSsitH{8W(s|8ewy6VWjuT-Tlh}GKO}?I-W|*`-iEwRt@^SWiTO8{hp=iY8qTe$yz_k1HvyFX5YM zM*9d5*RtVexny?(U;Yqv?~85U({HLr%NW2^^cq@}l^e?b-TadUMK4<6UHirdxT@Hc zTx}MR8Cbn2b+aXWd4S@Mz6ht2sHVDg^NMBvQu!DL2#NjFvxdd zp;wBkNw@Nw)Ljtcn)u?vqHPOgu_z6i5%7a%}eSd^T?F|s694(^hfj)dDmUh0Ubb(I%V=%V;nJ)fRGeQA>EZoq2Ed*~~k*K3wMAetds1IB$8F7>cj}KRsEsJ}j79qa~d7f}bw=Y4s{;yxuNOCVf`} zW=xW+8RStH%_Dn^6OogTZQ4igNr=8qX`2Eh&+~$>2q@fqTsY{T_arYyBaHCZFOLFTaAlTmdyt=-0&}F+D3c|>y z?JZe-44z?l9S(sG?;XA6f-ir>-Oda@QH=s4PmLl6RCIwzX_&d~N0B>A4y%4ygE>Vj zCdC6T7y2Cu6;m+MoHkgz;W^#kSn-MknxEd}n4YvgxbYYl^*?`8{=eIK=9slE#u%^| Ux6^*|0$?$@Z)s3*_wmdB12eq-L;wH) literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..ed17ab3a8fee84480a0ea9b2de2ac6ab049597d3 GIT binary patch literal 5160 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 z z#iY~UC__&3KI0FxQQMBIe{g`}OT4IZ;hqcM>7sIQ9a!H~4HdbM+7%?G`U^I{uqK&~ zPK@)y&EvfQD|N!7G|x@yGxJ=SoJ#h2ce}%d%MbEOh(vaYMU_3gFS^z(S@!#NJ-KjF zHrp?7iL-dFa5tM7%lCVw;u!&_JF~$2H@UGtLk6{>9;CHg=N9!cwA5Ea?|kj8IVaQ2 zNCorv`?*K9+x-E9Z$VMX;eSsla^^4lSuKz<#)dP!zYUF4-?S|!wd5M4#Od_K>6cOc z(5Z#6rUXWNY9tADIHxnJQb%3f65R@-t>_i^0sWKLns0>8{Wot$AxGtmU0 zEEoB2S$RdF@w@k;s1xo`4-5@stPW;e2FOpAxOkYwbak?4Gh?y#vx5TRR?;?6t)Mt9 zVV}2@3KIU#=O>lt-h{S!+@Wj{c7i?}7X+*oIc5vwAi?5HS<#w4_(cfaT<3HKB6YiV zl73vK*hwEf)U7Gp6pNL44szvuG8tZ)lrQkiaQcFJs=a71D*NeP8be5arE9D5x+l)mLAfq}*30rAv?Jni9CoX{fbp3&@XGv;q1|w(t>T4*ohn z4|zUBxmgsF*Jqm7RklP_t+9gZypHH#hta8=0v-}N*j}$xoVzzn7Ix? zjbGqcLBkmqCe*dc4?46j%+5K5E~cOH(87u zWUAXt@i>_CY10m!keabsh<(b(#GBTCrLXt^NkwwA+tTm_I$NNRBh<>QOCu|+do*jc zJE+K+pz?7lo?_`Ery|C*bcy|G0-ug@@iT7TQn6RyzPhj_`p_PSslstFsjajble5`; zj@fM|f3In7iM+XZg@GI&ga|<FyPX`-bApC!2kIDHd~D5FZ3Nu2#}oD{v}Ho>aM5dkZm?( z9F^^`&Py0d#G4O~DkMPHE1)d%55y&$MG^KLG1v`V)(7Dx;L11y?$d~=gdv*};}(^g zU;9232iGoFU))e|Wc!vV{Q{lYBi9Spe?!wq*KT%nR;-V>7d#Rh2Nis6sXeu~S2me^ z(=8V+;A}}E@2v0Q{%OqfoId97_U}kzi`u3u52PX0iz`5EMNn`WOVh7_RxRcG5ml*i zcc`_!Hoo8nISAcjLJT^q!D*?*F~%v6w_hwW%DZF8;bS$FyB zEll%(?l39L?$Ag2pCH;C#$y+PMt={}xT#+6J?^TQGr?;-b zdp$Sp*!;%SiPQ!SNicBiVa+~HXZ%Hd*&8%cXLP7{7?^4p3t99%P2N)y@;?5J$JT$+ zsu>+m`IU8*+tyI*i32_S6!cl|f!(){#j@-i5a=@(`O|?zV^=s+J1;LBYA8fq7fSCsyyyW<#pNKYLrbs8nzJF{h3hQubJMRmqD%F~|;dfGY z)i+V`Sedh?V_gr$4>cC|(_B1#+A(h~j{ac4?hyQwa>~oB$l_A`T$<+9tU}Ow3p{lv z+sWUog^5F05{5w>n$)h=?Ud0IN@Z{SSe{HeNzzO)nWQ>s z8S>-bTV8lk{h4u)G(Aa9&edN&Six*X&kU~xha$%PZWhVPwn|sBg=n9JLm#ufdBkfR z)u>aJn0Ws{P4Bks#F&pI&tRv@vehC-t#U$x*4^+@^u5v6F{lk?{V6y|nt`+^V^4>< zhfowm+4z(B!~3zCzLfl%Nt8e{f`l~3r`kmOqvHsh-;{so(ifZgN}VsgAV=r*Inhm+-yt!?v4UhJ-a@}-t%u*6q+6@aWx$#C{5RaaoXtM| zdu<6j4A~CrhQqZao%fn|)z<|e6iaXeZjQoT5K>74ytl4G-Px5q9wzqjjVGR~e3=x2 zq)`}r2I}J9G%@9^Ap4Vknc}++JO1_sH@7?q>A;1ItTd>MKL1MzO~mONdFm!U^prka zhg&w#T}ue;7VwG_)3b%)QkZA{3I5T)2I5_39^ z$*VEe6`7xnVJnUw&D*Jl<+xXpq%9PZaUV^Rz1X}kETQUv;FL6>GhYv`MzhiUTpF zsrSbdAL3Hhniz*vK<}hBsL1uNq2g(pw)5EI;7n(2Y#RJ0L5CqeW|4C-h{ed2qwKX( zK1)|n$-(d~amIFiCGoe-?Uo5Gs&OSh^$-WXp7@9VpBZzH$%hu;w~>D0lE=AvQ&f}j z;Ws_zV<$YR=?{sS5ktt?W53^gnbYjo#tfGUty!ySY>qTG#gGEErdP1-T4)1&XsKOS zl>m2%d(Euhg)P27Tmw8NO|Fuw`-OY`A1ry>?Mh21({pYdFnNOSw{%d`X`JcFhtcqb zr+0YPx!&~Fg$}RKI-2+#w0O(bz4_3g4|+@7(zh~L3?{fK>WEh~M)mUmI^=W3iEtX)EY?r&FeOpJ!sdiM@{enra9+%tlAz zkWCE%iCVK#{Rnq33~@Mbnnab?9~y~~_1`90PYfdmBhKLrmwE(fxeYQlq(hWA4L+)V z%7bkOB#{V<@xa9cg^APKiu_r z*Kp77I37)VjtTk0r>rYQI-xOsc8?bORpB9SjRJ?G$eG0>->pfhEJI(7+CeL8qhlw>Y&oEl6yLe0 zp5a@pzY50W^0<#7Ah5o;ms6?JSgP_9^a<&xK0N!bt2v&FG&Q7jo(tIsFduXZgZ zh1!_Ta#4ugzlg?)V|xwoM^Qx=bwWwkL=?C{G8g3>x4t2Ib34c4TPO=>i+J`8$fQZB z+Wm9-{KEM*R0mV*GNf7U@D^uf*Rq-QK}9{ zy3-{2I3h=84zaX4yCx6eDah@Hy@-wg(%2CPqD02q;6C4jLfaYC9!zd3@D5m70-7$R zdn>NrCiY~xRXXI#*0D6>;dL`>24? zb$2nI+FKLX4KPp;arZ+rlku+V=dG+wB;xwK=Y)cr#&2hk2%T&-R=o&M=+E8qrUT=V~zg3WVr0X)J&8Dtvs~QX!sY=;42^VcFzv_1^y+R$^k9O{F=7E0?&ac2`qy zvWK}%elWQ|AvCdk$oGEnPdxj^!RlKE)GHDHY~s4F)DOe%S zM7U1vul=bPdqW1xj3MN-NVotc@O=P7cDGCrUsI!%5?9p>jjrAz-wlXUqu-gH9}CLS z$b#@AX7aBK<@XXe|Dq=YfuF5KqO2@`dPB=D>tt5M>7S1&fcjGVaK*S*E65!yX`N#S zm%{rplk7D*&22LSvRbRp^3VaFW>x*s;$FE=jGlcngz>-K`q_SRqLnBed(IphHR$=+ zA1guWy>c{^v>sDTml$nDZ~0{4+m4scyfc<6L_<}c6_po}9R@=>t<~y5Hn##MX~wTD z9J_&wzn?N)yf|g#>Y!k6&ShukWYfgZiGH;b?n7f zrJ3-l-r?OIb4fqr2dlSxpJTc3`3c*$#!dI@21D#?#(ue2>+5j#_?aVIaweB94s9ih zkBpLnaXVg7mUHkjE2C<+0IdMA4<E0<~bVWA9VUk#{S|BZN6 zv{ef9fvtC}6%4@;rCxt`SPk^Basa_t>4wv`dSVOuCL4Ton0FfF0G(NGx!9)=X|`XR z;#r!StB{ip*qd~Z-!Py(AIt4b!ZWAcC@Y%}wzcWq+U{U%WWO(W3B^0u=YLkJ98?O6 zO&60X-H5kqz(`l^*}ZvI*DmPQ@&l#gQ=2bJb(3_uyeqjDjJeMrH*OzvF`hZp4t7%> z@(_kUG;BMKFQjf%424N*uI0S5k4dy=M2^nS(%#AmBBAq}ve4ar>RYfAW7lI9ZE>9R zROQgb$)So57tkSTFzJ4Rd5y#A6uLHdrkbnGc$rU#Jk+m%)lr{GpP1!@GTN7`9qdVt zVH0wj*$hSKq(~R4Rwn~NqPALxKsI8|eLX7o+oV|c1mhqimfZ5Yt*t> zjp~=BqfA_429OP_va%(CqRi4?{!IHsRLlopf!kr18WQ#ly| z?qiUQ>eUtR9v!o`+hno}R>tzB0CNRoS(P`nJzpM-wQL`}IIh{yZP-qVuM*W4m|aG2 zip4R$8M_$umoOEj*&XzAn0c|tCd<<5PAZpZdc3pseTvr1snt-C1!=0G+yS5us7b6Y zjp(uM_NLGMrSv(Xi9Bsl)P~hQ2V$zm{~rs>;MCBj+b(JUrG2gzoz%LqEv{XPHLW^E zt9ty+nA0`aATc!EPFdS>6Z`$v$N$BX0WX7-JlBU$48;2nEtJjceWvQdd^vsZ{zPwn zbZvsHek&DhHV?Q0a^GHF7Gs(5U7l2|btn2tejqW;w5Qe5_6qN%y;O-Dh7}%pu5Qy@ zH+@@BL?1@QgAz7by4EdHE6NtPrI_LnkfP<%hNR#nc_3IQ?un!yOq$D( zzPdYOpq{GD|2is1RU+4GTq@fdhN2igr4bpoHRqb?upQgy6Ai2{$?d*kF-J2QECG0)O zIc}_X^!qU+o|2fqFcxTYdhUhLOH z{J(PLFkdj%Wxg$4C@ifdfYdAQrBD?0NE>W&vaR(6uZVzY7)p%l^wnQvoe2ol`*lxF zc2%**cIy;+_f}EB7f_wPI_Z;xB-d+ABvqo}7V2A3P#6+|*0Ix6=>n!0ra-CRM=8fnU(u1u3z#U zCn;g2R|?kT`xfAOQS5NT0zQ*DD8}1)kQTD)Grm(cHSoZ1HPYOEXW8zt{=+qjqLynx zeh~Snlr$!SWYY|xnkyhC?@?b!>#hH?ox_H++2a}QA+fsvGlEvud`CYf}0mG~hYW z)czi2;jjarKqXfdv-8yGG+WC#^C5;si-|JZY4X+1xPoh-@7a!sc!qP%vHoq!(n-M< zGsi1_48rR$e$Q)#G0E32ndR8`OjA|EG68$~O>UJ8iN_p4f&*|RM?2P*fLX`BT&U>5 zCgUb?U+6L}P?5S~ww!{K{?~Ooe4coMDHlDHLp)Ab?~`zpAH_P$bL;V&X&ZY?k`SZ2 zbg)|L;-G-*Au98sZ!9>DyWW_bZBY3+Sy`dm zzeoAk@<8aFB~iBRq12Y@znc_d`%=|5I=m) ztQ~l{>yJcNt8#}UmUeB$XPRG7v~bidwnkY>y?kC6{OSoynO?p}eU9f++XdQ$HCQH_ zFnhcNhlq)sAf?z%d}Bxk|8&U{i?lDLA5|irI5_$$nsct7r-Xd$u=S9ux+g9TwIgzr zbSC2^uvx)Vo=b7SrB0`F)gWfp8&MYyE{{u$v3U<79amc0$Tk2ZPP9vXa?4uFEugYO z)~`weQh8bQUK5|n#Spt2*FMiQ{&B88&ItIe#J%~X&V0w`y!-7=jzmiHxXP+ zfZ)rx7tUAN_5|LPK1bxJGA8G%%V<=$5sV93igd~X9Z7Ip`O@=4XHPZgDIHh(hvhQ3 zT65X#{;U9pk?Ha`r>e!Xr4n2|z0`Z&9{-SBd!+qDDB_AqYwDY64{#1;bA10vElO+o zf^RsF-35yPt~On%4-cehEweC5ng(DusdbSOjkWz0s{R9f#+em1aaf__P&OJBxbqCO z8YjJ^1k@F9D>Eoye{Z(D>No1As@|E=5diBM>e+Gjz`~PG+Jio?$On*V7 zg;0n+7L#iBZv8DYDkVJ)BWIWjlxU0iTY>e+gbyAUH1u%);K*i{7WoFZL#Qj%V&Q z9x?*Tf0Ib!#`0eAWU{?<9qTueDBo@7F z=J&#RMC*eOx$hZ<`}lm8^>;b&KTcDJy}5I8JdSiUG zRgh%w32MQ66a&55;JDsUg!{&;t;lwZI-B*Er5iqKj>;9;XLEBVQa_U3$QX`<6oCf7 zt2%=qs|P8-#g*elm%0=CuK&AEig>M49#-BFCqxAqP=S>kf|SjbhsJ=$q|w`Z^PX}O z2_NIfwNQdVB}13fysAFE%4!CXE0YR>+J>TZ@`tn4N5f=hav8~lN!2{ycM>>vgrfD- z)zp7IUFlCR1z%5L?Q(5T52)_vKBQIu@mF`}QIiaM+{&5CD!y8a9)el3!1nU4JiIaR zlROT0lC+JIia}fpV!zzB=O>QT5JTPUhZHcIGww!hV`fX0wqeK^%kFl)i+xi}B*=NR z*_w&Ph_xl=_mzSIEAGdBLYdSMeTuw-C)Lh2DXf<5qTdn8?VP22;-AvDC%~J{hI~|xBp?>-8*u}7wIUN5s zSs5t_TKRp2%cYz-d$@84emfiybo8-H5OcPpxNk%zP1<;AI$1iUp{Xj(Y6&Vny&g7= zp8I~=%IzV)NgMQ9xuev2_f+(d_pc27s?AJ&+QvL)m4GGbrdLx86 zyU|WR)JO93LV*Zn?I^=odtk-^;;Q0zF5PPJ4%MbNz?!LaK8>!a=*IQW@Vdyv7aDy- zcj6K+WbN#T^dYz&OsGq7q&?&v@(v2_F-6?|^tUv<-t{iPgPDw~wTi2)7gWIv;^06BgW)(n`#77vgkj6M-)6Qy@yBC$eMRG%swfg ziBRY}9!dFKK=V!Kh*?0eJMp#hgAeG>OdLqnT)z2sP@4c%y))rHi3*{-bfM(*0Lv*j zXj6MC9fl~z;3^lg6J~|d1-81khvawIR(C$`ei}}5k9lQ~D4J;dwBrdbkLUVycet5( z{;C;ktjAAvSmNQLmN8j((a>XxbAHkhIH;MQt<&SSUgUdZVF*q|SAcu(A&SPIx6HL!uUB6@Fo zP43vJseXZ~*+Ve!B)AY|jVPvwtglL^QNQR%t*nHB)-+um9Q1xLlH9zmhV(36JR+#T zW)e!uSJR?j%6l@YBUyY@*$?bchb)m%ZCwdRh!m} z?i4&7OIR*lKhPtaAaPlw7(l}u#q2|~ls*hHm&)+{?PCxFM!n*~L?#bNCmH#rgu<70 z%`Q~o;I`7|x>$Bvhs91Q_JH-M85tgcKPg128JP2yTaqu=Tsy4cCVa2$U1--qge?+1?&{S9`KUGz82cQQ6RR%cz5|if&8V zUqg*RsT9-Iwzgs2;O7XiB5l5E-NzNbD9j!H%udQiH4biQZV%1@q$9TxXkucmbKj`0 z7lMEe*K|E%nPm(|45D<2VH_UBX+ZzWOP8_JDPdM$Aq?LXXUv#PCTEG-#0=lkzD2kB zkq?vjo-3Cx)z%4N_6?)zew43?Xt}u77uaeXb*U_L&$@U+ny|r`ot>40Lrl-Tc~<)v zA*v;E(sL@-#5Zmqo#E*f>13l@PLT9=gP(GymT%-pTv|EZB}B=KFtZxFDmg4Jjp@Siw0fX(#h^-jaQ1wHC17l(l49s93C11@ z1_|C{8?z~`j{3>h9o*~{JgQAOKMw?!-h|0s_)%vprj5|))g1IAB1dCI^U*x*=%2l!r`Tyc@v=WfJJt{^g zA89sC|9P@*HGcp|!Il0eD-3R-{Pg(ODSfC&esTDGAibXvlU{-}L*g|{vqm(`0SY+! zFIin2At2`;YX`{y-lUz_fd8FW{NJh0{~cxh-}zlq@A1Dw%m43aH}QfDNbB&HG3~n# Qfb>#UeD@ml$~5@@01B!jKL7v# literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..60132fb3d51acfaa7f6699b34eefd2e425e0a010 GIT binary patch literal 716 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 JPDHLkV1h}lWK947 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..6daef9882407dfce96ad3abeba72e01c530b1220 GIT binary patch literal 2891 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 Ef`)AXZvX%Q literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-24.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..00b0c53247ec25c13f27abf67f81f8dccde0757e GIT binary patch literal 824 zcmV-81IPS{P)pH>PbXFRCt{2lv_wtK^TDlnK>7Cx7F>YArw7TK9o0-C@KhgvBU?> z9)cpMhoUej3R=6-c9EpVULq(646=vRq=zDse279NL<$QNCPHWebN-Yu=nM_wu|EPZ z4mBQv)>)LB9KhfllmY^4{W5Aw*u3?4B|CS10H4kqAVe1v1IEyVHFO_&Kw=IL#9XKo zwu^xRbn3_|-DrE^ZOs?(X(tS<&`ab9)j3wqivudWN;$mCaABu#od{MK&m~ZY&kW*l zUI2`Me9;L%C}VV36%`Rj2!18t6UX*IcL7dTvmS%Pg-iYT$!`I -p(GTuI=kCy-< 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-32.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..3ced4d93e8496255aaf0d0d07c84ad39d9cd56e7 GIT binary patch literal 1206 zcmV;n1WEgeP)pJXh}ptRCt{2mtAZWRTRh1xihmf+is!d!`fCs35oG5X(?zhEzxRy z&@_sqpfPHU$^#gEs3w$>CTQa~gv3{k+C(2PmJ~u0jFA`;6QQNiROO*!zi6Sdbi3Qm z&gVUzyHEk$mTs*d551e4n|toeJ-@lm~;>9bcV(s#bs9X&m- z0GXPg(PAQ5tm2{x6N>aQYj+pMdHLm?Yos30a2p`zO**4H*tT_k0l0fUm?*T{xK=p-lzz91#hU$i= z*5B$WOgw+<&)*5qA9TaRI$Vw?Qdh39_-r+@OMyZxGPOc*!^G$91CO=+1t1vnb&<#6 zlKc}{k1{KO9gg$c&*XeQ2NS{QGn;NYTpmadd~osyCw{6fi`|~N&cJ*~hrI`ra`{tP zA49q&8d@MJ{m zy`gO#YR3C&=E{`K!`s>RnigQDmXhfLU7BDA2@X}lP)7|1_Jb&eh^JYr_;fZCBEPEh z^Hl6Za-KWXU*A7(0FIXc!BsEm4Kl>oKI-mmkt+>VE!5{jnW--UbrPHzaTz+>4h`1t zpJ~6G0qihtMxmH%gv)O9VoNJ3R(9g2^`*^@$G94bHtDAJwU0b8bglhz2Jn67s2>bI zoAgIO)eH5xitL`nb^*xfw@Ev7WZ+?Mw)^D_(E7_dl}=exYA)^n`M+QR;NNV&13Vb< UfADpPfdBvi07*qoM6N<$g2P}$IsgCw literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-48.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..9c040bd0ef5496a07c7faa50d51cc08e6ddd3fd7 GIT binary patch literal 1970 zcmV;j2Tk~iP)pMWJyFpRCt{2S!-+@)fGPH-kE*ao0qjDQ9}Z0d6Z`!rVk_@;RjHm zkSe4&jYx$6l~yeXgo-eb5G)c>5E38|B0{PHYJw6)ac}}@1VSPfQd`w=3IUQ(2sjQ6 zCOEctcXnoH?mazs)*BnM@$Qy&7Ld>CdUs~-%=x~1o_B1)cU-Jm1Nf#gPN3E@PN3E@ zPN3FOl0fr(eRaZu>m2{<*H8dx4LO0(hk&0E!Y3BO{+55?=VJl3n3NHd|C`jJOE#JXw&FGxi(z^=lpOkXgU|Bkpc84;$&B*yp~T%O?a$%w!iQ45}5 zF<<|5^&W9s^~gWyN`B?Kjxjy2!36`SQ9vz+|?y=(8V7J$JPhu>1Rp6i)@kEo&rd70*FZb!=L63 z?0RA^wynCHQrdrc<=v@e@5~ilz>Uc($vu;PY)x?syAd zZfj{rRhYYJF$qKHopzvBsGLaE>cF4p(ZqhBCpf^P1|0_A^1{0u&>%QfX;4sSH_UCG z=RawowO0b|=hN@=>Zc0NFhp9~d13|bRW$-xqI%oH-Lypv(y`$!CqRkN4#zaEApojsB@Lhh1Vq7zAfXj&O+hq zq58tdzhJiixOc8z%p`WN0K(NF{TdK3^@260AKfFaXqvriVaz^ldpegd9h!oJbCQde zcmZ9*t;g>e_yt)eVTvVZt%jJS9nBZ(#?|lOhvn!RyJn6MiT&hPKicVd!2riaj#od* zei1-R2Oi)V2kxAu*I^P`*wvbiYnj0$CO9zg7q-9^HM2lLxUGPNGdCrLH5kO{IA9!L?p?AZBT3*mj(UP{N=*TH^W?}Q5 zPuyPu$#XoF3N4jW>6`gd4G9C0}qaBtm)eRG}B)QlMc4rJ%nt?&I9gsfd8d?>Rl{f}9X`8h;?$z0$&1gCduUSsmY-`tZo%FLxK6FB2a- ze)ll~o%B>Xd_thJr&o;t=X3T;n=?hG)vwdn}BB1GjB-XrwB z+IIMcjVIGGtrJx5>~z)y39+jI#!5pghd}5uYJ$lMpg4tiI#aa7zuSLc<`nxJG1S7) z3Gg|U+NU70d^A0WF8p^qNM$D(OBEUqt|UdRRS^L%aKdTEtV;K>3#FDd&3@x&#x+b) z3ZZJ%(33fI#^lLo)oIFal1;{sF?c8VVz)dPbnHV|9Q+^fhlu6N`c z6EMJe>AACXLTj*F%m5TKBzKq+@&!t9w{KG9@Vyp$y&sVG*tSpCuL5W-+2=dde^Epx z>U`G6{Sv!su4lr;`jYKLNdmq~#iMd^2+6#H(A*Lb=XET+jxfK_j3J-J!Cq+7+6AjN zFTHA1@P(#L11-Z)hiUlYW>MNV?7OyP$}8;bMjWAhx&I!$Kv^FsV&{X!{hWf9o$(WR!G zmn`Y@5ZMpzpf!eGp!_iCN6KQ}K3;q*AED|>&@HP`T{~@4GJ^4!5pCO8Hzp>5tNM1g zbuB4c@G2%yt~~r2G;pOwrPW|Hb)YYj`ilFsa?8+KIA{l0G;>>{l-7D){qsDX;@lqt zpR!qYr`yZbTQvg4_=+DR{P}M$`;~B|qGm43wJBaq??E{Ea}{^7H_MuM4w} zPnnx`blrI1loNnV267@DZr*chz>rAzY3J=FXTGLf5O{Kt|uN>^#E*{ z2phaWIj?Ayx@UX$vX3j(TQvf%>J=z-0vT>T#hR8tfq_4m9YYr}DVXcIA#x;8?(0l) z{VShd|JMJjw|WHp{xnGSIIn2L3sT%a`QhF;FCiHcD0_Hxvmp+OxclCg{Y|Ai!xB<8 z0viwg+`OQ=uUgM5SHA!Mq4~DUIDuNrIDuNrcb>ri06Ia3%l793B>(^b07*qoM6N<$ Eg4sN_LI3~& literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-100.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed62f1cd4b0957cd8d5bc16e5c93a02bce8ae40 GIT binary patch literal 2751 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 literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-150.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb33fef2bea3014375816cb15cfd649de404e35 GIT binary patch literal 4201 zcmV-v5SH(WP)002t}1^@s6I8J)%00009a7bBm000id z000id0mpBsWB>pV8%ab#RCt{2Tnlg=)p`E^vwI(sZ2X2XmSr1)>cozV{J^E)B+U>= z2XG;FCNnm5^C$_lAvNQHU@Y6n71$-o6zZ9hOhO5^3zL*!BL_&Q4V{cijmLmI#(>N4#5l%#dbQ6wr@0JvglEjDSXMYD_~C~uKzTtitF?^Z5tP>4%86i zV}Wo?19U14@0$i3vlDoH$5A|A^r*)PzGNZj%R>fM7s-{25JEMkJ{t&MFEs^RY9M~WQm_%1=%ZUf zKPRRB*T%!*_}JfdY*2Co&*CHLKPkOqCNCs#VMxHj1i=0EOV!hk1^>9?i1>Y}$CeA@ z?hTndk}h{6iL0y-aCaiC*KMj(4G*`7AB^|-GEp>Hn7auSYJ|uEK%c`l4y!7|@aU$+ z>hsAse(Q(t;^|_>IMyhNEYI%bZbzy$(2j|4bbfY_)wItBs50?pqf#HZ?`n1956Zxn z6--vd07yFe6?&libG3CO%ryi|rnUvk?Pll6Qop^hn7Dma?dU^D039_JKv} zhViyz1(TJMl#d>15pU$td`O$E%hW`r^!2ueuh8M`BstUK(v!L%@Of%iBSG)mTBnyb zv|zl@F^?6BvsqZ&bq$9^FYR9DZR^!)3rXlb^mzkGPdFiiZUxZqxP*PCTiQR_uu$Dq z<)E!v!8u(A#@V@`_U;9hpA{V)#?2cx92T9ldvIf&de&0z$87H$yL|%v>cicmV?JeT1b=CTFHJ9oa zh_IW66Q=1$X&a>SPFOOz^?Nm)O*@-wEjpCYHrRIS3T;0F_iNo0j-uq0{9rtoFLHTVB<{Oc8F^Z+$GE8l=~*=*F_y~uY= zFlqNr($Ov5T5fAayU=GS8CjNuN{Uf;RGQi1D|FKy+f9AEp&<@A?WP6%J4(c#;&!B~ z=k#JYQxEDmg*6AXhQlHZhZmtWEE!ozgC5J)=lUI-nkyL1 zR?ESHWkYH!9 zo}~S;gCdddGn9?ZDh5m%iw2XQsZ*3&P79mxRr>fB*RO<*E{(NlM|4Xtm zkuGAAv`r;@x%JbP`j(B0)L(5sBHrfn+u9+yWd%f_m32J3mn<8yc&K6F8gB1cdo?b` z@JG;@d!1h?h@~xNyNUS{A@u)jT&(We{-$`AdsofcVx!NtEL$ICLl&2FY^h%(5BClq zJIa}EtJq3KfhooCM4oc@OpPfjNK!&{O@$LSOp{5LDROlV<~T7A3%n$1z%vhAtwK8v zi(MRca5%x)Lbe#JY{-fTS6zPg$eZFxK3+Zd<=V>7jFqf>QY-bV z1=DVPJSp*WMCD5Q#d1oSj6{}722V@jeDm%<0STw8r{Q(MfhlkQP`^xlCL#6T(C2Sa+7yikKDH-` zf;WJlZ~Cmd`r)_m!;T5ss0S^B0^G78YdEB3w<*)+_-GnO?VKBWYRK?ZMIgoc8E8Bt zScSj4ajAO3b~FXRcnhmtkZQ8pRv0*`S0?sQtLv#(r@KanC^@(M+LtX^mZ@oMmcc^B zIbk6c{q3*2p6=F7i`C|+iQAICYN_2sz1Ma~ilf)9UwC#+L-UMhD3l1~q-@Co-8+XY z%Veo|6@WicI)|@+_)YQmWRq-C$?XXz(~Ej#AFgI_RfANQWL7@9VPWS!I<&o(BfBnJ zvXmng7%58@1PnIDX^`>WL4;jJD*4TRmoNoswN@#oVM9M9=aXjjB~PvTQ7i7|gxjmW z4n^6LMSgEq1S8<+fWVp(L#;8d35@;_{H?I{4JKkuLZ&_IAX$8D5n(o3-=yZdr+?@! ziuvS_B?K-=R~~%9aTh{+K7Dbr{6L+vDU8N$CMI1cQyHWs<#{%2*RH$rtt&3O89ty8 zVg$;UEKo~>RFK05ME4Caf4wiX$FQNVfW4QyEbpKRLbQ_RY6-prXnwJf$miQi8};_|ICsx z-!_~)+p14Fjw*WH7J1PRO|p5O&2mOa7u!Qi_4@LX2U&WcJmPg4g&@N_8n6P;gWO_( zk&!SD9S4_X60&R0izipTUG$BRSM_A7;9$I!hCESxQinOGdrx>HTf1vrgIP14|{Z zFfi(V;kv+uoc?67+KJGB5zLHsg$flVSr5I2=O0{>t3o~;nuwZAMD-jBRXBGRd{ZA# z>^4Q1p)5qXwOGUNj4xS=bABZ=7G*f8-;uWvuCx`z)?Zw)xB8CS=IiH7ye^^(Sd_s; zS*q_%nT-AU3n$i&GG6g&R1zK249q$C*-7HG?(jPwpoW&GZpw>6yk$S0IwoW{pTBm^ zr~dmX>6UsO@?xa>${t}T33Dmho}nB$kEpIxWFIh(SAzJv4U_6wDt5q0^xXREQ)@rY zc~K7BQ=`K>-EuK52%Z8$el{hfbJFi@09kg*HVvxb;OvUc4?LHG!>=1@)nsWyj(~>_ zf`SfE?i5xMI3mw&Bed)FLSiB$RnL>hqHo;Y`r)=QiGYon^ewdkPem+H0p1)bJ0KI& zEe*%F^y9CFY_rfF5`zr=%=?~@g5Pr6 zb`TOPXFoF&5&uX9#EG0rDYTBgcw)_YfVCse`@a=NouLZ(5M&Rm!b_hEii-+`=`JG* zztn4W-2GptzT1}jiu}L}KinCwR#I+kx|TwaDqHzy2%PHJ(BB+X+V_{Nl)8B~D@~Au z;T6V0U2irpSyLjHKR=d4G0vUP#y_=Ta+`Z(uR*8`Y|GDv68|%BjJ_ASmBVzsXE1sn zOncnyJg>pBLFbYR$2Qp}V^}_I|a6-P0?H}$(DCbve7DN)O}n!)QQD(TCze$m|i#lSak10+j67IRL| zOE~9KAY9B1W zLSJIT&>$<*({eQ<$faik6J)HQeq#`(NYcLSAls+GwF+OlY*!^1#vV2W{&`@kn&F(= z({y50)~U6Um6hW$osmLl7%_Lpb~29&EQbL&15~%A-B?7BRnQ-i(6>V3r^6O>tf+n} zQe{lqM=@corC9w&nhwDpP{w*J8#d><_c*=D>bUvk09oKoAUKd)4ZHd^wogaB=q%a~ zHIw!R*iI&DnlY`3q~=TRoM1pZuDp^|)&Hh*m2cFZiIS4VY9L8tJfenHGkD$(^00~g zasfx;Y`7Z&+N_-YZ%YiL>IsV5mU%?^j>gSB6HeF5O>L`o<}?1%kwseIM98C(N0-Aw z65bq=EPIsRki!FIhWVJ=c)){|folbs?i-Dz6r_6~C?LPZX;jg+*ti9lLE`$C|Eu z?^RMYWRf(Iogc7Ht3} zHYmd&DJ1*GB^^zY5E^uHY|wdiO}hFdQ`M263E3gn8B@4E_PWHrwfj$g?SBg$e+kLz z@mAj{kueQ5eCdxIn8VA=KZn1bQt0fGDWY!RNjB=qSp3}g{^RsI|C}dRKgC>B4A|6~ zZY>P`s~MS|(Va*bEc+Cjt_yehcNNbyzE9G8-wSOkpC8RLlvWM%Axi~Mhvf%!C5elO z6l{KMsoo#=Lg%BuZTpV@6n6nAu^M`>L%22z(({pWpt@09*$3VC5;+p*7YTTo67|)h zmE0qhe75Niw{?!y6O`^1I?0ceh?=f(=46{KQ9Ay1|Ez|qHrXLuV%+Occ*L{6REe0@ z)?o?BS3#Kj_kD2ds~6%KN=BB5CZ&p7?|xOC(h0RzQ|EE-q~S5c~Sl~szr-w=e7 z8u&t2>J7PeEC*5~%5vpjx#A*O1>hoC1>pYx`l;^Eebi6>00000NkvXXu0mjfiJ1{? literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-200.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..a5da4cb5ad4d48c49caff80a30570479a37828e6 GIT binary patch literal 5726 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 QE&u=k07*qoM6N<$g6n_*b^rhX literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-400.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..40c96bb280665ce48a3eee00c08ff2183a690d1c GIT binary patch literal 12054 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 VzAC_yC{z@js-T&anUh literal 0 HcmV?d00001 diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-100.png b/tools/DevDiagnostics/DevHome.DevDiagnostics/Assets/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..1090229375ef7718380dbb0b9bf91f50070d82da GIT binary patch literal 3596 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 diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/AddToolControl.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/AddToolControl.xaml.cs similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Controls/AddToolControl.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/AddToolControl.xaml.cs index 937b5637df..90352225cf 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/AddToolControl.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/AddToolControl.xaml.cs @@ -12,8 +12,8 @@ using System.Text; using System.Threading.Tasks; using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Helpers; +using DevHome.DevDiagnostics.Models; using IWshRuntimeLibrary; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -25,7 +25,7 @@ using Windows.Win32; using Windows.Win32.UI.Controls.Dialogs; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; public sealed partial class AddToolControl : UserControl, INotifyPropertyChanged { diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ClipboardMonitorControl.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ClipboardMonitorControl.xaml similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Controls/ClipboardMonitorControl.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ClipboardMonitorControl.xaml index 830704a071..253abe5350 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ClipboardMonitorControl.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ClipboardMonitorControl.xaml @@ -1,9 +1,9 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/DISeparator.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/DDSeparator.xaml.cs similarity index 87% rename from tools/DevInsights/DevHome.DevInsights/Controls/DISeparator.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/DDSeparator.xaml.cs index 365556ac89..d8ade0f86c 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/DISeparator.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/DDSeparator.xaml.cs @@ -4,9 +4,9 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; -public sealed partial class DISeparator : UserControl +public sealed partial class DDSeparator : UserControl { private Orientation _orientation = Orientation.Vertical; @@ -31,7 +31,7 @@ public Orientation Orientation } } - public DISeparator() + public DDSeparator() { InitializeComponent(); } diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml index 58cfd8921e..70bc5e7933 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml @@ -1,10 +1,10 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml.cs index 50a696268c..f6c3d0a649 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/EditToolsControl.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/EditToolsControl.xaml.cs @@ -2,11 +2,11 @@ // Licensed under the MIT License. using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; public sealed partial class EditToolsControl : UserControl { diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml index 8bc27746ba..d196aec834 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml @@ -1,102 +1,102 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml.cs similarity index 91% rename from tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml.cs index c56eb59184..f1f58f2f33 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ExpandedViewControl.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExpandedViewControl.xaml.cs @@ -2,11 +2,11 @@ // Licensed under the MIT License. using System; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; public sealed partial class ExpandedViewControl : UserControl { diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ExternalToolsManagementButton.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExternalToolsManagementButton.cs similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Controls/ExternalToolsManagementButton.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExternalToolsManagementButton.cs index c0f0ad6af3..460873e693 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ExternalToolsManagementButton.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ExternalToolsManagementButton.cs @@ -7,12 +7,12 @@ using System.Diagnostics; using System.Linq; using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; internal sealed class ExternalToolsManagementButton : AppBarButton { diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ProcessSelectionButton.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProcessSelectionButton.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Controls/ProcessSelectionButton.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProcessSelectionButton.cs index 5f7be3a327..7b21082ae4 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ProcessSelectionButton.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProcessSelectionButton.cs @@ -2,13 +2,13 @@ // Licensed under the MIT License. using System.Diagnostics; -using DevHome.DevInsights.Helpers; -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Helpers; +using DevHome.DevDiagnostics.Models; using Microsoft.UI.Input; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; -namespace DevHome.DevInsights.Controls; +namespace DevHome.DevDiagnostics.Controls; public class ProcessSelectionButton : AppBarButton { diff --git a/tools/DevInsights/DevHome.DevInsights/Controls/ProgressTextRing.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProgressTextRing.xaml similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Controls/ProgressTextRing.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProgressTextRing.xaml index e380bf1c43..5d0c456db6 100644 --- a/tools/DevInsights/DevHome.DevInsights/Controls/ProgressTextRing.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Controls/ProgressTextRing.xaml @@ -1,6 +1,6 @@ Oum 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�~6B*a(XPzHHZQp>4%Y&7=Brt1+AX8f7emwi59**N?EUc3s`Yt=~V453imbkG0f6hWN;4!D} zdOwMg8h6NKNnMRg&vCrZ|Lf}ng*hH$;?4m|b&XJ{x~|6a|0|Eexv{QV;MCR45R_&v zDPMpo%o-PeNnKstoEbA_AgFU0U0>tk*VL4kl`W~Mt3d<=s_O*(g^R0em{wL&?#b)X zcbxgv)r-qZpp39Zjf?L%Kn_{%`Z{Pfv!)K|0Ih&s+Jupwi&l zG~G8U-={X8r=+2l=h_plJE2cZNniHgR6H4%I1;8W4f;luFhf~h=fynZ_XvFBF;D)~ z@;VLru;W~ojw@k?QRTTWQ}taYaZTmv>q_NMT=ri~xTZ8oTMbn_#$}$GF4NRd%~#_R zM@?f~rt>UU!Zx2K63-U0Y}7B;a#1vs=Ap~$a3A*7*|^?zoc`bA`mN)9;Q?G2?-dtD z!@q$1F97e0t;kO~4t9B?&y4d2!6PzxeF;vJKIvAJ@BzIZCXH zqa9GJcol6>Yy;O`8_=Ez1~B70dqy~AdU!t@D1`f9bJPwFA41cD0@DD_aS_~(EAyw% znTACnbJ%xg{>-^^XU?3%-YfIOzqxZ}&Ag7$IYgK{SEMq>nLcwC{zRUDqyLTfIs5+s D^9AZs literal 0 HcmV?d00001 diff --git a/tools/DevInsights/DevHome.DevInsights/DIApp.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml similarity index 97% rename from tools/DevInsights/DevHome.DevInsights/DIApp.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml index 7d30c9fb6d..fc3fd74c14 100644 --- a/tools/DevInsights/DevHome.DevInsights/DIApp.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml @@ -1,65 +1,65 @@ - - - - - - - - - - - - - - - - 0,0,0,4 - 0,8,0,8 - -12,0,0,0 - - 12 - 12,0 - XamlAutoFontFamily - 20 - - SemiBold - - - - + + + + + + + + + + + + + + + + 0,0,0,4 + 0,8,0,8 + -12,0,0,0 + + 12 + 12,0 + XamlAutoFontFamily + 20 + + SemiBold + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/DIApp.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml.cs similarity index 86% rename from tools/DevInsights/DevHome.DevInsights/DIApp.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml.cs index f1207d2ba7..4b2b0b8570 100644 --- a/tools/DevInsights/DevHome.DevInsights/DIApp.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/DDApp.xaml.cs @@ -1,133 +1,133 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using DevHome.Common.Extensions; -using DevHome.Common.Services; -using DevHome.DevInsights.Helpers; - -using DevHome.DevInsights.Models; -using DevHome.DevInsights.Pages; -using DevHome.DevInsights.Services; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.TelemetryEvents; -using DevHome.DevInsights.ViewModels; -using DevHome.Telemetry; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.UI.Xaml; -using Windows.Storage; - -namespace DevHome.DevInsights; - -public partial class App : Application, IApp -{ - // The .NET Generic Host provides dependency injection, configuration, logging, and other services. - // https://docs.microsoft.com/dotnet/core/extensions/generic-host - // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection - // https://docs.microsoft.com/dotnet/core/extensions/configuration - // https://docs.microsoft.com/dotnet/core/extensions/logging - public IHost Host { get; } - - public T GetService() - where T : class => Host.GetService(); - - public Microsoft.UI.Dispatching.DispatcherQueue? UIDispatcher { get; } - - public App() - { - InitializeComponent(); - - UIDispatcher = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread(); - - Host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder() - .ConfigureServices((context, services) => - { - // Services - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - // Window - services.AddSingleton(); - - // Views and ViewModels - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - // Settings sub-pages and viewmodels. - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - }).Build(); - - // Provide an explicit implementationInstance otherwise AddSingleton does not create a new instance immediately. - // It will lazily init when the first component requires it but the hotkey helper needs to be registered immediately. - Application.Current.GetService(); - } - - internal static bool IsFeatureEnabled() - { - var isEnabled = false; - - ApplicationData.Current.LocalSettings.Values.TryGetValue($"ExperimentalFeature_DevInsightsExperiment", out var isEnabledObj); - if (isEnabledObj is not null && isEnabledObj is string isEnabledValue) - { - isEnabled = isEnabledValue == "true"; - } - else - { -#if DEBUG - // Override on debug builds to be enabled by default - isEnabled = true; -#endif - } - - return isEnabled; - } - - internal static ITelemetry Logger => TelemetryFactory.Get(); - - internal static void LogTimeTaken(string eventName, uint timeTakenMilliseconds, Guid? relatedActivityId = null) => Logger.LogTimeTaken(eventName, timeTakenMilliseconds, relatedActivityId); - - internal static void LogCritical(string eventName, bool isError = false, Guid? relatedActivityId = null) => Logger.LogCritical(eventName, isError, relatedActivityId); - - internal static void Log(string eventName, LogLevel level, T data, Guid? relatedActivityId = null) - where T : EventBase - { - Logger.Log(eventName, level, data, relatedActivityId ?? null); - } - - internal static void LogError(string eventName, LogLevel level, T data, Guid? relatedActivityId = null) - where T : EventBase - { - Logger.LogError(eventName, level, data, relatedActivityId); - } - - internal static void Log(string eventName, LogLevel level, Guid? relatedActivityId = null) => Logger.Log(eventName, level, new UsageEventData(), relatedActivityId); -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using DevHome.Common.Extensions; +using DevHome.Common.Services; +using DevHome.DevDiagnostics.Helpers; + +using DevHome.DevDiagnostics.Models; +using DevHome.DevDiagnostics.Pages; +using DevHome.DevDiagnostics.Services; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.TelemetryEvents; +using DevHome.DevDiagnostics.ViewModels; +using DevHome.Telemetry; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.UI.Xaml; +using Windows.Storage; + +namespace DevHome.DevDiagnostics; + +public partial class App : Application, IApp +{ + // The .NET Generic Host provides dependency injection, configuration, logging, and other services. + // https://docs.microsoft.com/dotnet/core/extensions/generic-host + // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection + // https://docs.microsoft.com/dotnet/core/extensions/configuration + // https://docs.microsoft.com/dotnet/core/extensions/logging + public IHost Host { get; } + + public T GetService() + where T : class => Host.GetService(); + + public Microsoft.UI.Dispatching.DispatcherQueue? UIDispatcher { get; } + + public App() + { + InitializeComponent(); + + UIDispatcher = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread(); + + Host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder() + .ConfigureServices((context, services) => + { + // Services + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + // Window + services.AddSingleton(); + + // Views and ViewModels + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + // Settings sub-_pages and viewmodels. + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + }).Build(); + + // Provide an explicit implementationInstance otherwise AddSingleton does not create a new instance immediately. + // It will lazily init when the first component requires it but the hotkey helper needs to be registered immediately. + Application.Current.GetService(); + } + + internal static bool IsFeatureEnabled() + { + var isEnabled = false; + + ApplicationData.Current.LocalSettings.Values.TryGetValue($"ExperimentalFeature_DevDiagnosticsExperiment", out var isEnabledObj); + if (isEnabledObj is not null && isEnabledObj is string isEnabledValue) + { + isEnabled = isEnabledValue == "true"; + } + else + { +#if DEBUG + // Override on debug builds to be enabled by default + isEnabled = true; +#endif + } + + return isEnabled; + } + + internal static ITelemetry Logger => TelemetryFactory.Get(); + + internal static void LogTimeTaken(string eventName, uint timeTakenMilliseconds, Guid? relatedActivityId = null) => Logger.LogTimeTaken(eventName, timeTakenMilliseconds, relatedActivityId); + + internal static void LogCritical(string eventName, bool isError = false, Guid? relatedActivityId = null) => Logger.LogCritical(eventName, isError, relatedActivityId); + + internal static void Log(string eventName, LogLevel level, T data, Guid? relatedActivityId = null) + where T : EventBase + { + Logger.Log(eventName, level, data, relatedActivityId ?? null); + } + + internal static void LogError(string eventName, LogLevel level, T data, Guid? relatedActivityId = null) + where T : EventBase + { + Logger.LogError(eventName, level, data, relatedActivityId); + } + + internal static void Log(string eventName, LogLevel level, Guid? relatedActivityId = null) => Logger.Log(eventName, level, new UsageEventData(), relatedActivityId); +} diff --git a/tools/DevInsights/DevHome.DevInsights/DevHome.DevInsights.csproj b/tools/DevDiagnostics/DevHome.DevDiagnostics/DevHome.DevDiagnostics.csproj similarity index 92% rename from tools/DevInsights/DevHome.DevInsights/DevHome.DevInsights.csproj rename to tools/DevDiagnostics/DevHome.DevDiagnostics/DevHome.DevDiagnostics.csproj index 1962f14ea9..29bf625272 100644 --- a/tools/DevInsights/DevHome.DevInsights/DevHome.DevInsights.csproj +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/DevHome.DevDiagnostics.csproj @@ -1,239 +1,240 @@ - - - - WinExe - DevHome.DevInsights - app.manifest - x86;x64;ARM64 - $(Platform) - win-x86;win-x64;win-arm64 - Properties\PublishProfiles\win-$(Platform).pubxml - true - false - enable - 12.0 - DevHome.DevInsights.Program - true - false - $(DefineConstants);DISABLE_XAML_GENERATED_MAIN - - - - 10.0.19041.0 - DI.ico - DI.ico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - $(DefaultXamlRuntime) - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - tlbimp - 0 - 1 - f935dc20-1cf0-11d0-adb9-00c04fd58a0b - 0 - false - true - - - - - - - - - - - - True - True - Settings.settings - - - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - Always - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - MSBuild:Compile - - - MSBuild:Compile - - - - - 7 - - - 7 - - - 7 - - - 7 - - - 7 - - - 7 - - - 7 - - - 7 - - - 7 - - + + + + WinExe + DevHome.DevDiagnostics + app.manifest + x86;x64;ARM64 + $(Platform) + win-x86;win-x64;win-arm64 + Properties\PublishProfiles\win-$(Platform).pubxml + true + false + enable + 12.0 + DevHome.DevDiagnostics.Program + true + false + $(DefineConstants);DISABLE_XAML_GENERATED_MAIN + + + + 10.0.19041.0 + DD.ico + DD.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + $(DefaultXamlRuntime) + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + tlbimp + 0 + 1 + f935dc20-1cf0-11d0-adb9-00c04fd58a0b + 0 + false + true + + + + + + + + + + + + True + True + Settings.settings + + + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + Always + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + MSBuild:Compile + + + MSBuild:Compile + + + + + 7 + + + 7 + + + 7 + + + 7 + + + 7 + + + 7 + + + 7 + + + 7 + + + 7 + + diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ClipboardMonitorInternalTool.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ClipboardMonitorInternalTool.cs similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ClipboardMonitorInternalTool.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ClipboardMonitorInternalTool.cs index 42bd4b4649..f0e1d87bbd 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ClipboardMonitorInternalTool.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ClipboardMonitorInternalTool.cs @@ -2,15 +2,15 @@ // Licensed under the MIT License. using System; -using DevHome.DevInsights.Properties; -using DevHome.DevInsights.Views; +using DevHome.DevDiagnostics.Properties; +using DevHome.DevDiagnostics.Views; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; using Windows.Graphics; using Windows.Win32.Foundation; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public class ClipboardMonitorInternalTool : Tool { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/CommonHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonHelper.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Helpers/CommonHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonHelper.cs index 120fa482b0..eacd2860b3 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/CommonHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonHelper.cs @@ -1,197 +1,197 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Management; -using System.Runtime.InteropServices; -using DevHome.Common.Extensions; -using DevHome.Common.Services; -using DevHome.Service; -using Microsoft.UI.Xaml; -using Serilog; -using Windows.ApplicationModel; -using Windows.Wdk.System.Threading; -using Windows.Win32.Foundation; -using Windows.Win32.System.Threading; -using WinRT; -using PInvokeWdk = Windows.Wdk.PInvoke; - -namespace DevHome.DevInsights.Helpers; - -internal sealed class CommonHelper -{ - public const string UnpinGlyph = "\uE77A"; - public const string PinGlyph = "\uE718"; - - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(CommonHelper)); - - internal static string GetLocalizedString(string stringName, params object[] args) - { - var stringResource = new StringResource(); - var localizedString = stringResource.GetLocalized(stringName, args); - Debug.Assert(!string.IsNullOrEmpty(localizedString), stringName + " is empty. Check if " + stringName + " is present in Resources.resw."); - return localizedString; - } - - internal static void RunAsAdmin(int pid, string pageName) - { - var startInfo = new ProcessStartInfo(); - startInfo.WindowStyle = ProcessWindowStyle.Hidden; - - var aliasSubDirectoryPath = $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.devinsights.exe"; - var aliasPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), aliasSubDirectoryPath); - startInfo.FileName = aliasPath; - - // Pass pid and the page from where the admin request came from - startInfo.Arguments = $"--pid {pid} --expandWindow {pageName}"; - startInfo.UseShellExecute = true; - startInfo.Verb = "runas"; - - var process = new Process(); - process.StartInfo = startInfo; - - // Since a UAC prompt will be shown, we need to wait for the process to exit - // This can also be cancelled by the user which will result in an exception - try - { - process.Start(); - - // Close the primary window for this instance and exit - var primaryWindow = Application.Current.GetService(); - primaryWindow.Close(); - } - catch (Win32Exception ex) - { - _log.Error(ex, "Could not run Dev Insights as admin"); - if (ex.NativeErrorCode == (int)WIN32_ERROR.ERROR_CANT_ACCESS_FILE) - { - var barWindow = Application.Current.GetService().DBarWindow; - barWindow?.ShowDialogToEnableAppExecutionAlias(); - } - else if (ex.NativeErrorCode == (int)WIN32_ERROR.ERROR_CANCELLED) - { - _log.Error(ex, "UAC to run Dev Insights as admin was denied"); - } - } - } - - public static unsafe int GetParentProcessId(Process process) - { - var pbi = default(PROCESS_BASIC_INFORMATION); - int status = PInvokeWdk.NtQueryInformationProcess((HANDLE)process.Handle, PROCESSINFOCLASS.ProcessBasicInformation, &pbi, (uint)Marshal.SizeOf(pbi), null); - if (status != 0) - { - throw new InvalidOperationException("Failed to query process information."); - } - - return (int)pbi.InheritedFromUniqueProcessId; - } - - public static HWND? TryGetParentProcessHWND() - { - try - { - using var process = Process.GetCurrentProcess(); - var parentProcessId = GetParentProcessId(process); - if (parentProcessId != 0) - { - using var parentProcess = Process.GetProcessById(parentProcessId); - return new HWND(parentProcess.MainWindowHandle); - } - } - catch (Exception ex) - { - _log.Error(ex, "Failed to get parent process HWND"); - } - - return null; - } - - public static string GetCommandLine(Process process) - { - var activationArgs = string.Empty; - try - { - using var searcher = new ManagementObjectSearcher( - $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}"); - if (searcher is null) - { - return activationArgs; - } - - using var objects = searcher.Get(); - if (objects is null) - { - return activationArgs; - } - - var obj = objects.Cast().FirstOrDefault(); - if (obj is not null) - { - activationArgs = obj["CommandLine"]?.ToString() ?? string.Empty; - } - } - catch (Exception ex) - { - _log.Error(ex, "Failed to get command line for process {ProcessId}", process.Id); - } - - return activationArgs; - } - - private static readonly Int32Converter _converter = new(); - - public static int? ParseStringToInt(string value) - { - int? valueAsInt; - - try - { - if (_converter.IsValid(value)) - { - // Int32Converter.ConvertFromString() does a pretty good job of parsing numbers, except when given a hex - // number that isn't prefixed with 0x. If it fails, try parsing it using int.Parse(). - valueAsInt = (int?)_converter.ConvertFromString(value); - } - else - { - valueAsInt = int.Parse(value, NumberStyles.HexNumber, CultureInfo.CurrentCulture); - } - } - catch - { - return null; - } - - return valueAsInt; - } - - public static int MulDiv(int number, int numerator, int denominator) - { - return (int)((((long)number * numerator) + (denominator >> 1)) / denominator); - } - - public static IDevHomeService GetDevHomeService() - { - var serverClass = new DevHomeServer(); - var serverPtr = Marshal.GetIUnknownForObject(serverClass); - var server = MarshalInterface.FromAbi(serverPtr); - - return server; - } - - [ComImport] - #if CANARY_BUILD - [Guid("0A920C6E-2569-44D1-A6E4-CE9FA44CD2A7")] - #elif STABLE_BUILD - [Guid("E8D40232-20A1-4F3B-9C0C-AAA6538698C6")] - #else - [Guid("1F98F450-C163-4A99-B257-E1E6CB3E1C57")] - #endif - public class DevHomeServer; -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Management; +using System.Runtime.InteropServices; +using DevHome.Common.Extensions; +using DevHome.Common.Services; +using DevHome.Service; +using Microsoft.UI.Xaml; +using Serilog; +using Windows.ApplicationModel; +using Windows.Wdk.System.Threading; +using Windows.Win32.Foundation; +using Windows.Win32.System.Threading; +using WinRT; +using PInvokeWdk = Windows.Wdk.PInvoke; + +namespace DevHome.DevDiagnostics.Helpers; + +internal sealed class CommonHelper +{ + public const string UnpinGlyph = "\uE77A"; + public const string PinGlyph = "\uE718"; + + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(CommonHelper)); + + internal static string GetLocalizedString(string stringName, params object[] args) + { + var stringResource = new StringResource(); + var localizedString = stringResource.GetLocalized(stringName, args); + Debug.Assert(!string.IsNullOrEmpty(localizedString), stringName + " is empty. Check if " + stringName + " is present in Resources.resw."); + return localizedString; + } + + internal static void RunAsAdmin(int pid, string pageName) + { + var startInfo = new ProcessStartInfo(); + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + + var aliasSubDirectoryPath = $"Microsoft\\WindowsApps\\{Package.Current.Id.FamilyName}\\devhome.devdiagnostics.exe"; + var aliasPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), aliasSubDirectoryPath); + startInfo.FileName = aliasPath; + + // Pass pid and the page from where the admin request came from + startInfo.Arguments = $"--pid {pid} --expandWindow {pageName}"; + startInfo.UseShellExecute = true; + startInfo.Verb = "runas"; + + var process = new Process(); + process.StartInfo = startInfo; + + // Since a UAC prompt will be shown, we need to wait for the process to exit + // This can also be cancelled by the user which will result in an exception + try + { + process.Start(); + + // Close the primary window for this instance and exit + var primaryWindow = Application.Current.GetService(); + primaryWindow.Close(); + } + catch (Win32Exception ex) + { + _log.Error(ex, "Could not run Dev Diagnostics as admin"); + if (ex.NativeErrorCode == (int)WIN32_ERROR.ERROR_CANT_ACCESS_FILE) + { + var barWindow = Application.Current.GetService().DBarWindow; + barWindow?.ShowDialogToEnableAppExecutionAlias(); + } + else if (ex.NativeErrorCode == (int)WIN32_ERROR.ERROR_CANCELLED) + { + _log.Error(ex, "UAC to run Dev Diagnostics as admin was denied"); + } + } + } + + public static unsafe int GetParentProcessId(Process process) + { + var pbi = default(PROCESS_BASIC_INFORMATION); + int status = PInvokeWdk.NtQueryInformationProcess((HANDLE)process.Handle, PROCESSINFOCLASS.ProcessBasicInformation, &pbi, (uint)Marshal.SizeOf(pbi), null); + if (status != 0) + { + throw new InvalidOperationException("Failed to query process information."); + } + + return (int)pbi.InheritedFromUniqueProcessId; + } + + public static HWND? TryGetParentProcessHWND() + { + try + { + using var process = Process.GetCurrentProcess(); + var parentProcessId = GetParentProcessId(process); + if (parentProcessId != 0) + { + using var parentProcess = Process.GetProcessById(parentProcessId); + return new HWND(parentProcess.MainWindowHandle); + } + } + catch (Exception ex) + { + _log.Error(ex, "Failed to get parent process HWND"); + } + + return null; + } + + public static string GetCommandLine(Process process) + { + var activationArgs = string.Empty; + try + { + using var searcher = new ManagementObjectSearcher( + $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}"); + if (searcher is null) + { + return activationArgs; + } + + using var objects = searcher.Get(); + if (objects is null) + { + return activationArgs; + } + + var obj = objects.Cast().FirstOrDefault(); + if (obj is not null) + { + activationArgs = obj["CommandLine"]?.ToString() ?? string.Empty; + } + } + catch (Exception ex) + { + _log.Error(ex, "Failed to get command line for process {ProcessId}", process.Id); + } + + return activationArgs; + } + + private static readonly Int32Converter _converter = new(); + + public static int? ParseStringToInt(string value) + { + int? valueAsInt; + + try + { + if (_converter.IsValid(value)) + { + // Int32Converter.ConvertFromString() does a pretty good job of parsing numbers, except when given a hex + // number that isn't prefixed with 0x. If it fails, try parsing it using int.Parse(). + valueAsInt = (int?)_converter.ConvertFromString(value); + } + else + { + valueAsInt = int.Parse(value, NumberStyles.HexNumber, CultureInfo.CurrentCulture); + } + } + catch + { + return null; + } + + return valueAsInt; + } + + public static int MulDiv(int number, int numerator, int denominator) + { + return (int)((((long)number * numerator) + (denominator >> 1)) / denominator); + } + + public static IDevHomeService GetDevHomeService() + { + var serverClass = new DevHomeServer(); + var serverPtr = Marshal.GetIUnknownForObject(serverClass); + var server = MarshalInterface.FromAbi(serverPtr); + + return server; + } + + [ComImport] + #if CANARY_BUILD + [Guid("0A920C6E-2569-44D1-A6E4-CE9FA44CD2A7")] + #elif STABLE_BUILD + [Guid("E8D40232-20A1-4F3B-9C0C-AAA6538698C6")] + #else + [Guid("1F98F450-C163-4A99-B257-E1E6CB3E1C57")] + #endif + public class DevHomeServer; +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/CommonInterop.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonInterop.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Helpers/CommonInterop.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonInterop.cs index 677fd48299..1c961d3cbc 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/CommonInterop.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CommonInterop.cs @@ -1,21 +1,21 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Runtime.InteropServices; -using Windows.Win32.Foundation; -using Windows.Win32.UI.WindowsAndMessaging; - -namespace DevHome.DevInsights.Helpers; - -internal sealed class CommonInterop -{ - // CSWin32 will not produce these methods for x86 so we need to define them here. - [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "SetWindowLongPtrW", SetLastError = true)] - internal static extern nint SetWindowLongPtr64(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong); - - [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "GetWindowLongPtrW", SetLastError = true)] - internal static extern nint GetWindowLongPtr64(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex); - - [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "GetClassLongPtrW", SetLastError = true)] - internal static extern nint GetClassLongPtr64(HWND hWnd, GET_CLASS_LONG_INDEX nIndex); -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Runtime.InteropServices; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace DevHome.DevDiagnostics.Helpers; + +internal sealed class CommonInterop +{ + // CSWin32 will not produce these methods for x86 so we need to define them here. + [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "SetWindowLongPtrW", SetLastError = true)] + internal static extern nint SetWindowLongPtr64(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong); + + [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "GetWindowLongPtrW", SetLastError = true)] + internal static extern nint GetWindowLongPtr64(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex); + + [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "GetClassLongPtrW", SetLastError = true)] + internal static extern nint GetClassLongPtr64(HWND hWnd, GET_CLASS_LONG_INDEX nIndex); +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/CountToVisibilityConverter.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CountToVisibilityConverter.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Helpers/CountToVisibilityConverter.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CountToVisibilityConverter.cs index c6d6b0184a..0b2d6757f0 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/CountToVisibilityConverter.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/CountToVisibilityConverter.cs @@ -5,7 +5,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Data; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public class CountToVisibilityConverter : IValueConverter { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/DebugMonitor.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/DebugMonitor.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/DebugMonitor.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/DebugMonitor.cs index 40bd877ccd..b8d5f89602 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/DebugMonitor.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/DebugMonitor.cs @@ -1,153 +1,153 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.IO.MemoryMappedFiles; -using System.Text; -using System.Threading; -using DevHome.DevInsights.Models; - -namespace DevHome.DevInsights.Helpers; - -public sealed class DebugMonitor : IDisposable -{ - private readonly Process targetProcess; - private readonly ObservableCollection output; - private readonly EventWaitHandle stopEvent; - private readonly string errorMessageText = CommonHelper.GetLocalizedString("WinLogsAlreadyRunningErrorMessage"); - - private const string MutexName = "DevHome.PI.DebugMonitor.SingletonMutex"; - private const string StopEventName = "DebugMonitorStopEvent"; - private const string DBWinBufferReadyName = "DBWIN_BUFFER_READY"; - private const string DBWinDataReadyName = "DBWIN_DATA_READY"; - private const string DBWinBufferName = "DBWIN_BUFFER"; - - private static readonly List IgnoreLogList = []; - - public DebugMonitor(Process targetProcess, ObservableCollection output) - { - this.targetProcess = targetProcess; - this.targetProcess.Exited += TargetProcess_Exited; - this.output = output; - - stopEvent = new EventWaitHandle(false, EventResetMode.AutoReset, StopEventName); - } - - public void Start() - { - stopEvent.Reset(); - - // Don't initiate if debugger is attached. It makes debugging very slow. - if (Debugger.IsAttached) - { - return; - } - - // Check for multiple instances. It is possible to have multiple debug monitors listen on OutputDebugString, - // but the message would be randomly distributed among all running instances. - using var singletonMutex = new Mutex(false, MutexName, out var createdNew); - if (!createdNew) - { - throw new InvalidOperationException($"Failed to get the {MutexName} mutex."); - } - - bool isNewBufferReadyEvent; - using var bufferReadyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, DBWinBufferReadyName, out isNewBufferReadyEvent); - bool isNewDataReadyEvent; - using var dataReadyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, DBWinDataReadyName, out isNewDataReadyEvent); - - // Don't initiate if there is an existing OutputDebugString monitor running - if (!isNewBufferReadyEvent || !isNewDataReadyEvent) - { - WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, errorMessageText, WinLogsHelper.DebugOutputLogsName); - output.Add(entry); - return; - } - - using var memoryMappedFile = MemoryMappedFile.CreateNew(DBWinBufferName, 4096); - while (true) - { - bufferReadyEvent.Set(); - var waitResult = WaitHandle.WaitAny(new[] { stopEvent, dataReadyEvent }); - - // Stop listenting to OutputDebugString if the debugger is attached. It makes debugging very slow. - if (Debugger.IsAttached) - { - break; - } - - // Stop event is triggered. - if (waitResult == 0) - { - break; - } - - if (waitResult == 1) - { - var timeGenerated = DateTime.Now; - - // The first DWORD of the shared memory buffer contains - // the process ID of the client that sent the debug string. - using var viewStream = memoryMappedFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read); - using BinaryReader binaryReader = new BinaryReader(viewStream); - var pid = binaryReader.ReadUInt32(); - - if (pid == targetProcess.Id) - { - // Get the message from the stream. - var stringBuilder = new StringBuilder(); - while (binaryReader.PeekChar() != '\0') - { - stringBuilder.Append(binaryReader.ReadChar()); - } - - var entryMessage = stringBuilder.ToString(); - - if (!string.IsNullOrWhiteSpace(entryMessage)) - { - var hasIgnoreLog = false; - foreach (var ignoreLog in IgnoreLogList) - { - if (entryMessage.Contains(ignoreLog)) - { - hasIgnoreLog = true; - } - } - - if (!hasIgnoreLog) - { - WinLogsEntry entry = new(timeGenerated, WinLogCategory.Debug, entryMessage, WinLogsHelper.DebugOutputLogsName); - output.Add(entry); - } - } - } - } - } - } - - public void Stop() - { - if (!stopEvent.SafeWaitHandle.IsClosed) - { - stopEvent.Set(); - } - } - - public void Dispose() - { - stopEvent.Close(); - stopEvent.Dispose(); - - GC.SuppressFinalize(this); - } - - private void TargetProcess_Exited(object? sender, EventArgs e) - { - Stop(); - Dispose(); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.IO.MemoryMappedFiles; +using System.Text; +using System.Threading; +using DevHome.DevDiagnostics.Models; + +namespace DevHome.DevDiagnostics.Helpers; + +public sealed class DebugMonitor : IDisposable +{ + private readonly Process targetProcess; + private readonly ObservableCollection output; + private readonly EventWaitHandle stopEvent; + private readonly string errorMessageText = CommonHelper.GetLocalizedString("WinLogsAlreadyRunningErrorMessage"); + + private const string MutexName = "DevHome.PI.DebugMonitor.SingletonMutex"; + private const string StopEventName = "DebugMonitorStopEvent"; + private const string DBWinBufferReadyName = "DBWIN_BUFFER_READY"; + private const string DBWinDataReadyName = "DBWIN_DATA_READY"; + private const string DBWinBufferName = "DBWIN_BUFFER"; + + private static readonly List IgnoreLogList = []; + + public DebugMonitor(Process targetProcess, ObservableCollection output) + { + this.targetProcess = targetProcess; + this.targetProcess.Exited += TargetProcess_Exited; + this.output = output; + + stopEvent = new EventWaitHandle(false, EventResetMode.AutoReset, StopEventName); + } + + public void Start() + { + stopEvent.Reset(); + + // Don't initiate if debugger is attached. It makes debugging very slow. + if (Debugger.IsAttached) + { + return; + } + + // Check for multiple instances. It is possible to have multiple debug monitors listen on OutputDebugString, + // but the message would be randomly distributed among all running instances. + using var singletonMutex = new Mutex(false, MutexName, out var createdNew); + if (!createdNew) + { + throw new InvalidOperationException($"Failed to get the {MutexName} mutex."); + } + + bool isNewBufferReadyEvent; + using var bufferReadyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, DBWinBufferReadyName, out isNewBufferReadyEvent); + bool isNewDataReadyEvent; + using var dataReadyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, DBWinDataReadyName, out isNewDataReadyEvent); + + // Don't initiate if there is an existing OutputDebugString monitor running + if (!isNewBufferReadyEvent || !isNewDataReadyEvent) + { + WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, errorMessageText, WinLogsHelper.DebugOutputLogsName); + output.Add(entry); + return; + } + + using var memoryMappedFile = MemoryMappedFile.CreateNew(DBWinBufferName, 4096); + while (true) + { + bufferReadyEvent.Set(); + var waitResult = WaitHandle.WaitAny(new[] { stopEvent, dataReadyEvent }); + + // Stop listenting to OutputDebugString if the debugger is attached. It makes debugging very slow. + if (Debugger.IsAttached) + { + break; + } + + // Stop event is triggered. + if (waitResult == 0) + { + break; + } + + if (waitResult == 1) + { + var timeGenerated = DateTime.Now; + + // The first DWORD of the shared memory buffer contains + // the process ID of the client that sent the debug string. + using var viewStream = memoryMappedFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read); + using BinaryReader binaryReader = new BinaryReader(viewStream); + var pid = binaryReader.ReadUInt32(); + + if (pid == targetProcess.Id) + { + // Get the message from the stream. + var stringBuilder = new StringBuilder(); + while (binaryReader.PeekChar() != '\0') + { + stringBuilder.Append(binaryReader.ReadChar()); + } + + var entryMessage = stringBuilder.ToString(); + + if (!string.IsNullOrWhiteSpace(entryMessage)) + { + var hasIgnoreLog = false; + foreach (var ignoreLog in IgnoreLogList) + { + if (entryMessage.Contains(ignoreLog)) + { + hasIgnoreLog = true; + } + } + + if (!hasIgnoreLog) + { + WinLogsEntry entry = new(timeGenerated, WinLogCategory.Debug, entryMessage, WinLogsHelper.DebugOutputLogsName); + output.Add(entry); + } + } + } + } + } + } + + public void Stop() + { + if (!stopEvent.SafeWaitHandle.IsClosed) + { + stopEvent.Set(); + } + } + + public void Dispose() + { + stopEvent.Close(); + stopEvent.Dispose(); + + GC.SuppressFinalize(this); + } + + private void TargetProcess_Exited(object? sender, EventArgs e) + { + Stop(); + Dispose(); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ETWHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ETWHelper.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ETWHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ETWHelper.cs index 74a9eaf7f6..f5cd16cc6f 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ETWHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ETWHelper.cs @@ -1,187 +1,187 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Security.Principal; -using DevHome.DevInsights.Models; -using Microsoft.Diagnostics.Tracing; -using Microsoft.Diagnostics.Tracing.Session; -using Serilog; - -namespace DevHome.DevInsights.Helpers; - -internal sealed class ETWHelper : IDisposable -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ETWHelper)); - private readonly Process _targetProcess; - private readonly ObservableCollection _output; - - private static readonly List _providerList = ["1AFF6089-E863-4D36-BDFD-3581F07440BE" /*COM Tracelog*/]; - private TraceEventSession? _session; - - // From: https://learn.microsoft.com/windows-server/identity/ad-ds/manage/understand-security-identifiers - private const string PerformanceLogUsersSid = "S-1-5-32-559"; - - public const string AddUserToPerformanceLogUsersSid = @" - Add-LocalGroupMember -Sid S-1-5-32-559 -Member ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name) - # Check if the last command succeeded - if ($?) - { - # User added to the Performance Log Users group. - exit 0 - } - exit 1 - "; - - public ETWHelper(Process targetProcess, ObservableCollection output) - { - _targetProcess = targetProcess; - _targetProcess.Exited += TargetProcess_Exited; - _output = output; - } - - public void Start() - { - var isUserInPerformanceLogUsersGroup = IsUserInPerformanceLogUsersGroup(); - - if (!isUserInPerformanceLogUsersGroup) - { - isUserInPerformanceLogUsersGroup = TryAddUserToPerformanceLogUsersGroup(); - } - - if (isUserInPerformanceLogUsersGroup) - { - var sessionName = "DevHomePITrace" + Process.GetCurrentProcess().SessionId; - - // Stop and dispose any existing session - _session = TraceEventSession.GetActiveSession(sessionName); - if (_session is not null) - { - _session.Stop(); - _session.Dispose(); - } - - try - { - using (_session = new TraceEventSession(sessionName)) - { - // Filter the provider events based on processId - var providerOptions = new TraceEventProviderOptions { ProcessIDFilter = [_targetProcess.Id] }; - foreach (var provider in _providerList) - { - _session.EnableProvider(provider, TraceEventLevel.Always, options: providerOptions); - } - - _session.Source.Dynamic.All += EventsHandler; - _session.Source.UnhandledEvents += UnHandledEventsHandler; - _session.Source.Process(); - } - } - catch (UnauthorizedAccessException ex) - { - Stop(); - WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, ex.Message, WinLogsHelper.EtwLogsName); - _output.Add(entry); - } - } - } - - public void Stop() - { - _session?.Stop(); - } - - public void Dispose() - { - _session?.Dispose(); - GC.SuppressFinalize(this); - } - - private void EventsHandler(TraceEvent traceEvent) - { - ETWEventHandler(traceEvent.ProcessID, traceEvent.TimeStamp, traceEvent.Level, traceEvent.ToString(CultureInfo.CurrentCulture)); - } - - private void UnHandledEventsHandler(TraceEvent traceEvent) - { - var errorMessage = CommonHelper.GetLocalizedString("UnhandledTraceEventErrorMessage", traceEvent.Dump()); - ETWEventHandler(traceEvent.ProcessID, traceEvent.TimeStamp, traceEvent.Level, errorMessage); - } - - private void ETWEventHandler(int processId, DateTime timeStamp, TraceEventLevel level, string message) - { - if (processId != _targetProcess.Id) - { - return; - } - - var category = WinLogsHelper.ConvertTraceEventLevelToWinLogCategory(level); - var entry = new WinLogsEntry(timeStamp, category, message, WinLogsHelper.EtwLogsName); - _output.Add(entry); - } - - private void TargetProcess_Exited(object? sender, EventArgs e) - { - Stop(); - Dispose(); - } - - public static bool IsUserInPerformanceLogUsersGroup() - { - WindowsIdentity processUserIdentity = WindowsIdentity.GetCurrent(); - var isPerformanceLogSidFound = processUserIdentity.Groups?.Any(sid => sid.Value == PerformanceLogUsersSid); - return isPerformanceLogSidFound ?? false; - } - - public static bool TryAddUserToPerformanceLogUsersGroup() - { - WindowsIdentity processUserIdentity = WindowsIdentity.GetCurrent(); - var userName = processUserIdentity.Name; - if (userName is null) - { - _log.Error("Unable to get the current user name"); - return false; - } - - var startInfo = new ProcessStartInfo(); - startInfo.WindowStyle = ProcessWindowStyle.Hidden; - startInfo.FileName = $"powershell.exe"; - - // Add the user to the Performance Log Users group - startInfo.Arguments = $"-ExecutionPolicy Bypass -Command \"{AddUserToPerformanceLogUsersSid}\""; - startInfo.UseShellExecute = true; - startInfo.Verb = "runas"; - - var process = new Process(); - process.StartInfo = startInfo; - - // Since a UAC prompt will be shown, we need to wait for the process to exit - // This can also be cancelled by the user which will result in an exception - try - { - process.Start(); - process.WaitForExit(); - - if (process.ExitCode == 0) - { - return true; - } - else - { - _log.Error("Unable to add the user to the Performance Log Users group"); - return false; - } - } - catch (Exception ex) - { - _log.Error(ex, "UAC to add the user to the Performance Log Users group was denied"); - } - - return false; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Security.Principal; +using DevHome.DevDiagnostics.Models; +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.Tracing.Session; +using Serilog; + +namespace DevHome.DevDiagnostics.Helpers; + +internal sealed class ETWHelper : IDisposable +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ETWHelper)); + private readonly Process _targetProcess; + private readonly ObservableCollection _output; + + private static readonly List _providerList = ["1AFF6089-E863-4D36-BDFD-3581F07440BE" /*COM Tracelog*/]; + private TraceEventSession? _session; + + // From: https://learn.microsoft.com/windows-server/identity/ad-ds/manage/understand-security-identifiers + private const string PerformanceLogUsersSid = "S-1-5-32-559"; + + public const string AddUserToPerformanceLogUsersSid = @" + Add-LocalGroupMember -Sid S-1-5-32-559 -Member ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name) + # Check if the last command succeeded + if ($?) + { + # User added to the Performance Log Users group. + exit 0 + } + exit 1 + "; + + public ETWHelper(Process targetProcess, ObservableCollection output) + { + _targetProcess = targetProcess; + _targetProcess.Exited += TargetProcess_Exited; + _output = output; + } + + public void Start() + { + var isUserInPerformanceLogUsersGroup = IsUserInPerformanceLogUsersGroup(); + + if (!isUserInPerformanceLogUsersGroup) + { + isUserInPerformanceLogUsersGroup = TryAddUserToPerformanceLogUsersGroup(); + } + + if (isUserInPerformanceLogUsersGroup) + { + var sessionName = "DevHomePITrace" + Process.GetCurrentProcess().SessionId; + + // Stop and dispose any existing session + _session = TraceEventSession.GetActiveSession(sessionName); + if (_session is not null) + { + _session.Stop(); + _session.Dispose(); + } + + try + { + using (_session = new TraceEventSession(sessionName)) + { + // Filter the provider events based on processId + var providerOptions = new TraceEventProviderOptions { ProcessIDFilter = [_targetProcess.Id] }; + foreach (var provider in _providerList) + { + _session.EnableProvider(provider, TraceEventLevel.Always, options: providerOptions); + } + + _session.Source.Dynamic.All += EventsHandler; + _session.Source.UnhandledEvents += UnHandledEventsHandler; + _session.Source.Process(); + } + } + catch (UnauthorizedAccessException ex) + { + Stop(); + WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, ex.Message, WinLogsHelper.EtwLogsName); + _output.Add(entry); + } + } + } + + public void Stop() + { + _session?.Stop(); + } + + public void Dispose() + { + _session?.Dispose(); + GC.SuppressFinalize(this); + } + + private void EventsHandler(TraceEvent traceEvent) + { + ETWEventHandler(traceEvent.ProcessID, traceEvent.TimeStamp, traceEvent.Level, traceEvent.ToString(CultureInfo.CurrentCulture)); + } + + private void UnHandledEventsHandler(TraceEvent traceEvent) + { + var errorMessage = CommonHelper.GetLocalizedString("UnhandledTraceEventErrorMessage", traceEvent.Dump()); + ETWEventHandler(traceEvent.ProcessID, traceEvent.TimeStamp, traceEvent.Level, errorMessage); + } + + private void ETWEventHandler(int processId, DateTime timeStamp, TraceEventLevel level, string message) + { + if (processId != _targetProcess.Id) + { + return; + } + + var category = WinLogsHelper.ConvertTraceEventLevelToWinLogCategory(level); + var entry = new WinLogsEntry(timeStamp, category, message, WinLogsHelper.EtwLogsName); + _output.Add(entry); + } + + private void TargetProcess_Exited(object? sender, EventArgs e) + { + Stop(); + Dispose(); + } + + public static bool IsUserInPerformanceLogUsersGroup() + { + WindowsIdentity processUserIdentity = WindowsIdentity.GetCurrent(); + var isPerformanceLogSidFound = processUserIdentity.Groups?.Any(sid => sid.Value == PerformanceLogUsersSid); + return isPerformanceLogSidFound ?? false; + } + + public static bool TryAddUserToPerformanceLogUsersGroup() + { + WindowsIdentity processUserIdentity = WindowsIdentity.GetCurrent(); + var userName = processUserIdentity.Name; + if (userName is null) + { + _log.Error("Unable to get the current user name"); + return false; + } + + var startInfo = new ProcessStartInfo(); + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.FileName = $"powershell.exe"; + + // Add the user to the Performance Log Users group + startInfo.Arguments = $"-ExecutionPolicy Bypass -Command \"{AddUserToPerformanceLogUsersSid}\""; + startInfo.UseShellExecute = true; + startInfo.Verb = "runas"; + + var process = new Process(); + process.StartInfo = startInfo; + + // Since a UAC prompt will be shown, we need to wait for the process to exit + // This can also be cancelled by the user which will result in an exception + try + { + process.Start(); + process.WaitForExit(); + + if (process.ExitCode == 0) + { + return true; + } + else + { + _log.Error("Unable to add the user to the Performance Log Users group"); + return false; + } + } + catch (Exception ex) + { + _log.Error(ex, "UAC to add the user to the Performance Log Users group was denied"); + } + + return false; + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/EnumStringConverter.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EnumStringConverter.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/EnumStringConverter.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EnumStringConverter.cs index 6e7b07c31c..08825d09fb 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/EnumStringConverter.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EnumStringConverter.cs @@ -5,7 +5,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; #pragma warning disable SA1649 // File name should match first type name public class EnumStringConverter : JsonConverter diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ErrorLookupHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ErrorLookupHelper.cs similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ErrorLookupHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ErrorLookupHelper.cs index 20de3532d7..9f1a240dcd 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ErrorLookupHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ErrorLookupHelper.cs @@ -9,12 +9,12 @@ using Microsoft.Data.Sqlite; using Serilog; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; internal sealed class ErrorLookupHelper -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ErrorLookupHelper)); - +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ErrorLookupHelper)); + private static SqliteConnectionStringBuilder? _dbConnectionString; private static SqliteConnectionStringBuilder DbConnectionString diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/EventViewerHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EventViewerHelper.cs similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Helpers/EventViewerHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EventViewerHelper.cs index db426c1d6d..a086bff6c3 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/EventViewerHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/EventViewerHelper.cs @@ -1,82 +1,82 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.Diagnostics.Eventing.Reader; -using DevHome.DevInsights.Models; - -namespace DevHome.DevInsights.Helpers; - -internal sealed class EventViewerHelper : IDisposable -{ - private readonly Process targetProcess; - private readonly ObservableCollection output; - private readonly EventLogWatcher? eventLogWatcher; - - public EventViewerHelper(Process targetProcess, ObservableCollection output) - { - this.targetProcess = targetProcess; - this.targetProcess.Exited += TargetProcess_Exited; - this.output = output; - - try - { - // Subscribe for Application events matching the processName. - var filterQuery = "*[System[Provider[@Name=\"" + targetProcess.ProcessName + "\"]]]"; - EventLogQuery subscriptionQuery = new("Application", PathType.LogName, filterQuery); - eventLogWatcher = new EventLogWatcher(subscriptionQuery); - eventLogWatcher.EventRecordWritten += new EventHandler(EventLogEventRead); - } - catch (EventLogReadingException) - { - var message = CommonHelper.GetLocalizedString("UnableToStartEventViewerErrorMessage"); - WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, message, WinLogsHelper.EventViewerName); - output.Add(entry); - } - } - - public void Start() - { - if (eventLogWatcher is not null) - { - eventLogWatcher.Enabled = true; - } - } - - public void Stop() - { - if (eventLogWatcher is not null) - { - eventLogWatcher.Enabled = false; - } - } - - public void Dispose() - { - if (eventLogWatcher is not null) - { - eventLogWatcher.Dispose(); - } - - GC.SuppressFinalize(this); - } - - public void EventLogEventRead(object? obj, EventRecordWrittenEventArgs eventArg) - { - if (eventArg.EventRecord != null) - { - WinLogCategory category = WinLogsHelper.ConvertStandardEventLevelToWinLogCategory(eventArg.EventRecord.Level); - var message = eventArg.EventRecord.FormatDescription(); - WinLogsEntry entry = new(eventArg.EventRecord.TimeCreated, category, message, WinLogsHelper.EventViewerName); - output.Add(entry); - } - } - - private void TargetProcess_Exited(object? sender, EventArgs e) - { - Stop(); - Dispose(); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; +using DevHome.DevDiagnostics.Models; + +namespace DevHome.DevDiagnostics.Helpers; + +internal sealed class EventViewerHelper : IDisposable +{ + private readonly Process targetProcess; + private readonly ObservableCollection output; + private readonly EventLogWatcher? eventLogWatcher; + + public EventViewerHelper(Process targetProcess, ObservableCollection output) + { + this.targetProcess = targetProcess; + this.targetProcess.Exited += TargetProcess_Exited; + this.output = output; + + try + { + // Subscribe for Application events matching the processName. + var filterQuery = "*[System[Provider[@Name=\"" + targetProcess.ProcessName + "\"]]]"; + EventLogQuery subscriptionQuery = new("Application", PathType.LogName, filterQuery); + eventLogWatcher = new EventLogWatcher(subscriptionQuery); + eventLogWatcher.EventRecordWritten += new EventHandler(EventLogEventRead); + } + catch (EventLogReadingException) + { + var message = CommonHelper.GetLocalizedString("UnableToStartEventViewerErrorMessage"); + WinLogsEntry entry = new(DateTime.Now, WinLogCategory.Error, message, WinLogsHelper.EventViewerName); + output.Add(entry); + } + } + + public void Start() + { + if (eventLogWatcher is not null) + { + eventLogWatcher.Enabled = true; + } + } + + public void Stop() + { + if (eventLogWatcher is not null) + { + eventLogWatcher.Enabled = false; + } + } + + public void Dispose() + { + if (eventLogWatcher is not null) + { + eventLogWatcher.Dispose(); + } + + GC.SuppressFinalize(this); + } + + public void EventLogEventRead(object? obj, EventRecordWrittenEventArgs eventArg) + { + if (eventArg.EventRecord != null) + { + WinLogCategory category = WinLogsHelper.ConvertStandardEventLevelToWinLogCategory(eventArg.EventRecord.Level); + var message = eventArg.EventRecord.FormatDescription(); + WinLogsEntry entry = new(eventArg.EventRecord.TimeCreated, category, message, WinLogsHelper.EventViewerName); + output.Add(entry); + } + } + + private void TargetProcess_Exited(object? sender, EventArgs e) + { + Stop(); + Dispose(); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ExpanderBehavior.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExpanderBehavior.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ExpanderBehavior.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExpanderBehavior.cs index d18a9ab2e9..ce4e018812 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ExpanderBehavior.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExpanderBehavior.cs @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Models; using Microsoft.UI.Xaml.Controls; using Microsoft.Xaml.Interactivity; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public class ExpanderBehavior : Behavior { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool.cs index c5f345d3f8..2ad181d4dd 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool.cs @@ -1,313 +1,313 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Text.Json.Serialization; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using DevHome.Common.Extensions; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Serilog; -using Windows.System; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.System.Com; -using Windows.Win32.UI.WindowsAndMessaging; -using static DevHome.DevInsights.Helpers.WindowHelper; - -namespace DevHome.DevInsights.Helpers; - -public enum ToolActivationType -{ - Protocol, - Msix, - Launch, -} - -public partial class ExternalTool : Tool -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ExternalTool)); - private readonly string _errorTitleText = CommonHelper.GetLocalizedString("ToolLaunchErrorTitle"); - - private readonly string _errorMessageText = CommonHelper.GetLocalizedString("ToolLaunchErrorMessage"); - - public string ID { get; private set; } - - public string Executable { get; private set; } - - [JsonConverter(typeof(EnumStringConverter))] - public ToolActivationType ActivationType { get; private set; } = ToolActivationType.Launch; - - public string Arguments { get; private set; } - - public string ExtraInfo { get; private set; } - - public string AppUserModelId { get; private set; } - - public string IconFilePath { get; private set; } - - public ExternalTool( - string name, - string executable, - ToolActivationType activationType, - string arguments = "", - string extraInfo = "", - string appUserModelId = "", - string iconFilePath = "", - ToolType type = ToolType.Unknown, - bool isPinned = false) - : base(name, type, isPinned) - { - Executable = executable; - ActivationType = activationType; - Arguments = arguments; - ExtraInfo = extraInfo; - AppUserModelId = appUserModelId; - IconFilePath = iconFilePath; - - ID = Guid.NewGuid().ToString(); - - if (!string.IsNullOrEmpty(executable)) - { - GetIcons(); - } - } - - private async void GetIcons() - { - try - { - if (!string.IsNullOrEmpty(IconFilePath)) - { - ToolIconSource = await GetSoftwareBitmapSourceFromImageFilePath(IconFilePath); - } - else - { - var softwareBitmap = GetSoftwareBitmapFromExecutable(Executable); - if (softwareBitmap is not null) - { - ToolIconSource = await GetSoftwareBitmapSourceFromSoftwareBitmapAsync(softwareBitmap); - } - } - } - catch (Exception ex) - { - _log.Error(ex, "Failed to get tool image"); - } - } - - public override IconElement GetIcon() - { - return new ImageIcon - { - Source = ToolIconSource, - }; - } - - internal async override void InvokeTool(ToolLaunchOptions options) - { - try - { - await InvokeToolInternal(options); - } - catch (Exception ex) - { - _log.Error(ex, "Tool launched failed"); - - var builder = new StringBuilder(); - builder.AppendLine(ex.Message); - if (ex.InnerException is not null) - { - builder.AppendLine(ex.InnerException.Message); - } - - var errorMessage = string.Format(CultureInfo.CurrentCulture, builder.ToString(), Executable); - PInvoke.MessageBox(HWND.Null, errorMessage, _errorTitleText, MESSAGEBOX_STYLE.MB_ICONERROR); - } - } - - internal void ValidateOptions(ToolLaunchOptions options) - { - // We can only get stdout if we're launching the process via CreateProcess. - if (options.RedirectStandardOut && ActivationType != ToolActivationType.Launch) - { - throw new InvalidOperationException("Can only redirect StandardOut with a CreateProcess launch"); - } - } - - private string CreateCommandLine(ToolLaunchOptions options) - { - var commandLineArgs = string.Empty; - if (!string.IsNullOrEmpty(Arguments)) - { - var argumentVariables = new Dictionary(); - if (options.TargetProcessId.HasValue) - { - argumentVariables.Add("pid", options.TargetProcessId.Value.ToString(CultureInfo.InvariantCulture)); - } - - if (options.TargetHWnd != HWND.Null) - { - argumentVariables.Add("hwnd", ((int)options.TargetHWnd).ToString(CultureInfo.InvariantCulture)); - } - - if (Type.HasFlag(ToolType.DumpAnalyzer) && options.CommandLineParams is not null) - { - argumentVariables.Add("crashDumpPath", options.CommandLineParams); - } - - commandLineArgs = ReplaceKnownVariables(Arguments, argumentVariables); - } - - return commandLineArgs; - } - - internal async Task InvokeToolInternal(ToolLaunchOptions options) - { - var process = default(Process); - - ValidateOptions(options); - - string commandLineArgs = CreateCommandLine(options); - - try - { - if (ActivationType == ToolActivationType.Protocol) - { - // Docs say this returns true if the default app for the URI scheme was launched; - // false otherwise. However, if there's no registered app for the protocol, it shows - // the "get an app from the store" dialog, and returns true. So we can't rely on the - // return value to know if the tool was actually launched. - var result = await Launcher.LaunchUriAsync(new Uri(commandLineArgs)); - if (result != true) - { - // We get here if the user supplied a valid registered protocol, but the app failed to launch. - var errorMessage = string.Format( - CultureInfo.InvariantCulture, _errorMessageText, commandLineArgs); - throw new InvalidOperationException(errorMessage); - } - - // Currently we can't get the process object of the launched app via LaunchUriAsync. If we - // ever do and want to populate ToolLaunchOptions.LaunchedProcess, we'll need to revisit the async behavior here, - // as when we return from this function (and our async operation is still ongoing) our callers currently expect to - // be able to read ToolLaunchOptions.LaunchedProcess immedately... there isn't an indication that they would need to - // do an await first. - } - else - { - if (ActivationType == ToolActivationType.Msix) - { - process = LaunchPackagedTool(AppUserModelId); - } - else - { - var finalExecutable = string.Empty; - var finalArguments = string.Empty; - - if (Path.GetExtension(Executable).Equals(".msc", StringComparison.OrdinalIgnoreCase)) - { - // Note: running most msc files requires elevation. - finalExecutable = "mmc.exe"; - finalArguments = $"{Executable} {commandLineArgs}"; - } - else if (Path.GetExtension(Executable).Equals(".ps1", StringComparison.OrdinalIgnoreCase)) - { - // Note: running powershell scripts might require setting the execution policy. - finalExecutable = "powershell.exe"; - finalArguments = $"{Executable} {commandLineArgs}"; - } - else - { - finalExecutable = Executable; - finalArguments = commandLineArgs; - } - - var startInfo = new ProcessStartInfo() - { - FileName = finalExecutable, - Arguments = finalArguments, - - // If we want to redirect standard out, we can't use shell execute - UseShellExecute = !options.RedirectStandardOut, - RedirectStandardOutput = options.RedirectStandardOut, - }; - process = Process.Start(startInfo); - } - } - } - catch (Exception ex) - { - // We compose a custom exception because an exception from executing some tools - // (powershell, mmc) will have lost the target tool information. - var errorMessage = string.Format(CultureInfo.InvariantCulture, _errorMessageText, Executable); - throw new InvalidOperationException(errorMessage, ex); - } - - options.LaunchedProcess = process; - return process; - } - - public static Process? LaunchPackagedTool(string appUserModelId) - { - var process = default(Process); - var clsid = CLSID.ApplicationActivationManager; - var iid = typeof(IApplicationActivationManager).GUID; - object obj; - - int hr = PInvoke.CoCreateInstance( - in clsid, null, CLSCTX.CLSCTX_LOCAL_SERVER, in iid, out obj); - - if (HResult.Succeeded(hr)) - { - var appActiveManager = (IApplicationActivationManager)obj; - uint processId; - hr = appActiveManager.ActivateApplication( - appUserModelId, string.Empty, ACTIVATEOPTIONS.None, out processId); - if (HResult.Succeeded(hr)) - { - process = Process.GetProcessById((int)processId); - } - } - else - { - Marshal.ThrowExceptionForHR(hr); - } - - return process; - } - - private string ReplaceKnownVariables(string input, Dictionary argumentValues) - { - // Process the input string to replace any instance of defined variables with "real" values. - // Eg, replace {pid} with 123, {hwnd} with 456. - var pattern = @"\{(\w+)\}"; - - var result = Regex.Replace(input, pattern, match => - { - var variable = match.Groups[1].Value; - - // Check if the variable exists in the dictionary; if so, replace it. - if (argumentValues.TryGetValue(variable, out var replacementValue)) - { - return replacementValue; - } - - // If the variable is not found, keep it as is. - return match.Value; - }); - - return result; - } - - public override void UnregisterTool() - { - Application.Current.GetService().RemoveExternalTool(this); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using DevHome.Common.Extensions; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Serilog; +using Windows.System; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.System.Com; +using Windows.Win32.UI.WindowsAndMessaging; +using static DevHome.DevDiagnostics.Helpers.WindowHelper; + +namespace DevHome.DevDiagnostics.Helpers; + +public enum ToolActivationType +{ + Protocol, + Msix, + Launch, +} + +public partial class ExternalTool : Tool +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ExternalTool)); + private readonly string _errorTitleText = CommonHelper.GetLocalizedString("ToolLaunchErrorTitle"); + + private readonly string _errorMessageText = CommonHelper.GetLocalizedString("ToolLaunchErrorMessage"); + + public string ID { get; private set; } + + public string Executable { get; private set; } + + [JsonConverter(typeof(EnumStringConverter))] + public ToolActivationType ActivationType { get; private set; } = ToolActivationType.Launch; + + public string Arguments { get; private set; } + + public string ExtraInfo { get; private set; } + + public string AppUserModelId { get; private set; } + + public string IconFilePath { get; private set; } + + public ExternalTool( + string name, + string executable, + ToolActivationType activationType, + string arguments = "", + string extraInfo = "", + string appUserModelId = "", + string iconFilePath = "", + ToolType type = ToolType.Unknown, + bool isPinned = false) + : base(name, type, isPinned) + { + Executable = executable; + ActivationType = activationType; + Arguments = arguments; + ExtraInfo = extraInfo; + AppUserModelId = appUserModelId; + IconFilePath = iconFilePath; + + ID = Guid.NewGuid().ToString(); + + if (!string.IsNullOrEmpty(executable)) + { + GetIcons(); + } + } + + private async void GetIcons() + { + try + { + if (!string.IsNullOrEmpty(IconFilePath)) + { + ToolIconSource = await GetSoftwareBitmapSourceFromImageFilePath(IconFilePath); + } + else + { + var softwareBitmap = GetSoftwareBitmapFromExecutable(Executable); + if (softwareBitmap is not null) + { + ToolIconSource = await GetSoftwareBitmapSourceFromSoftwareBitmapAsync(softwareBitmap); + } + } + } + catch (Exception ex) + { + _log.Error(ex, "Failed to get tool image"); + } + } + + public override IconElement GetIcon() + { + return new ImageIcon + { + Source = ToolIconSource, + }; + } + + internal async override void InvokeTool(ToolLaunchOptions options) + { + try + { + await InvokeToolInternal(options); + } + catch (Exception ex) + { + _log.Error(ex, "Tool launched failed"); + + var builder = new StringBuilder(); + builder.AppendLine(ex.Message); + if (ex.InnerException is not null) + { + builder.AppendLine(ex.InnerException.Message); + } + + var errorMessage = string.Format(CultureInfo.CurrentCulture, builder.ToString(), Executable); + PInvoke.MessageBox(HWND.Null, errorMessage, _errorTitleText, MESSAGEBOX_STYLE.MB_ICONERROR); + } + } + + internal void ValidateOptions(ToolLaunchOptions options) + { + // We can only get stdout if we're launching the process via CreateProcess. + if (options.RedirectStandardOut && ActivationType != ToolActivationType.Launch) + { + throw new InvalidOperationException("Can only redirect StandardOut with a CreateProcess launch"); + } + } + + private string CreateCommandLine(ToolLaunchOptions options) + { + var commandLineArgs = string.Empty; + if (!string.IsNullOrEmpty(Arguments)) + { + var argumentVariables = new Dictionary(); + if (options.TargetProcessId.HasValue) + { + argumentVariables.Add("pid", options.TargetProcessId.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (options.TargetHWnd != HWND.Null) + { + argumentVariables.Add("hwnd", ((int)options.TargetHWnd).ToString(CultureInfo.InvariantCulture)); + } + + if (Type.HasFlag(ToolType.DumpAnalyzer) && options.CommandLineParams is not null) + { + argumentVariables.Add("crashDumpPath", options.CommandLineParams); + } + + commandLineArgs = ReplaceKnownVariables(Arguments, argumentVariables); + } + + return commandLineArgs; + } + + internal async Task InvokeToolInternal(ToolLaunchOptions options) + { + var process = default(Process); + + ValidateOptions(options); + + string commandLineArgs = CreateCommandLine(options); + + try + { + if (ActivationType == ToolActivationType.Protocol) + { + // Docs say this returns true if the default app for the URI scheme was launched; + // false otherwise. However, if there's no registered app for the protocol, it shows + // the "get an app from the store" dialog, and returns true. So we can't rely on the + // return value to know if the tool was actually launched. + var result = await Launcher.LaunchUriAsync(new Uri(commandLineArgs)); + if (result != true) + { + // We get here if the user supplied a valid registered protocol, but the app failed to launch. + var errorMessage = string.Format( + CultureInfo.InvariantCulture, _errorMessageText, commandLineArgs); + throw new InvalidOperationException(errorMessage); + } + + // Currently we can't get the process object of the launched app via LaunchUriAsync. If we + // ever do and want to populate ToolLaunchOptions.LaunchedProcess, we'll need to revisit the async behavior here, + // as when we return from this function (and our async operation is still ongoing) our callers currently expect to + // be able to read ToolLaunchOptions.LaunchedProcess immedately... there isn't an indication that they would need to + // do an await first. + } + else + { + if (ActivationType == ToolActivationType.Msix) + { + process = LaunchPackagedTool(AppUserModelId); + } + else + { + var finalExecutable = string.Empty; + var finalArguments = string.Empty; + + if (Path.GetExtension(Executable).Equals(".msc", StringComparison.OrdinalIgnoreCase)) + { + // Note: running most msc files requires elevation. + finalExecutable = "mmc.exe"; + finalArguments = $"{Executable} {commandLineArgs}"; + } + else if (Path.GetExtension(Executable).Equals(".ps1", StringComparison.OrdinalIgnoreCase)) + { + // Note: running powershell scripts might require setting the execution policy. + finalExecutable = "powershell.exe"; + finalArguments = $"{Executable} {commandLineArgs}"; + } + else + { + finalExecutable = Executable; + finalArguments = commandLineArgs; + } + + var startInfo = new ProcessStartInfo() + { + FileName = finalExecutable, + Arguments = finalArguments, + + // If we want to redirect standard out, we can't use shell execute + UseShellExecute = !options.RedirectStandardOut, + RedirectStandardOutput = options.RedirectStandardOut, + }; + process = Process.Start(startInfo); + } + } + } + catch (Exception ex) + { + // We compose a custom exception because an exception from executing some tools + // (powershell, mmc) will have lost the target tool information. + var errorMessage = string.Format(CultureInfo.InvariantCulture, _errorMessageText, Executable); + throw new InvalidOperationException(errorMessage, ex); + } + + options.LaunchedProcess = process; + return process; + } + + public static Process? LaunchPackagedTool(string appUserModelId) + { + var process = default(Process); + var clsid = CLSID.ApplicationActivationManager; + var iid = typeof(IApplicationActivationManager).GUID; + object obj; + + int hr = PInvoke.CoCreateInstance( + in clsid, null, CLSCTX.CLSCTX_LOCAL_SERVER, in iid, out obj); + + if (HResult.Succeeded(hr)) + { + var appActiveManager = (IApplicationActivationManager)obj; + uint processId; + hr = appActiveManager.ActivateApplication( + appUserModelId, string.Empty, ACTIVATEOPTIONS.None, out processId); + if (HResult.Succeeded(hr)) + { + process = Process.GetProcessById((int)processId); + } + } + else + { + Marshal.ThrowExceptionForHR(hr); + } + + return process; + } + + private string ReplaceKnownVariables(string input, Dictionary argumentValues) + { + // Process the input string to replace any instance of defined variables with "real" values. + // Eg, replace {pid} with 123, {hwnd} with 456. + var pattern = @"\{(\w+)\}"; + + var result = Regex.Replace(input, pattern, match => + { + var variable = match.Groups[1].Value; + + // Check if the variable exists in the dictionary; if so, replace it. + if (argumentValues.TryGetValue(variable, out var replacementValue)) + { + return replacementValue; + } + + // If the variable is not found, keep it as is. + return match.Value; + }); + + return result; + } + + public override void UnregisterTool() + { + Application.Current.GetService().RemoveExternalTool(this); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolCollection.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolCollection.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolCollection.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolCollection.cs index 9f2953034c..b961edad55 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolCollection.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolCollection.cs @@ -3,7 +3,7 @@ using System.Collections.ObjectModel; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public class ExternalToolCollection { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool_v1.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool_v1.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool_v1.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool_v1.cs index 2d0d9cd98d..86a143df03 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalTool_v1.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalTool_v1.cs @@ -5,7 +5,7 @@ using System.Text.Json.Serialization; using CommunityToolkit.Mvvm.ComponentModel; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public enum ExternalToolArgType { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolsHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolsHelper.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolsHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolsHelper.cs index c49f7e6a8c..53e500e9c0 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ExternalToolsHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ExternalToolsHelper.cs @@ -1,300 +1,300 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.Json; -using System.Text.Json.Serialization; -using DevHome.Common.Helpers; -using Serilog; -using Windows.Storage; - -namespace DevHome.DevInsights.Helpers; - -internal sealed class ExternalToolsHelper -{ - private readonly JsonSerializerOptions _serializerOptions = new() { WriteIndented = true }; - private readonly string _toolInfoFileName; - - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ExternalToolsHelper)); - - private readonly ObservableCollection _filteredExternalTools = []; - - private ObservableCollection _allExternalTools = []; - - // The ExternalTools menu shows all registered tools. - public ObservableCollection AllExternalTools - { - get => _allExternalTools; - set - { - // We're assigning the collection once, and this also covers the case where we reassign it again: - // we need to unsubscribe from the old collection's events, subscribe to the new collection's events, - // and initialize the filtered collection. - if (_allExternalTools != value) - { - if (_allExternalTools != null) - { - _allExternalTools.CollectionChanged -= AllExternalTools_CollectionChanged; - } - - _allExternalTools = value; - if (_allExternalTools != null) - { - _allExternalTools.CollectionChanged += AllExternalTools_CollectionChanged; - } - - // Synchronize the filtered collection with this unfiltered one. - SynchronizeAllFilteredItems(); - } - } - } - - // The bar shows only the pinned tools. - public ReadOnlyObservableCollection FilteredExternalTools { get; private set; } - - internal static int ToolsCollectionVersion { get; private set; } = 2; - - public ExternalToolsHelper() - { - string localFolder; - if (RuntimeHelper.IsMSIX) - { - localFolder = ApplicationData.Current.LocalFolder.Path; - } - else - { - localFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? string.Empty; - } - - // The file should be in this location: - // %LocalAppData%\Packages\Microsoft.Windows.DevHome_8wekyb3d8bbwe\LocalState\externaltools.json - _toolInfoFileName = Path.Combine(localFolder, "externaltools.json"); - AllExternalTools = new(_allExternalTools); - FilteredExternalTools = new(_filteredExternalTools); - - Init(); - } - - private void Init() - { - _allExternalTools.Clear(); - if (File.Exists(_toolInfoFileName)) - { - var jsonData = File.ReadAllText(_toolInfoFileName); - try - { - var toolCollection = JsonSerializer.Deserialize(jsonData); - var existingData = toolCollection?.ExternalTools ?? []; - foreach (var toolItem in existingData) - { - _allExternalTools.Add(toolItem); - toolItem.PropertyChanged += ToolItem_PropertyChanged; - } - } - catch (Exception ex) - { - _log.Error(ex, $"Failed to parse {_toolInfoFileName}, attempting migration"); - MigrateOldTools(jsonData); - } - } - } - - private void MigrateOldTools(string jsonData) - { - try - { - var oldFormatData = JsonSerializer.Deserialize(jsonData) ?? []; - foreach (var oldTool in oldFormatData) - { - var arguments = string.Empty; - if (oldTool.ArgType == ExternalToolArgType.ProcessId) - { - arguments = $" {oldTool.ArgPrefix}{{pid}} {oldTool.OtherArgs}"; - } - else if (oldTool.ArgType == ExternalToolArgType.Hwnd) - { - arguments = $" {oldTool.ArgPrefix}{{hwnd}} {oldTool.OtherArgs}"; - } - else - { - arguments = oldTool.OtherArgs; - } - - var newTool = new ExternalTool( - oldTool.Name, - oldTool.Executable, - ToolActivationType.Launch, - arguments, - string.Empty, - string.Empty, - string.Empty, - ToolType.Unknown, - oldTool.IsPinned); - - _allExternalTools.Add(newTool); - newTool.PropertyChanged += ToolItem_PropertyChanged; - } - - // Write out the updated data with the new file format. - WriteToolsJsonFile(); - } - catch (Exception ex) - { - _log.Error(ex, "Failed to migrate old tools"); - } - } - - private void ToolItem_PropertyChanged(object? sender, PropertyChangedEventArgs e) - { - // The user can change the IsPinned property of a tool, to pin or unpin it on the bar. - if (sender is ExternalTool tool && string.Equals(e.PropertyName, nameof(ExternalTool.IsPinned), StringComparison.Ordinal)) - { - if (tool.IsPinned) - { - if (!_filteredExternalTools.Contains(tool)) - { - _filteredExternalTools.Add(tool); - } - } - else - { - _filteredExternalTools.Remove(tool); - } - } - - // Only update the JSON file if the property is not attributed [JsonIgnore]. - if (!IsJsonIgnoreProperty(e.PropertyName)) - { - WriteToolsJsonFile(); - } - } - - private bool IsJsonIgnoreProperty(string? propertyName) - { - if (string.IsNullOrEmpty(propertyName)) - { - return false; - } - - var property = typeof(T).GetProperty(propertyName); - if (property is not null) - { - var jsonIgnoreAttribute = property.GetCustomAttributes(typeof(JsonIgnoreAttribute), false).FirstOrDefault(); - return jsonIgnoreAttribute is not null; - } - - return false; - } - - public ExternalTool AddExternalTool(ExternalTool tool) - { - _allExternalTools.Add(tool); - WriteToolsJsonFile(); - return tool; - } - - public void RemoveExternalTool(ExternalTool tool) - { - if (_allExternalTools.Remove(tool)) - { - WriteToolsJsonFile(); - } - } - - private void WriteToolsJsonFile() - { - var toolCollection = new ExternalToolCollection(ToolsCollectionVersion, _allExternalTools); - var updatedJson = JsonSerializer.Serialize(toolCollection, _serializerOptions); - - try - { - File.WriteAllText(_toolInfoFileName, updatedJson); - } - catch (Exception ex) - { - _log.Error(ex, "WriteToolsJsonFile unable to write to file"); - } - } - - private void AllExternalTools_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - // Whenever the "all tools" collection changes, we need to synchronize the filtered collection. - switch (e.Action) - { - case NotifyCollectionChangedAction.Add: - if (e.NewItems is not null) - { - foreach (ExternalTool newItem in e.NewItems) - { - if (newItem.IsPinned) - { - _filteredExternalTools.Add(newItem); - } - - newItem.PropertyChanged += ToolItem_PropertyChanged; - } - } - - break; - - case NotifyCollectionChangedAction.Remove: - if (e.OldItems is not null) - { - foreach (ExternalTool oldItem in e.OldItems) - { - oldItem.PropertyChanged -= ToolItem_PropertyChanged; - _filteredExternalTools.Remove(oldItem); - } - } - - break; - - case NotifyCollectionChangedAction.Replace: - if (e.OldItems is not null) - { - foreach (ExternalTool oldItem in e.OldItems) - { - oldItem.PropertyChanged -= ToolItem_PropertyChanged; - _filteredExternalTools.Remove(oldItem); - } - } - - if (e.NewItems is not null) - { - foreach (ExternalTool newItem in e.NewItems) - { - if (newItem.IsPinned) - { - _filteredExternalTools.Add(newItem); - } - - newItem.PropertyChanged += ToolItem_PropertyChanged; - } - } - - break; - - case NotifyCollectionChangedAction.Reset: - SynchronizeAllFilteredItems(); - break; - } - } - - private void SynchronizeAllFilteredItems() - { - _filteredExternalTools.Clear(); - foreach (var item in AllExternalTools) - { - if (item.IsPinned) - { - _filteredExternalTools.Add(item); - } - } - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; +using DevHome.Common.Helpers; +using Serilog; +using Windows.Storage; + +namespace DevHome.DevDiagnostics.Helpers; + +internal sealed class ExternalToolsHelper +{ + private readonly JsonSerializerOptions _serializerOptions = new() { WriteIndented = true }; + private readonly string _toolInfoFileName; + + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ExternalToolsHelper)); + + private readonly ObservableCollection _filteredExternalTools = []; + + private ObservableCollection _allExternalTools = []; + + // The ExternalTools menu shows all registered tools. + public ObservableCollection AllExternalTools + { + get => _allExternalTools; + set + { + // We're assigning the collection once, and this also covers the case where we reassign it again: + // we need to unsubscribe from the old collection's events, subscribe to the new collection's events, + // and initialize the filtered collection. + if (_allExternalTools != value) + { + if (_allExternalTools != null) + { + _allExternalTools.CollectionChanged -= AllExternalTools_CollectionChanged; + } + + _allExternalTools = value; + if (_allExternalTools != null) + { + _allExternalTools.CollectionChanged += AllExternalTools_CollectionChanged; + } + + // Synchronize the filtered collection with this unfiltered one. + SynchronizeAllFilteredItems(); + } + } + } + + // The bar shows only the pinned tools. + public ReadOnlyObservableCollection FilteredExternalTools { get; private set; } + + internal static int ToolsCollectionVersion { get; private set; } = 2; + + public ExternalToolsHelper() + { + string localFolder; + if (RuntimeHelper.IsMSIX) + { + localFolder = ApplicationData.Current.LocalFolder.Path; + } + else + { + localFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? string.Empty; + } + + // The file should be in this location: + // %LocalAppData%\Packages\Microsoft.Windows.DevHome_8wekyb3d8bbwe\LocalState\externaltools.json + _toolInfoFileName = Path.Combine(localFolder, "externaltools.json"); + AllExternalTools = new(_allExternalTools); + FilteredExternalTools = new(_filteredExternalTools); + + Init(); + } + + private void Init() + { + _allExternalTools.Clear(); + if (File.Exists(_toolInfoFileName)) + { + var jsonData = File.ReadAllText(_toolInfoFileName); + try + { + var toolCollection = JsonSerializer.Deserialize(jsonData); + var existingData = toolCollection?.ExternalTools ?? []; + foreach (var toolItem in existingData) + { + _allExternalTools.Add(toolItem); + toolItem.PropertyChanged += ToolItem_PropertyChanged; + } + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to parse {_toolInfoFileName}, attempting migration"); + MigrateOldTools(jsonData); + } + } + } + + private void MigrateOldTools(string jsonData) + { + try + { + var oldFormatData = JsonSerializer.Deserialize(jsonData) ?? []; + foreach (var oldTool in oldFormatData) + { + var arguments = string.Empty; + if (oldTool.ArgType == ExternalToolArgType.ProcessId) + { + arguments = $" {oldTool.ArgPrefix}{{pid}} {oldTool.OtherArgs}"; + } + else if (oldTool.ArgType == ExternalToolArgType.Hwnd) + { + arguments = $" {oldTool.ArgPrefix}{{hwnd}} {oldTool.OtherArgs}"; + } + else + { + arguments = oldTool.OtherArgs; + } + + var newTool = new ExternalTool( + oldTool.Name, + oldTool.Executable, + ToolActivationType.Launch, + arguments, + string.Empty, + string.Empty, + string.Empty, + ToolType.Unknown, + oldTool.IsPinned); + + _allExternalTools.Add(newTool); + newTool.PropertyChanged += ToolItem_PropertyChanged; + } + + // Write out the updated data with the new file format. + WriteToolsJsonFile(); + } + catch (Exception ex) + { + _log.Error(ex, "Failed to migrate old tools"); + } + } + + private void ToolItem_PropertyChanged(object? sender, PropertyChangedEventArgs e) + { + // The user can change the IsPinned property of a tool, to pin or unpin it on the bar. + if (sender is ExternalTool tool && string.Equals(e.PropertyName, nameof(ExternalTool.IsPinned), StringComparison.Ordinal)) + { + if (tool.IsPinned) + { + if (!_filteredExternalTools.Contains(tool)) + { + _filteredExternalTools.Add(tool); + } + } + else + { + _filteredExternalTools.Remove(tool); + } + } + + // Only update the JSON file if the property is not attributed [JsonIgnore]. + if (!IsJsonIgnoreProperty(e.PropertyName)) + { + WriteToolsJsonFile(); + } + } + + private bool IsJsonIgnoreProperty(string? propertyName) + { + if (string.IsNullOrEmpty(propertyName)) + { + return false; + } + + var property = typeof(T).GetProperty(propertyName); + if (property is not null) + { + var jsonIgnoreAttribute = property.GetCustomAttributes(typeof(JsonIgnoreAttribute), false).FirstOrDefault(); + return jsonIgnoreAttribute is not null; + } + + return false; + } + + public ExternalTool AddExternalTool(ExternalTool tool) + { + _allExternalTools.Add(tool); + WriteToolsJsonFile(); + return tool; + } + + public void RemoveExternalTool(ExternalTool tool) + { + if (_allExternalTools.Remove(tool)) + { + WriteToolsJsonFile(); + } + } + + private void WriteToolsJsonFile() + { + var toolCollection = new ExternalToolCollection(ToolsCollectionVersion, _allExternalTools); + var updatedJson = JsonSerializer.Serialize(toolCollection, _serializerOptions); + + try + { + File.WriteAllText(_toolInfoFileName, updatedJson); + } + catch (Exception ex) + { + _log.Error(ex, "WriteToolsJsonFile unable to write to file"); + } + } + + private void AllExternalTools_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + // Whenever the "all tools" collection changes, we need to synchronize the filtered collection. + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + if (e.NewItems is not null) + { + foreach (ExternalTool newItem in e.NewItems) + { + if (newItem.IsPinned) + { + _filteredExternalTools.Add(newItem); + } + + newItem.PropertyChanged += ToolItem_PropertyChanged; + } + } + + break; + + case NotifyCollectionChangedAction.Remove: + if (e.OldItems is not null) + { + foreach (ExternalTool oldItem in e.OldItems) + { + oldItem.PropertyChanged -= ToolItem_PropertyChanged; + _filteredExternalTools.Remove(oldItem); + } + } + + break; + + case NotifyCollectionChangedAction.Replace: + if (e.OldItems is not null) + { + foreach (ExternalTool oldItem in e.OldItems) + { + oldItem.PropertyChanged -= ToolItem_PropertyChanged; + _filteredExternalTools.Remove(oldItem); + } + } + + if (e.NewItems is not null) + { + foreach (ExternalTool newItem in e.NewItems) + { + if (newItem.IsPinned) + { + _filteredExternalTools.Add(newItem); + } + + newItem.PropertyChanged += ToolItem_PropertyChanged; + } + } + + break; + + case NotifyCollectionChangedAction.Reset: + SynchronizeAllFilteredItems(); + break; + } + } + + private void SynchronizeAllFilteredItems() + { + _filteredExternalTools.Clear(); + foreach (var item in AllExternalTools) + { + if (item.IsPinned) + { + _filteredExternalTools.Add(item); + } + } + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/HotKeyHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/HotKeyHelper.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/HotKeyHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/HotKeyHelper.cs index 44b054d657..340ca8bd66 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/HotKeyHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/HotKeyHelper.cs @@ -1,74 +1,74 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using Microsoft.UI.Xaml; -using Windows.System; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.UI.Input.KeyboardAndMouse; -using WinUIEx.Messaging; - -namespace DevHome.DevInsights.Helpers; - -// Note: instead of making this class disposable, we're disposing the WindowMessageMonitor in -// UnregisterHotKey, and MainWindow calls this in its Closing event handler. -#pragma warning disable CA1001 // Types that own disposable fields should be disposable -public class HotKeyHelper// : IDisposable -#pragma warning restore CA1001 // Types that own disposable fields should be disposable -{ - internal ushort HotkeyID { get; private set; } - - private const string NoWindowHandleException = "Cannot get window handle: are you doing this too early?"; - private readonly HWND windowHandle; - private readonly Action onHotKeyPressed; - private readonly WindowMessageMonitor windowMessageMonitor; - - public HotKeyHelper(Window handlerWindow, Action hotKeyHandler) - { - onHotKeyPressed = hotKeyHandler; - - // Create a unique Id for this class in this instance. - var atomName = $"{Environment.CurrentManagedThreadId:X8}{GetType().FullName}"; - HotkeyID = PInvoke.GlobalAddAtom(atomName); - - // Set up the window message hook to listen for hot keys. - windowHandle = (HWND)WinRT.Interop.WindowNative.GetWindowHandle(handlerWindow); - if (windowHandle.IsNull) - { - throw new InvalidOperationException(NoWindowHandleException); - } - - windowMessageMonitor = new WindowMessageMonitor(windowHandle); - windowMessageMonitor.WindowMessageReceived += OnWindowMessageReceived; - } - - private void OnWindowMessageReceived(object? sender, WindowMessageEventArgs e) - { - if (e.Message.MessageId == PInvoke.WM_HOTKEY) - { - var keyId = (int)e.Message.WParam; - if (keyId == HotkeyID) - { - onHotKeyPressed?.Invoke((int)e.Message.LParam); - e.Handled = true; - } - } - } - - internal void RegisterHotKey(VirtualKey key, HOT_KEY_MODIFIERS modifiers) - { - PInvoke.RegisterHotKey(windowHandle, HotkeyID, modifiers, (uint)key); - } - - internal void UnregisterHotKey() - { - if (HotkeyID != 0) - { - _ = PInvoke.UnregisterHotKey(windowHandle, HotkeyID); - PInvoke.GlobalDeleteAtom(HotkeyID); - windowMessageMonitor.Dispose(); - HotkeyID = 0; - } - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using Microsoft.UI.Xaml; +using Windows.System; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.UI.Input.KeyboardAndMouse; +using WinUIEx.Messaging; + +namespace DevHome.DevDiagnostics.Helpers; + +// Note: instead of making this class disposable, we're disposing the WindowMessageMonitor in +// UnregisterHotKey, and MainWindow calls this in its Closing event handler. +#pragma warning disable CA1001 // Types that own disposable fields should be disposable +public class HotKeyHelper// : IDisposable +#pragma warning restore CA1001 // Types that own disposable fields should be disposable +{ + internal ushort HotkeyID { get; private set; } + + private const string NoWindowHandleException = "Cannot get window handle: are you doing this too early?"; + private readonly HWND windowHandle; + private readonly Action onHotKeyPressed; + private readonly WindowMessageMonitor windowMessageMonitor; + + public HotKeyHelper(Window handlerWindow, Action hotKeyHandler) + { + onHotKeyPressed = hotKeyHandler; + + // Create a unique Id for this class in this instance. + var atomName = $"{Environment.CurrentManagedThreadId:X8}{GetType().FullName}"; + HotkeyID = PInvoke.GlobalAddAtom(atomName); + + // Set up the window message hook to listen for hot keys. + windowHandle = (HWND)WinRT.Interop.WindowNative.GetWindowHandle(handlerWindow); + if (windowHandle.IsNull) + { + throw new InvalidOperationException(NoWindowHandleException); + } + + windowMessageMonitor = new WindowMessageMonitor(windowHandle); + windowMessageMonitor.WindowMessageReceived += OnWindowMessageReceived; + } + + private void OnWindowMessageReceived(object? sender, WindowMessageEventArgs e) + { + if (e.Message.MessageId == PInvoke.WM_HOTKEY) + { + var keyId = (int)e.Message.WParam; + if (keyId == HotkeyID) + { + onHotKeyPressed?.Invoke((int)e.Message.LParam); + e.Handled = true; + } + } + } + + internal void RegisterHotKey(VirtualKey key, HOT_KEY_MODIFIERS modifiers) + { + PInvoke.RegisterHotKey(windowHandle, HotkeyID, modifiers, (uint)key); + } + + internal void UnregisterHotKey() + { + if (HotkeyID != 0) + { + _ = PInvoke.UnregisterHotKey(windowHandle, HotkeyID); + PInvoke.GlobalDeleteAtom(HotkeyID); + windowMessageMonitor.Dispose(); + HotkeyID = 0; + } + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/IApplicationActivationManager.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/IApplicationActivationManager.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/IApplicationActivationManager.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/IApplicationActivationManager.cs index 6cc2194db1..d971435d16 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/IApplicationActivationManager.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/IApplicationActivationManager.cs @@ -4,7 +4,7 @@ using System; using System.Runtime.InteropServices; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; [ComImport] [Guid("2E941141-7F97-4756-BA1D-9DECDE894A3D")] diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/InsightsHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InsightsHelper.cs similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Helpers/InsightsHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InsightsHelper.cs index a80eabdc0d..573f6ee145 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/InsightsHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InsightsHelper.cs @@ -5,14 +5,14 @@ using System.Collections.Generic; using System.ComponentModel; using System.Text.RegularExpressions; -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Models; using Serilog; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; internal sealed partial class InsightsHelper -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(InsightsHelper)); +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(InsightsHelper)); // TODO: Add more patterns for different insights. // TODO: Insights patterns should be in a database of some kind. @@ -66,16 +66,16 @@ static InsightsHelper() { pattern = match.Groups[1].Value; } - + newInsight.Title = CommonHelper.GetLocalizedString("LockedFileInsightTitle"); var processName = GetLockingProcess(pattern); if (!string.IsNullOrEmpty(processName)) - { + { newInsight.Description = CommonHelper.GetLocalizedString("LockedFileInsightSpecificDescription", pattern, processName); } else - { + { newInsight.Description = CommonHelper.GetLocalizedString("LockedFileInsightUnknownDescription", pattern); } diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/InternalToolsHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InternalToolsHelper.cs similarity index 92% rename from tools/DevInsights/DevHome.DevInsights/Helpers/InternalToolsHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InternalToolsHelper.cs index 5921de14f5..7bc84593a4 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/InternalToolsHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/InternalToolsHelper.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; internal sealed class InternalToolsHelper { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/RestartManagerHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/RestartManagerHelper.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/RestartManagerHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/RestartManagerHelper.cs index bbeb07ef27..ee0848d783 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/RestartManagerHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/RestartManagerHelper.cs @@ -1,110 +1,110 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.System.RestartManager; - -namespace DevHome.DevInsights.Helpers; - -internal static class RestartManagerHelper -{ - // Find out what process(es) have a lock on the specified file. - internal static WIN32_ERROR GetLockingProcesses(string filePath, out List processes) - { - var key = Guid.NewGuid().ToString(); - processes = []; - - // Start a Restart Manager session. - var result = WIN32_ERROR.ERROR_SUCCESS; - uint handle; - unsafe - { - fixed (char* p = key) - { - PInvoke.RmStartSession(out handle, p); - } - } - - if (result != 0) - { - return result; - } - - try - { - uint pnProcInfo = 0; - var lpdwRebootReasons = (uint)RM_REBOOT_REASON.RmRebootReasonNone; - - unsafe - { - fixed (char* p = filePath) - { - var filePathStr = new PCWSTR(p); - var resources = new ReadOnlySpan(&filePathStr, 1); - var uniqueProcesses = default(Span); - var serviceNames = default(ReadOnlySpan); - - // Specify the given file as a resource to be managed by the Restart Manager. - result = PInvoke.RmRegisterResources(handle, resources, uniqueProcesses, serviceNames); - if (result != 0) - { - return result; - } - } - } - - // Note: there's a race here - the first call to RmGetList returns the count of processes, - // but when we call RmGetList again to get them this number might have changed. - unsafe - { - result = PInvoke.RmGetList(handle, out var pnProcInfoNeeded, ref pnProcInfo, null, out lpdwRebootReasons); - if (result == WIN32_ERROR.ERROR_MORE_DATA) - { - var processInfo = new RM_PROCESS_INFO[pnProcInfoNeeded]; - - fixed (RM_PROCESS_INFO* processArrayPtr = processInfo) - { - pnProcInfo = pnProcInfoNeeded; - - // Get the list of running processes that are using the given resource (file). - result = PInvoke.RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, processArrayPtr, out lpdwRebootReasons); - if (result == 0) - { - // Enumerate all of the returned PIDS, get a Process for each one, and add it to the list. - processes = new List((int)pnProcInfo); - for (var i = 0; i < pnProcInfo; i++) - { - try - { - processes.Add(Process.GetProcessById((int)processInfo[i].Process.dwProcessId)); - } - catch (ArgumentException) - { - // The process might have died before we got to look at it. - } - } - } - else - { - return result; - } - } - } - else if (result != 0) - { - return result; - } - } - } - finally - { - _ = PInvoke.RmEndSession(handle); - } - - return 0; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.System.RestartManager; + +namespace DevHome.DevDiagnostics.Helpers; + +internal static class RestartManagerHelper +{ + // Find out what process(es) have a lock on the specified file. + internal static WIN32_ERROR GetLockingProcesses(string filePath, out List processes) + { + var key = Guid.NewGuid().ToString(); + processes = []; + + // Start a Restart Manager session. + var result = WIN32_ERROR.ERROR_SUCCESS; + uint handle; + unsafe + { + fixed (char* p = key) + { + PInvoke.RmStartSession(out handle, p); + } + } + + if (result != 0) + { + return result; + } + + try + { + uint pnProcInfo = 0; + var lpdwRebootReasons = (uint)RM_REBOOT_REASON.RmRebootReasonNone; + + unsafe + { + fixed (char* p = filePath) + { + var filePathStr = new PCWSTR(p); + var resources = new ReadOnlySpan(&filePathStr, 1); + var uniqueProcesses = default(Span); + var serviceNames = default(ReadOnlySpan); + + // Specify the given file as a resource to be managed by the Restart Manager. + result = PInvoke.RmRegisterResources(handle, resources, uniqueProcesses, serviceNames); + if (result != 0) + { + return result; + } + } + } + + // Note: there's a race here - the first call to RmGetList returns the count of processes, + // but when we call RmGetList again to get them this number might have changed. + unsafe + { + result = PInvoke.RmGetList(handle, out var pnProcInfoNeeded, ref pnProcInfo, null, out lpdwRebootReasons); + if (result == WIN32_ERROR.ERROR_MORE_DATA) + { + var processInfo = new RM_PROCESS_INFO[pnProcInfoNeeded]; + + fixed (RM_PROCESS_INFO* processArrayPtr = processInfo) + { + pnProcInfo = pnProcInfoNeeded; + + // Get the list of running processes that are using the given resource (file). + result = PInvoke.RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, processArrayPtr, out lpdwRebootReasons); + if (result == 0) + { + // Enumerate all of the returned PIDS, get a Process for each one, and add it to the list. + processes = new List((int)pnProcInfo); + for (var i = 0; i < pnProcInfo; i++) + { + try + { + processes.Add(Process.GetProcessById((int)processInfo[i].Process.dwProcessId)); + } + catch (ArgumentException) + { + // The process might have died before we got to look at it. + } + } + } + else + { + return result; + } + } + } + else if (result != 0) + { + return result; + } + } + } + finally + { + _ = PInvoke.RmEndSession(handle); + } + + return 0; + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/ServicingHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ServicingHelper.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/ServicingHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ServicingHelper.cs index 1bb16406b4..8631521bfc 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/ServicingHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/ServicingHelper.cs @@ -1,51 +1,51 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using Microsoft.UI.Xaml; -using Windows.Win32; -using Windows.Win32.Foundation; -using WinUIEx.Messaging; - -namespace DevHome.DevInsights.Helpers; - -// Note: instead of making this class disposable, we're disposing the WindowMessageMonitor in -// UnregisterHotKey, and MainWindow calls this in its Closing event handler. -#pragma warning disable CA1001 // Types that own disposable fields should be disposable -public class ServicingHelper -#pragma warning restore CA1001 // Types that own disposable fields should be disposable -{ - private const string NoWindowHandleException = "Cannot get window handle: are you doing this too early?"; - private readonly HWND _windowHandle; - private readonly WindowMessageMonitor _windowMessageMonitor; - private readonly Action _onSessionEnd; - - public ServicingHelper(Window handlerWindow, Action handleSessionEnd) - { - _onSessionEnd = handleSessionEnd; - - // Set up the window message hook to listen for session end messages. - _windowHandle = (HWND)WinRT.Interop.WindowNative.GetWindowHandle(handlerWindow); - if (_windowHandle.IsNull) - { - throw new InvalidOperationException(NoWindowHandleException); - } - - _windowMessageMonitor = new WindowMessageMonitor(_windowHandle); - _windowMessageMonitor.WindowMessageReceived += OnWindowMessageReceived; - } - - private void OnWindowMessageReceived(object? sender, WindowMessageEventArgs e) - { - if (e.Message.MessageId == PInvoke.WM_ENDSESSION) - { - _onSessionEnd?.Invoke(); - e.Handled = true; - } - } - - internal void Unregister() - { - _windowMessageMonitor?.Dispose(); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using Microsoft.UI.Xaml; +using Windows.Win32; +using Windows.Win32.Foundation; +using WinUIEx.Messaging; + +namespace DevHome.DevDiagnostics.Helpers; + +// Note: instead of making this class disposable, we're disposing the WindowMessageMonitor in +// UnregisterHotKey, and MainWindow calls this in its Closing event handler. +#pragma warning disable CA1001 // Types that own disposable fields should be disposable +public class ServicingHelper +#pragma warning restore CA1001 // Types that own disposable fields should be disposable +{ + private const string NoWindowHandleException = "Cannot get window handle: are you doing this too early?"; + private readonly HWND _windowHandle; + private readonly WindowMessageMonitor _windowMessageMonitor; + private readonly Action _onSessionEnd; + + public ServicingHelper(Window handlerWindow, Action handleSessionEnd) + { + _onSessionEnd = handleSessionEnd; + + // Set up the window message hook to listen for session end messages. + _windowHandle = (HWND)WinRT.Interop.WindowNative.GetWindowHandle(handlerWindow); + if (_windowHandle.IsNull) + { + throw new InvalidOperationException(NoWindowHandleException); + } + + _windowMessageMonitor = new WindowMessageMonitor(_windowHandle); + _windowMessageMonitor.WindowMessageReceived += OnWindowMessageReceived; + } + + private void OnWindowMessageReceived(object? sender, WindowMessageEventArgs e) + { + if (e.Message.MessageId == PInvoke.WM_ENDSESSION) + { + _onSessionEnd?.Invoke(); + e.Handled = true; + } + } + + internal void Unregister() + { + _windowMessageMonitor?.Dispose(); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/Tool.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/Tool.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Helpers/Tool.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/Tool.cs index e7a55a9a5f..3bb0f39dcd 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/Tool.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/Tool.cs @@ -6,13 +6,13 @@ using System.Text.Json.Serialization; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Models; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; using Windows.Win32.Foundation; -namespace DevHome.DevInsights.Helpers; +namespace DevHome.DevDiagnostics.Helpers; public abstract partial class Tool : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/WinLogsHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WinLogsHelper.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/WinLogsHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WinLogsHelper.cs index 2888d63afe..8250cd4e90 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/WinLogsHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WinLogsHelper.cs @@ -1,269 +1,269 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Diagnostics.Eventing.Reader; -using System.Threading; -using DevHome.Common.Extensions; -using DevHome.DevInsights.Models; -using Microsoft.Diagnostics.Tracing; -using Microsoft.UI.Xaml; - -namespace DevHome.DevInsights.Helpers; - -public class WinLogsHelper : IDisposable -{ - public const string EtwLogsName = "ETW Logs"; - public const string DebugOutputLogsName = "DebugOutput"; - public const string EventViewerName = "EventViewer"; - public const string WERName = "WER"; - - private readonly ETWHelper etwHelper; - private readonly DebugMonitor debugMonitor; - private readonly EventViewerHelper eventViewerHelper; - private readonly ObservableCollection output; - private readonly Process targetProcess; - private readonly WERHelper _werHelper; - - private Thread? etwThread; - private Thread? debugMonitorThread; - private Thread? eventViewerThread; - - public WinLogsHelper(Process targetProcess, ObservableCollection output) - { - this.targetProcess = targetProcess; - this.output = output; - - // Initialize ETW logs - etwHelper = new ETWHelper(targetProcess, output); - - // Initialize DebugMonitor - debugMonitor = new DebugMonitor(targetProcess, output); - - // Initialize EventViewer - eventViewerHelper = new EventViewerHelper(targetProcess, output); - - _werHelper = Application.Current.GetService(); - } - - public void Start(bool isEtwEnabled, bool isDebugOutputEnabled, bool isEventViewerEnabled, bool isWEREnabled) - { - if (isEtwEnabled) - { - StartETWLogsThread(); - } - - if (isDebugOutputEnabled) - { - StartDebugOutputsThread(); - } - - if (isEventViewerEnabled) - { - StartEventViewerThread(); - } - - if (isWEREnabled) - { - ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged += WEREvents_CollectionChanged; - } - } - - public void Stop() - { - // Stop ETW logs - StopETWLogsThread(); - - // Stop Debug Outputs - StopDebugOutputsThread(); - - // Stop Event Viewer - StopEventViewerThread(); - - // Stop WER - ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged -= WEREvents_CollectionChanged; - } - - public void Dispose() - { - etwHelper.Dispose(); - debugMonitor.Dispose(); - eventViewerHelper.Dispose(); - GC.SuppressFinalize(this); - } - - private void StartETWLogsThread() - { - // Stop and close existing thread if any - StopETWLogsThread(); - - // Start a new thread - etwThread = new Thread(() => - { - etwHelper.Start(); - }); - etwThread.Name = EtwLogsName + " Thread"; - etwThread.Start(); - } - - private void StopETWLogsThread() - { - etwHelper.Stop(); - - if (Thread.CurrentThread != etwThread) - { - etwThread?.Join(); - } - } - - private void StartDebugOutputsThread() - { - // Stop and close existing thread if any - StopDebugOutputsThread(); - - // Start a new thread - debugMonitorThread = new Thread(() => - { - // Start Debug Outputs - debugMonitor.Start(); - }); - debugMonitorThread.Name = DebugOutputLogsName + " Thread"; - debugMonitorThread.Start(); - } - - private void StopDebugOutputsThread() - { - debugMonitor.Stop(); - - if (Thread.CurrentThread != debugMonitorThread) - { - debugMonitorThread?.Join(); - } - } - - private void StartEventViewerThread() - { - // Stop and close existing thread if any - StopEventViewerThread(); - - // Start a new thread - eventViewerThread = new Thread(() => - { - // Start EventViewer logs - eventViewerHelper.Start(); - }); - eventViewerThread.Name = EventViewerName + " Thread"; - eventViewerThread.Start(); - } - - private void StopEventViewerThread() - { - eventViewerHelper.Stop(); - - if (Thread.CurrentThread != eventViewerThread) - { - eventViewerThread?.Join(); - } - } - - private void WEREvents_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null) - { - foreach (WERReport report in e.NewItems) - { - var filePath = report.Executable ?? string.Empty; - - // Filter WER events based on the process we're targeting - if (filePath.Contains(targetProcess.ProcessName, StringComparison.OrdinalIgnoreCase)) - { - WinLogsEntry entry = new(report.TimeStamp, WinLogCategory.Error, report.Description, WinLogsHelper.WERName); - output.Add(entry); - } - } - } - } - - public void LogStateChanged(WinLogsTool logType, bool isEnabled) - { - if (isEnabled) - { - switch (logType) - { - case WinLogsTool.ETWLogs: - StartETWLogsThread(); - break; - case WinLogsTool.DebugOutput: - StartDebugOutputsThread(); - break; - case WinLogsTool.EventViewer: - StartEventViewerThread(); - break; - case WinLogsTool.WER: - ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged += WEREvents_CollectionChanged; - break; - } - } - else - { - switch (logType) - { - case WinLogsTool.ETWLogs: - StopETWLogsThread(); - break; - case WinLogsTool.DebugOutput: - StopDebugOutputsThread(); - break; - case WinLogsTool.EventViewer: - StopEventViewerThread(); - break; - case WinLogsTool.WER: - ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged -= WEREvents_CollectionChanged; - break; - } - } - } - - public static WinLogCategory ConvertTraceEventLevelToWinLogCategory(TraceEventLevel level) - { - var category = WinLogCategory.Information; - - switch (level) - { - case TraceEventLevel.Error: - case TraceEventLevel.Critical: - category = WinLogCategory.Error; - break; - case TraceEventLevel.Warning: - category = WinLogCategory.Warning; - break; - } - - return category; - } - - public static WinLogCategory ConvertStandardEventLevelToWinLogCategory(byte? level) - { - var category = WinLogCategory.Information; - - if (level.HasValue) - { - StandardEventLevel standardEventLevel = (StandardEventLevel)level.Value; - switch (standardEventLevel) - { - case StandardEventLevel.Error: - case StandardEventLevel.Critical: - category = WinLogCategory.Error; - break; - case StandardEventLevel.Warning: - category = WinLogCategory.Warning; - break; - } - } - - return category; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; +using System.Threading; +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Models; +using Microsoft.Diagnostics.Tracing; +using Microsoft.UI.Xaml; + +namespace DevHome.DevDiagnostics.Helpers; + +public class WinLogsHelper : IDisposable +{ + public const string EtwLogsName = "ETW Logs"; + public const string DebugOutputLogsName = "DebugOutput"; + public const string EventViewerName = "EventViewer"; + public const string WERName = "WER"; + + private readonly ETWHelper etwHelper; + private readonly DebugMonitor debugMonitor; + private readonly EventViewerHelper eventViewerHelper; + private readonly ObservableCollection output; + private readonly Process targetProcess; + private readonly WERHelper _werHelper; + + private Thread? etwThread; + private Thread? debugMonitorThread; + private Thread? eventViewerThread; + + public WinLogsHelper(Process targetProcess, ObservableCollection output) + { + this.targetProcess = targetProcess; + this.output = output; + + // Initialize ETW logs + etwHelper = new ETWHelper(targetProcess, output); + + // Initialize DebugMonitor + debugMonitor = new DebugMonitor(targetProcess, output); + + // Initialize EventViewer + eventViewerHelper = new EventViewerHelper(targetProcess, output); + + _werHelper = Application.Current.GetService(); + } + + public void Start(bool isEtwEnabled, bool isDebugOutputEnabled, bool isEventViewerEnabled, bool isWEREnabled) + { + if (isEtwEnabled) + { + StartETWLogsThread(); + } + + if (isDebugOutputEnabled) + { + StartDebugOutputsThread(); + } + + if (isEventViewerEnabled) + { + StartEventViewerThread(); + } + + if (isWEREnabled) + { + ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged += WEREvents_CollectionChanged; + } + } + + public void Stop() + { + // Stop ETW logs + StopETWLogsThread(); + + // Stop Debug Outputs + StopDebugOutputsThread(); + + // Stop Event Viewer + StopEventViewerThread(); + + // Stop WER + ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged -= WEREvents_CollectionChanged; + } + + public void Dispose() + { + etwHelper.Dispose(); + debugMonitor.Dispose(); + eventViewerHelper.Dispose(); + GC.SuppressFinalize(this); + } + + private void StartETWLogsThread() + { + // Stop and close existing thread if any + StopETWLogsThread(); + + // Start a new thread + etwThread = new Thread(() => + { + etwHelper.Start(); + }); + etwThread.Name = EtwLogsName + " Thread"; + etwThread.Start(); + } + + private void StopETWLogsThread() + { + etwHelper.Stop(); + + if (Thread.CurrentThread != etwThread) + { + etwThread?.Join(); + } + } + + private void StartDebugOutputsThread() + { + // Stop and close existing thread if any + StopDebugOutputsThread(); + + // Start a new thread + debugMonitorThread = new Thread(() => + { + // Start Debug Outputs + debugMonitor.Start(); + }); + debugMonitorThread.Name = DebugOutputLogsName + " Thread"; + debugMonitorThread.Start(); + } + + private void StopDebugOutputsThread() + { + debugMonitor.Stop(); + + if (Thread.CurrentThread != debugMonitorThread) + { + debugMonitorThread?.Join(); + } + } + + private void StartEventViewerThread() + { + // Stop and close existing thread if any + StopEventViewerThread(); + + // Start a new thread + eventViewerThread = new Thread(() => + { + // Start EventViewer logs + eventViewerHelper.Start(); + }); + eventViewerThread.Name = EventViewerName + " Thread"; + eventViewerThread.Start(); + } + + private void StopEventViewerThread() + { + eventViewerHelper.Stop(); + + if (Thread.CurrentThread != eventViewerThread) + { + eventViewerThread?.Join(); + } + } + + private void WEREvents_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems != null) + { + foreach (WERReport report in e.NewItems) + { + var filePath = report.Executable ?? string.Empty; + + // Filter WER events based on the process we're targeting + if (filePath.Contains(targetProcess.ProcessName, StringComparison.OrdinalIgnoreCase)) + { + WinLogsEntry entry = new(report.TimeStamp, WinLogCategory.Error, report.Description, WinLogsHelper.WERName); + output.Add(entry); + } + } + } + } + + public void LogStateChanged(WinLogsTool logType, bool isEnabled) + { + if (isEnabled) + { + switch (logType) + { + case WinLogsTool.ETWLogs: + StartETWLogsThread(); + break; + case WinLogsTool.DebugOutput: + StartDebugOutputsThread(); + break; + case WinLogsTool.EventViewer: + StartEventViewerThread(); + break; + case WinLogsTool.WER: + ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged += WEREvents_CollectionChanged; + break; + } + } + else + { + switch (logType) + { + case WinLogsTool.ETWLogs: + StopETWLogsThread(); + break; + case WinLogsTool.DebugOutput: + StopDebugOutputsThread(); + break; + case WinLogsTool.EventViewer: + StopEventViewerThread(); + break; + case WinLogsTool.WER: + ((INotifyCollectionChanged)_werHelper.WERReports).CollectionChanged -= WEREvents_CollectionChanged; + break; + } + } + } + + public static WinLogCategory ConvertTraceEventLevelToWinLogCategory(TraceEventLevel level) + { + var category = WinLogCategory.Information; + + switch (level) + { + case TraceEventLevel.Error: + case TraceEventLevel.Critical: + category = WinLogCategory.Error; + break; + case TraceEventLevel.Warning: + category = WinLogCategory.Warning; + break; + } + + return category; + } + + public static WinLogCategory ConvertStandardEventLevelToWinLogCategory(byte? level) + { + var category = WinLogCategory.Information; + + if (level.HasValue) + { + StandardEventLevel standardEventLevel = (StandardEventLevel)level.Value; + switch (standardEventLevel) + { + case StandardEventLevel.Error: + case StandardEventLevel.Critical: + category = WinLogCategory.Error; + break; + case StandardEventLevel.Warning: + category = WinLogCategory.Warning; + break; + } + } + + return category; + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/WindowHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHelper.cs similarity index 97% rename from tools/DevInsights/DevHome.DevInsights/Helpers/WindowHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHelper.cs index 068191b87d..204a4a2431 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/WindowHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHelper.cs @@ -1,770 +1,770 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.WindowsRuntime; -using System.Threading.Tasks; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Media.Imaging; -using Microsoft.Win32.SafeHandles; -using Serilog; -using Windows.Devices.Display; -using Windows.Devices.Enumeration; -using Windows.Foundation; -using Windows.Graphics; -using Windows.Graphics.Imaging; -using Windows.Storage.Streams; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.Graphics.Dwm; -using Windows.Win32.Graphics.Gdi; -using Windows.Win32.System.SystemInformation; -using Windows.Win32.System.Threading; -using Windows.Win32.UI.Accessibility; -using Windows.Win32.UI.Shell.Common; -using Windows.Win32.UI.WindowsAndMessaging; - -namespace DevHome.DevInsights.Helpers; - -public class WindowHelper -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(WindowHelper)); - - private static nint GetClassLongPtr(HWND hWnd, GET_CLASS_LONG_INDEX nIndex) - { - if (IntPtr.Size == 8) - { - return CommonInterop.GetClassLongPtr64(hWnd, nIndex); - } - else - { - return (nint)PInvoke.GetClassLong(hWnd, nIndex); - } - } - - private static nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint newLong) - { - if (IntPtr.Size == 8) - { - return CommonInterop.SetWindowLongPtr64(hWnd, nIndex, newLong); - } - else - { - return (nint)PInvoke.SetWindowLong(hWnd, nIndex, (int)newLong); - } - } - - private static nint GetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) - { - if (IntPtr.Size == 8) - { - return CommonInterop.GetWindowLongPtr64(hWnd, nIndex); - } - else - { - return PInvoke.GetWindowLong(hWnd, nIndex); - } - } - - private static unsafe BOOL EnumProc(HWND hWnd, LPARAM data) - { -#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type - var enumData = (EnumWindowsData*)data.Value; -#pragma warning restore CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type - - // The caller should've set this, but we'll make sure here. - enumData->OutHwnd = HWND.Null; - - // Skip this one if the window doesn't include WS_VISIBLE, or if it's minimized. - if (!PInvoke.IsWindowVisible(hWnd)) - { - return true; - } - - if (PInvoke.IsIconic(hWnd)) - { - return true; - } - - // Skip toolwindows. - var extendedStyle = GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); - var isToolWindow = (extendedStyle & (long)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW) - == (long)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW; - if (isToolWindow) - { - return true; - } - - // Skip dialogs. - if (PInvoke.GetAncestor(hWnd, GET_ANCESTOR_FLAGS.GA_ROOTOWNER) != hWnd) - { - return true; - } - - PInvoke.GetWindowRect(hWnd, out var windowRect); - var screenBounds = GetMonitorRectForWindow(hWnd); - var isOnAnyScreen = - windowRect.left < screenBounds.right && windowRect.right > screenBounds.left && - windowRect.top < screenBounds.bottom && windowRect.bottom > screenBounds.top && - windowRect.right - windowRect.left > 1 && windowRect.bottom - windowRect.top > 1; - if (!isOnAnyScreen) - { - return true; - } - - unsafe - { - // Exclude system/shell windows. - var className = stackalloc char[256]; - var classNameLength = PInvoke.GetClassName(hWnd, className, 256); - if (classNameLength == 0) - { - return true; - } - - string classNameString = new(className, 0, classNameLength); - if (classNameString == "Progman" || classNameString == "Shell_TrayWnd" || - classNameString == "WorkerW" || classNameString == "SHELLDLL_DefView" || - classNameString == "IME") - { - return true; - } - - // Exclude cloaked windows. - var cloakedVal = 0; - var hRes = PInvoke.DwmGetWindowAttribute( - hWnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAKED, &cloakedVal, sizeof(int)); - if (hRes != 0) - { - cloakedVal = 0; - } - - if (cloakedVal != 0) - { - return true; - } - - // Skip any windows that are on our exclusion list. - var excludedProcesses = enumData->ExcludedProcesses; - if (excludedProcesses != null && !IsAcceptableWindow(hWnd, excludedProcesses)) - { - return true; - } - } - - // Skip popups, unless they're for UWP apps or for dialog-based MFC apps. - var windowStyle = (WINDOW_STYLE)GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE); - var isPopup = (windowStyle & WINDOW_STYLE.WS_POPUP) == WINDOW_STYLE.WS_POPUP; - - // Dialog-based MFC apps will have WS_POPUP but also WS_OVERLAPPED. - var isOverlapped = (windowStyle & WINDOW_STYLE.WS_OVERLAPPED) == WINDOW_STYLE.WS_OVERLAPPED; - - if (isPopup) - { - var isUwpApp = IsProcessName(hWnd, "applicationframehost"); - if (isUwpApp) - { - // NOTE: We could use SHGetPropertyStoreForWindow + PKEY_AppUserModel_ID - // to get the appid for the app. - // Found a visible UWP window, stop enumerating. - enumData->OutHwnd = hWnd; - return false; - } - else if (isOverlapped) - { - // This is a top-level popup, most likely a dialog-based MFC app. - enumData->OutHwnd = hWnd; - return false; - } - - return true; - } - - // Found a window, stop enumerating. - enumData->OutHwnd = hWnd; - return false; - } - - private static Rectangle GetScreenBounds() - { - Rectangle rectangle = default; - - // Can't use async in EnumProc. - var deviceInfoOp = DeviceInformation.FindAllAsync(DisplayMonitor.GetDeviceSelector()); - deviceInfoOp.AsTask().Wait(); - var displayList = deviceInfoOp.GetResults(); - if (displayList == null || displayList.Count == 0) - { - return rectangle; - } - - var winSize = default(SizeInt32); - var displayOp = DisplayMonitor.FromInterfaceIdAsync(displayList[0].Id); - displayOp.AsTask().Wait(); - var monitorInfo = displayOp.GetResults(); - if (monitorInfo == null) - { - winSize.Width = 800; - winSize.Height = 1200; - } - else - { - winSize.Height = monitorInfo.NativeResolutionInRawPixels.Height; - winSize.Width = monitorInfo.NativeResolutionInRawPixels.Width; - } - - rectangle.Width = winSize.Width; - rectangle.Height = winSize.Height; - - return rectangle; - } - - public static RectInt32 GetRect(Rect bounds, double scale) - { - return new RectInt32( - _X: (int)Math.Round(bounds.X * scale), - _Y: (int)Math.Round(bounds.Y * scale), - _Width: (int)Math.Round(bounds.Width * scale), - _Height: (int)Math.Round(bounds.Height * scale)); - } - - internal static unsafe string GetWindowTitle(HWND hWnd) - { - var length = PInvoke.GetWindowTextLength(hWnd); - var windowText = stackalloc char[length]; - _ = PInvoke.GetWindowText(hWnd, windowText, length); - return new string(windowText); - } - - internal static IntPtr LoadDefaultAppIcon() - { - IntPtr icon = PInvoke.LoadIcon(HINSTANCE.Null, PInvoke.IDI_APPLICATION); - return icon; - } - - internal static Bitmap? GetAppIcon(HWND hWnd) - { - try - { - // Try getting the big icon first. - IntPtr hIcon = default; - hIcon = PInvoke.SendMessage(hWnd, PInvoke.WM_GETICON, PInvoke.ICON_BIG, IntPtr.Zero); - - // If that failed, try getting the small icon (or the system-provided default). - if (hIcon == IntPtr.Zero) - { - hIcon = PInvoke.SendMessage(hWnd, PInvoke.WM_GETICON, PInvoke.ICON_SMALL2, IntPtr.Zero); - if (hIcon == IntPtr.Zero) - { - hIcon = (nint)GetClassLongPtr(hWnd, GET_CLASS_LONG_INDEX.GCL_HICON); - } - } - - if (hIcon != IntPtr.Zero) - { - return new Bitmap(Icon.FromHandle(hIcon).ToBitmap(), 24, 24); - } - else - { - return null; - } - } - catch (Exception) - { - return null; - } - } - - public static async Task GetWinUI3BitmapSourceFromGdiBitmap(Bitmap bmp) - { - var softwareBitmap = GetSoftwareBitmapFromGdiBitmap(bmp); - var source = new SoftwareBitmapSource(); - await source.SetBitmapAsync(softwareBitmap); - return source; - } - - public static SoftwareBitmap? GetSoftwareBitmapFromExecutable(string executable) - { - SoftwareBitmap? softwareBitmap = null; - var toolIcon = Icon.ExtractAssociatedIcon(executable); - - // Fall back to Windows default app icon. - toolIcon ??= Icon.FromHandle(LoadDefaultAppIcon()); - - if (toolIcon is not null) - { - softwareBitmap = GetSoftwareBitmapFromGdiBitmap(toolIcon.ToBitmap()); - } - - return softwareBitmap; - } - - public static SoftwareBitmap GetSoftwareBitmapFromGdiBitmap(Bitmap bmp) - { - // Get pixels as an array of bytes. - var data = bmp.LockBits( - new Rectangle(0, 0, bmp.Width, bmp.Height), - System.Drawing.Imaging.ImageLockMode.ReadOnly, - bmp.PixelFormat); - var bytes = new byte[data.Stride * data.Height]; - Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); - bmp.UnlockBits(data); - - // Get WinRT SoftwareBitmap. - var softwareBitmap = new SoftwareBitmap( - BitmapPixelFormat.Bgra8, - bmp.Width, - bmp.Height, - BitmapAlphaMode.Premultiplied); - softwareBitmap.CopyFromBuffer(bytes.AsBuffer()); - - return softwareBitmap; - } - - public static async Task GetSoftwareBitmapSourceFromSoftwareBitmapAsync(SoftwareBitmap softwareBitmap) - { - var softwareBitmapSource = new SoftwareBitmapSource(); - await softwareBitmapSource.SetBitmapAsync(softwareBitmap); - return softwareBitmapSource; - } - - internal static BitmapImage? GetBitmapImageFromFile(string filePath) - { - BitmapImage? bitmapImage = null; - try - { - // Creating a BitmapImage must be done on the UI thread. - bitmapImage = new BitmapImage(); - var icon = Icon.ExtractAssociatedIcon(filePath); - if (icon is not null) - { - using var bitmap = icon.ToBitmap(); - using var stream = new MemoryStream(); - bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); - - stream.Seek(0, SeekOrigin.Begin); - var randomAccessStream = new InMemoryRandomAccessStream(); - var outputStream = randomAccessStream.GetOutputStreamAt(0); - var writer = new DataWriter(outputStream); - writer.WriteBytes(stream.ToArray()); - writer.StoreAsync().GetResults(); - randomAccessStream.Seek(0); - - bitmapImage.SetSource(randomAccessStream); - } - } - catch (Exception ex) - { - _log.Error($"Error creating BitmapImage from filePath: {ex.Message}"); - } - - return bitmapImage; - } - - internal static async Task GetSoftwareBitmapSourceFromImageFilePath(string iconFilePath) - { - SoftwareBitmapSource? softwareBitmapSource = null; - - try - { - var fileStream = File.OpenRead(iconFilePath); - var decoder = await BitmapDecoder.CreateAsync(fileStream.AsRandomAccessStream()); - var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); - - // SoftwareBitmapSource.SetBitmapAsync only supports SoftwareBitmap with - // bgra8 pixel format and pre-multiplied or no alpha. - if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 - || softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight) - { - softwareBitmap = SoftwareBitmap.Convert( - softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); - } - - softwareBitmapSource = new SoftwareBitmapSource(); - await softwareBitmapSource.SetBitmapAsync(softwareBitmap); - } - catch (Exception ex) - { - _log.Error($"Error creating SoftwareBitmapSource from file path: {ex.Message}"); - } - - return softwareBitmapSource; - } - - internal static unsafe uint GetProcessIdFromWindow(HWND hWnd) - { - uint processID = 0; - _ = PInvoke.GetWindowThreadProcessId(hWnd, &processID); - return processID; - } - - internal static void TranslateUWPProcess(HWND hWnd, ref Process process) - { - if (process.ProcessName.Equals("ApplicationFrameHost", StringComparison.OrdinalIgnoreCase)) - { - var processId = GetProcessIdFromUWPWindow(hWnd); - if (processId != 0) - { - process = Process.GetProcessById((int)processId); - } - } - } - - internal static unsafe uint GetProcessIdFromUWPWindow(HWND hWnd) - { - UWPProcessFinder processFinder = new(); - PInvoke.EnumChildWindows(hWnd, processFinder.EnumChildWindowsProc, IntPtr.Zero); - return processFinder.UWPProcessId; - } - - private sealed class UWPProcessFinder - { - public uint UWPProcessId { get; private set; } - - public unsafe BOOL EnumChildWindowsProc(HWND hWnd, LPARAM data) - { - var className = stackalloc char[256]; - var classNameLength = PInvoke.GetClassName(hWnd, className, 256); - if (classNameLength > 0) - { - string classNameString = new(className, 0, classNameLength); - if (classNameString.StartsWith("Windows.UI.Core.", StringComparison.OrdinalIgnoreCase)) - { - uint hWndProcessId = 0; - _ = PInvoke.GetWindowThreadProcessId(hWnd, &hWndProcessId); - UWPProcessId = hWndProcessId; - return false; - } - } - - return true; - } - } - - internal static HWINEVENTHOOK WatchWindowPositionEvents(WINEVENTPROC procDelegate, uint processID) - { - var eventHook = PInvoke.SetWinEventHook( - PInvoke.EVENT_OBJECT_DESTROY, - PInvoke.EVENT_OBJECT_LOCATIONCHANGE, - HMODULE.Null, - procDelegate, - processID, - 0, - PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); - return eventHook; - } - - internal static HWINEVENTHOOK WatchWindowForegroundEvents(WINEVENTPROC procDelegate) - { - var eventHook = PInvoke.SetWinEventHook( - PInvoke.EVENT_SYSTEM_FOREGROUND, - PInvoke.EVENT_SYSTEM_FOREGROUND, - HMODULE.Null, - procDelegate, - 0, - 0, - PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); - return eventHook; - } - - internal static HWINEVENTHOOK WatchWindowFocusEvents(WINEVENTPROC procDelegate, uint processID) - { - var eventHook = PInvoke.SetWinEventHook( - PInvoke.EVENT_OBJECT_FOCUS, - PInvoke.EVENT_OBJECT_FOCUS, - HMODULE.Null, - procDelegate, - processID, - 0, - PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); - return eventHook; - } - - internal sealed class EnumWindowsData - { - public HWND OutHwnd { get; set; } - - public StringCollection? ExcludedProcesses { get; set; } - - public EnumWindowsData() - { - OutHwnd = HWND.Null; - } - } - - internal static unsafe HWND FindVisibleForegroundWindow(StringCollection excludedProcesses) - { - EnumWindowsData data = new() { ExcludedProcesses = excludedProcesses }; -#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type - LPARAM lparamData = new((nint)(&data)); -#pragma warning restore CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type - PInvoke.EnumWindows(EnumProc, lparamData); - return data.OutHwnd; - } - - internal static bool IsAcceptableWindow(HWND hWnd, StringCollection excludedProcesses) - { - if (excludedProcesses != null && excludedProcesses.Count > 0) - { - foreach (var processName in excludedProcesses) - { - if (processName != null && IsProcessName(hWnd, processName)) - { - return false; - } - } - } - - return true; - } - - internal static unsafe bool IsProcessName(HWND hWnd, string name) - { - uint processId = 0; - _ = PInvoke.GetWindowThreadProcessId(hWnd, &processId); - var process = Process.GetProcessById((int)processId); - if (string.Equals(process.ProcessName, name, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - - return false; - } - - internal static string GetProcessName(uint processId) - { - var process = Process.GetProcessById((int)processId); - return process.ProcessName; - } - - internal static void SetWindowExTransparent(HWND hwnd) - { - var extendedStyle = (WINDOW_EX_STYLE)PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); - _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, (int)(extendedStyle | WINDOW_EX_STYLE.WS_EX_TRANSPARENT)); - } - - internal static void SetWindowExNotTransparent(HWND hwnd) - { - var extendedStyle = (WINDOW_EX_STYLE)PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); - _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, (int)(extendedStyle & ~WINDOW_EX_STYLE.WS_EX_TRANSPARENT)); - } - - internal static T? FindParentControl(DependencyObject child) - where T : DependencyObject - { - var parentObject = VisualTreeHelper.GetParent(child); - if (parentObject == null) - { - return null; - } - - if (parentObject is T parent) - { - return parent; - } - else - { - return FindParentControl(parentObject); - } - } - - private static RECT GetWorkAreaRect() - { - RECT rect = default; - unsafe - { - PInvoke.SystemParametersInfo(SYSTEM_PARAMETERS_INFO_ACTION.SPI_GETWORKAREA, 0, &rect, 0); - } - - return rect; - } - - internal static RECT GetMonitorRectForWindow(HWND hWnd) - { - var monitor = PInvoke.MonitorFromWindow(hWnd, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); - var monitorInfo = new MONITORINFO { cbSize = (uint)Marshal.SizeOf(typeof(MONITORINFO)) }; - PInvoke.GetMonitorInfo(monitor, ref monitorInfo); - var screenBounds = monitorInfo.rcMonitor; - return screenBounds; - } - - internal static double GetDpiScaleForWindow(HWND hWnd) - { - var monitor = PInvoke.MonitorFromWindow(hWnd, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); - PInvoke.GetScaleFactorForMonitor(monitor, out DEVICE_SCALE_FACTOR scaleFactor).ThrowOnFailure(); - return (double)scaleFactor / 100; - } - - internal static void GetAppInfoUnderMouseCursor(out Process? process, out HWND hwnd) - { - process = null; - - // Grab the window under the cursor and attach to that process - PInvoke.GetCursorPos(out var pt); - hwnd = PInvoke.WindowFromPoint(pt); - - if (hwnd != HWND.Null) - { - // Walk up until we get the topmost parent window - HWND hwndParent = PInvoke.GetParent(hwnd); - - while (hwndParent != HWND.Null) - { - hwnd = hwndParent; - hwndParent = PInvoke.GetParent(hwnd); - } - - var processID = WindowHelper.GetProcessIdFromWindow(hwnd); - - if (processID != 0) - { - process = Process.GetProcessById((int)processID); - } - } - } - - // Only one ContentDialog can be shown at a time, so we have to keep track of the current one. - private static ContentDialog? ContentDialog { get; set; } - - internal static async void ShowTimedMessageDialog(FrameworkElement frameworkElement, string message, string closeButtonText) - { - if (ContentDialog is not null) - { - ContentDialog.Hide(); - ContentDialog = null; - } - - ContentDialog = new ContentDialog - { - XamlRoot = frameworkElement.XamlRoot, - RequestedTheme = frameworkElement.ActualTheme, - Content = message, - CloseButtonText = closeButtonText, - }; - - var timer = new DispatcherTimer - { - Interval = TimeSpan.FromSeconds(3), - }; - timer.Tick += (s, e) => - { - timer.Stop(); - if (ContentDialog is null) - { - return; - } - - ContentDialog.Hide(); - ContentDialog = null; - }; - - try - { - ContentDialog.Opened += (s, e) => timer.Start(); - ContentDialog.Closed += (s, e) => - { - timer.Stop(); - ContentDialog = null; - }; - await ContentDialog.ShowAsync(); - } - catch (Exception ex) - { - _log.Error(ex, "Error showing timed message dialog"); - } - } - - internal enum CpuArchitecture - { - X86, - X64, - ARM, - ARM64, - Unknown, - } - - internal static CpuArchitecture GetTargetArchitecture(IMAGE_FILE_MACHINE target) - { - return target switch - { - IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_I386 => CpuArchitecture.X86, - IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_AMD64 => CpuArchitecture.X64, - IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_ARM => CpuArchitecture.ARM, - IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_ARM64 => CpuArchitecture.ARM64, - _ => CpuArchitecture.Unknown, - }; - } - - internal static string GetAppArchitecture(SafeProcessHandle handle, string moduleName) - { - var cpuArchitecture = CommonHelper.GetLocalizedString("CpuArchitecture_Unknown"); - - try - { - unsafe - { - IMAGE_FILE_MACHINE processInfo; - IMAGE_FILE_MACHINE machineInfo; - var isWow64Result = PInvoke.IsWow64Process2(handle, out processInfo, &machineInfo); - if (isWow64Result) - { - var processArchitecture = GetTargetArchitecture(processInfo); - var machineArchitecture = GetTargetArchitecture(machineInfo); - - // "Unknown" means this is not a WOW64 process. - if (processArchitecture == CpuArchitecture.Unknown) - { - if (machineArchitecture == CpuArchitecture.X64) - { - // If this is an x64 machine and it's not a WOW64 process, it's an x64 process. - cpuArchitecture = CommonHelper.GetLocalizedString("CpuArchitecture_X64onX64"); - } - else - { - // If this is not an x64 machine, we need to get the process architecture from the process itself. - var processMachineInfo = default(PROCESS_MACHINE_INFORMATION); - var getProcInfoResult - = PInvoke.GetProcessInformation( - handle, - PROCESS_INFORMATION_CLASS.ProcessMachineTypeInfo, - &processMachineInfo, - (uint)Marshal.SizeOf()); - if (getProcInfoResult) - { - // Report the process architecture and the machine architecture. - processArchitecture = GetTargetArchitecture(processMachineInfo.ProcessMachine); - cpuArchitecture = CommonHelper.GetLocalizedString( - "CpuArchitecture_ProcessOnMachine", processArchitecture, machineArchitecture); - } - else - { - // If we can't get the process architecture, just report the machine architecture. - cpuArchitecture = CommonHelper.GetLocalizedString( - "CpuArchitecture_UnknownOnMachine", machineArchitecture); - } - } - } - else - { - // This is a WOW64 process, so report the process architecture and the machine architecture. - cpuArchitecture = CommonHelper.GetLocalizedString( - "CpuArchitecture_ProcessOnMachine", processArchitecture, machineArchitecture); - } - } - } - } - catch (Exception ex) - { - _log.Error(ex, "Error getting app architecture"); - } - - return cpuArchitecture; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Media.Imaging; +using Microsoft.Win32.SafeHandles; +using Serilog; +using Windows.Devices.Display; +using Windows.Devices.Enumeration; +using Windows.Foundation; +using Windows.Graphics; +using Windows.Graphics.Imaging; +using Windows.Storage.Streams; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.Graphics.Dwm; +using Windows.Win32.Graphics.Gdi; +using Windows.Win32.System.SystemInformation; +using Windows.Win32.System.Threading; +using Windows.Win32.UI.Accessibility; +using Windows.Win32.UI.Shell.Common; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace DevHome.DevDiagnostics.Helpers; + +public class WindowHelper +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(WindowHelper)); + + private static nint GetClassLongPtr(HWND hWnd, GET_CLASS_LONG_INDEX nIndex) + { + if (IntPtr.Size == 8) + { + return CommonInterop.GetClassLongPtr64(hWnd, nIndex); + } + else + { + return (nint)PInvoke.GetClassLong(hWnd, nIndex); + } + } + + private static nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint newLong) + { + if (IntPtr.Size == 8) + { + return CommonInterop.SetWindowLongPtr64(hWnd, nIndex, newLong); + } + else + { + return (nint)PInvoke.SetWindowLong(hWnd, nIndex, (int)newLong); + } + } + + private static nint GetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) + { + if (IntPtr.Size == 8) + { + return CommonInterop.GetWindowLongPtr64(hWnd, nIndex); + } + else + { + return PInvoke.GetWindowLong(hWnd, nIndex); + } + } + + private static unsafe BOOL EnumProc(HWND hWnd, LPARAM data) + { +#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type + var enumData = (EnumWindowsData*)data.Value; +#pragma warning restore CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type + + // The caller should've set this, but we'll make sure here. + enumData->OutHwnd = HWND.Null; + + // Skip this one if the window doesn't include WS_VISIBLE, or if it's minimized. + if (!PInvoke.IsWindowVisible(hWnd)) + { + return true; + } + + if (PInvoke.IsIconic(hWnd)) + { + return true; + } + + // Skip toolwindows. + var extendedStyle = GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); + var isToolWindow = (extendedStyle & (long)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW) + == (long)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW; + if (isToolWindow) + { + return true; + } + + // Skip dialogs. + if (PInvoke.GetAncestor(hWnd, GET_ANCESTOR_FLAGS.GA_ROOTOWNER) != hWnd) + { + return true; + } + + PInvoke.GetWindowRect(hWnd, out var windowRect); + var screenBounds = GetMonitorRectForWindow(hWnd); + var isOnAnyScreen = + windowRect.left < screenBounds.right && windowRect.right > screenBounds.left && + windowRect.top < screenBounds.bottom && windowRect.bottom > screenBounds.top && + windowRect.right - windowRect.left > 1 && windowRect.bottom - windowRect.top > 1; + if (!isOnAnyScreen) + { + return true; + } + + unsafe + { + // Exclude system/shell windows. + var className = stackalloc char[256]; + var classNameLength = PInvoke.GetClassName(hWnd, className, 256); + if (classNameLength == 0) + { + return true; + } + + string classNameString = new(className, 0, classNameLength); + if (classNameString == "Progman" || classNameString == "Shell_TrayWnd" || + classNameString == "WorkerW" || classNameString == "SHELLDLL_DefView" || + classNameString == "IME") + { + return true; + } + + // Exclude cloaked windows. + var cloakedVal = 0; + var hRes = PInvoke.DwmGetWindowAttribute( + hWnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAKED, &cloakedVal, sizeof(int)); + if (hRes != 0) + { + cloakedVal = 0; + } + + if (cloakedVal != 0) + { + return true; + } + + // Skip any windows that are on our exclusion list. + var excludedProcesses = enumData->ExcludedProcesses; + if (excludedProcesses != null && !IsAcceptableWindow(hWnd, excludedProcesses)) + { + return true; + } + } + + // Skip popups, unless they're for UWP apps or for dialog-based MFC apps. + var windowStyle = (WINDOW_STYLE)GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE); + var isPopup = (windowStyle & WINDOW_STYLE.WS_POPUP) == WINDOW_STYLE.WS_POPUP; + + // Dialog-based MFC apps will have WS_POPUP but also WS_OVERLAPPED. + var isOverlapped = (windowStyle & WINDOW_STYLE.WS_OVERLAPPED) == WINDOW_STYLE.WS_OVERLAPPED; + + if (isPopup) + { + var isUwpApp = IsProcessName(hWnd, "applicationframehost"); + if (isUwpApp) + { + // NOTE: We could use SHGetPropertyStoreForWindow + PKEY_AppUserModel_ID + // to get the appid for the app. + // Found a visible UWP window, stop enumerating. + enumData->OutHwnd = hWnd; + return false; + } + else if (isOverlapped) + { + // This is a top-level popup, most likely a dialog-based MFC app. + enumData->OutHwnd = hWnd; + return false; + } + + return true; + } + + // Found a window, stop enumerating. + enumData->OutHwnd = hWnd; + return false; + } + + private static Rectangle GetScreenBounds() + { + Rectangle rectangle = default; + + // Can't use async in EnumProc. + var deviceInfoOp = DeviceInformation.FindAllAsync(DisplayMonitor.GetDeviceSelector()); + deviceInfoOp.AsTask().Wait(); + var displayList = deviceInfoOp.GetResults(); + if (displayList == null || displayList.Count == 0) + { + return rectangle; + } + + var winSize = default(SizeInt32); + var displayOp = DisplayMonitor.FromInterfaceIdAsync(displayList[0].Id); + displayOp.AsTask().Wait(); + var monitorInfo = displayOp.GetResults(); + if (monitorInfo == null) + { + winSize.Width = 800; + winSize.Height = 1200; + } + else + { + winSize.Height = monitorInfo.NativeResolutionInRawPixels.Height; + winSize.Width = monitorInfo.NativeResolutionInRawPixels.Width; + } + + rectangle.Width = winSize.Width; + rectangle.Height = winSize.Height; + + return rectangle; + } + + public static RectInt32 GetRect(Rect bounds, double scale) + { + return new RectInt32( + _X: (int)Math.Round(bounds.X * scale), + _Y: (int)Math.Round(bounds.Y * scale), + _Width: (int)Math.Round(bounds.Width * scale), + _Height: (int)Math.Round(bounds.Height * scale)); + } + + internal static unsafe string GetWindowTitle(HWND hWnd) + { + var length = PInvoke.GetWindowTextLength(hWnd); + var windowText = stackalloc char[length]; + _ = PInvoke.GetWindowText(hWnd, windowText, length); + return new string(windowText); + } + + internal static IntPtr LoadDefaultAppIcon() + { + IntPtr icon = PInvoke.LoadIcon(HINSTANCE.Null, PInvoke.IDI_APPLICATION); + return icon; + } + + internal static Bitmap? GetAppIcon(HWND hWnd) + { + try + { + // Try getting the big icon first. + IntPtr hIcon = default; + hIcon = PInvoke.SendMessage(hWnd, PInvoke.WM_GETICON, PInvoke.ICON_BIG, IntPtr.Zero); + + // If that failed, try getting the small icon (or the system-provided default). + if (hIcon == IntPtr.Zero) + { + hIcon = PInvoke.SendMessage(hWnd, PInvoke.WM_GETICON, PInvoke.ICON_SMALL2, IntPtr.Zero); + if (hIcon == IntPtr.Zero) + { + hIcon = (nint)GetClassLongPtr(hWnd, GET_CLASS_LONG_INDEX.GCL_HICON); + } + } + + if (hIcon != IntPtr.Zero) + { + return new Bitmap(Icon.FromHandle(hIcon).ToBitmap(), 24, 24); + } + else + { + return null; + } + } + catch (Exception) + { + return null; + } + } + + public static async Task GetWinUI3BitmapSourceFromGdiBitmap(Bitmap bmp) + { + var softwareBitmap = GetSoftwareBitmapFromGdiBitmap(bmp); + var source = new SoftwareBitmapSource(); + await source.SetBitmapAsync(softwareBitmap); + return source; + } + + public static SoftwareBitmap? GetSoftwareBitmapFromExecutable(string executable) + { + SoftwareBitmap? softwareBitmap = null; + var toolIcon = Icon.ExtractAssociatedIcon(executable); + + // Fall back to Windows default app icon. + toolIcon ??= Icon.FromHandle(LoadDefaultAppIcon()); + + if (toolIcon is not null) + { + softwareBitmap = GetSoftwareBitmapFromGdiBitmap(toolIcon.ToBitmap()); + } + + return softwareBitmap; + } + + public static SoftwareBitmap GetSoftwareBitmapFromGdiBitmap(Bitmap bmp) + { + // Get pixels as an array of bytes. + var data = bmp.LockBits( + new Rectangle(0, 0, bmp.Width, bmp.Height), + System.Drawing.Imaging.ImageLockMode.ReadOnly, + bmp.PixelFormat); + var bytes = new byte[data.Stride * data.Height]; + Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); + bmp.UnlockBits(data); + + // Get WinRT SoftwareBitmap. + var softwareBitmap = new SoftwareBitmap( + BitmapPixelFormat.Bgra8, + bmp.Width, + bmp.Height, + BitmapAlphaMode.Premultiplied); + softwareBitmap.CopyFromBuffer(bytes.AsBuffer()); + + return softwareBitmap; + } + + public static async Task GetSoftwareBitmapSourceFromSoftwareBitmapAsync(SoftwareBitmap softwareBitmap) + { + var softwareBitmapSource = new SoftwareBitmapSource(); + await softwareBitmapSource.SetBitmapAsync(softwareBitmap); + return softwareBitmapSource; + } + + internal static BitmapImage? GetBitmapImageFromFile(string filePath) + { + BitmapImage? bitmapImage = null; + try + { + // Creating a BitmapImage must be done on the UI thread. + bitmapImage = new BitmapImage(); + var icon = Icon.ExtractAssociatedIcon(filePath); + if (icon is not null) + { + using var bitmap = icon.ToBitmap(); + using var stream = new MemoryStream(); + bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); + + stream.Seek(0, SeekOrigin.Begin); + var randomAccessStream = new InMemoryRandomAccessStream(); + var outputStream = randomAccessStream.GetOutputStreamAt(0); + var writer = new DataWriter(outputStream); + writer.WriteBytes(stream.ToArray()); + writer.StoreAsync().GetResults(); + randomAccessStream.Seek(0); + + bitmapImage.SetSource(randomAccessStream); + } + } + catch (Exception ex) + { + _log.Error($"Error creating BitmapImage from filePath: {ex.Message}"); + } + + return bitmapImage; + } + + internal static async Task GetSoftwareBitmapSourceFromImageFilePath(string iconFilePath) + { + SoftwareBitmapSource? softwareBitmapSource = null; + + try + { + var fileStream = File.OpenRead(iconFilePath); + var decoder = await BitmapDecoder.CreateAsync(fileStream.AsRandomAccessStream()); + var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); + + // SoftwareBitmapSource.SetBitmapAsync only supports SoftwareBitmap with + // bgra8 pixel format and pre-multiplied or no alpha. + if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 + || softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight) + { + softwareBitmap = SoftwareBitmap.Convert( + softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); + } + + softwareBitmapSource = new SoftwareBitmapSource(); + await softwareBitmapSource.SetBitmapAsync(softwareBitmap); + } + catch (Exception ex) + { + _log.Error($"Error creating SoftwareBitmapSource from file path: {ex.Message}"); + } + + return softwareBitmapSource; + } + + internal static unsafe uint GetProcessIdFromWindow(HWND hWnd) + { + uint processID = 0; + _ = PInvoke.GetWindowThreadProcessId(hWnd, &processID); + return processID; + } + + internal static void TranslateUWPProcess(HWND hWnd, ref Process process) + { + if (process.ProcessName.Equals("ApplicationFrameHost", StringComparison.OrdinalIgnoreCase)) + { + var processId = GetProcessIdFromUWPWindow(hWnd); + if (processId != 0) + { + process = Process.GetProcessById((int)processId); + } + } + } + + internal static unsafe uint GetProcessIdFromUWPWindow(HWND hWnd) + { + UWPProcessFinder processFinder = new(); + PInvoke.EnumChildWindows(hWnd, processFinder.EnumChildWindowsProc, IntPtr.Zero); + return processFinder.UWPProcessId; + } + + private sealed class UWPProcessFinder + { + public uint UWPProcessId { get; private set; } + + public unsafe BOOL EnumChildWindowsProc(HWND hWnd, LPARAM data) + { + var className = stackalloc char[256]; + var classNameLength = PInvoke.GetClassName(hWnd, className, 256); + if (classNameLength > 0) + { + string classNameString = new(className, 0, classNameLength); + if (classNameString.StartsWith("Windows.UI.Core.", StringComparison.OrdinalIgnoreCase)) + { + uint hWndProcessId = 0; + _ = PInvoke.GetWindowThreadProcessId(hWnd, &hWndProcessId); + UWPProcessId = hWndProcessId; + return false; + } + } + + return true; + } + } + + internal static HWINEVENTHOOK WatchWindowPositionEvents(WINEVENTPROC procDelegate, uint processID) + { + var eventHook = PInvoke.SetWinEventHook( + PInvoke.EVENT_OBJECT_DESTROY, + PInvoke.EVENT_OBJECT_LOCATIONCHANGE, + HMODULE.Null, + procDelegate, + processID, + 0, + PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); + return eventHook; + } + + internal static HWINEVENTHOOK WatchWindowForegroundEvents(WINEVENTPROC procDelegate) + { + var eventHook = PInvoke.SetWinEventHook( + PInvoke.EVENT_SYSTEM_FOREGROUND, + PInvoke.EVENT_SYSTEM_FOREGROUND, + HMODULE.Null, + procDelegate, + 0, + 0, + PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); + return eventHook; + } + + internal static HWINEVENTHOOK WatchWindowFocusEvents(WINEVENTPROC procDelegate, uint processID) + { + var eventHook = PInvoke.SetWinEventHook( + PInvoke.EVENT_OBJECT_FOCUS, + PInvoke.EVENT_OBJECT_FOCUS, + HMODULE.Null, + procDelegate, + processID, + 0, + PInvoke.WINEVENT_OUTOFCONTEXT | PInvoke.WINEVENT_SKIPOWNPROCESS); + return eventHook; + } + + internal sealed class EnumWindowsData + { + public HWND OutHwnd { get; set; } + + public StringCollection? ExcludedProcesses { get; set; } + + public EnumWindowsData() + { + OutHwnd = HWND.Null; + } + } + + internal static unsafe HWND FindVisibleForegroundWindow(StringCollection excludedProcesses) + { + EnumWindowsData data = new() { ExcludedProcesses = excludedProcesses }; +#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type + LPARAM lparamData = new((nint)(&data)); +#pragma warning restore CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type + PInvoke.EnumWindows(EnumProc, lparamData); + return data.OutHwnd; + } + + internal static bool IsAcceptableWindow(HWND hWnd, StringCollection excludedProcesses) + { + if (excludedProcesses != null && excludedProcesses.Count > 0) + { + foreach (var processName in excludedProcesses) + { + if (processName != null && IsProcessName(hWnd, processName)) + { + return false; + } + } + } + + return true; + } + + internal static unsafe bool IsProcessName(HWND hWnd, string name) + { + uint processId = 0; + _ = PInvoke.GetWindowThreadProcessId(hWnd, &processId); + var process = Process.GetProcessById((int)processId); + if (string.Equals(process.ProcessName, name, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + internal static string GetProcessName(uint processId) + { + var process = Process.GetProcessById((int)processId); + return process.ProcessName; + } + + internal static void SetWindowExTransparent(HWND hwnd) + { + var extendedStyle = (WINDOW_EX_STYLE)PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); + _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, (int)(extendedStyle | WINDOW_EX_STYLE.WS_EX_TRANSPARENT)); + } + + internal static void SetWindowExNotTransparent(HWND hwnd) + { + var extendedStyle = (WINDOW_EX_STYLE)PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); + _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, (int)(extendedStyle & ~WINDOW_EX_STYLE.WS_EX_TRANSPARENT)); + } + + internal static T? FindParentControl(DependencyObject child) + where T : DependencyObject + { + var parentObject = VisualTreeHelper.GetParent(child); + if (parentObject == null) + { + return null; + } + + if (parentObject is T parent) + { + return parent; + } + else + { + return FindParentControl(parentObject); + } + } + + private static RECT GetWorkAreaRect() + { + RECT rect = default; + unsafe + { + PInvoke.SystemParametersInfo(SYSTEM_PARAMETERS_INFO_ACTION.SPI_GETWORKAREA, 0, &rect, 0); + } + + return rect; + } + + internal static RECT GetMonitorRectForWindow(HWND hWnd) + { + var monitor = PInvoke.MonitorFromWindow(hWnd, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); + var monitorInfo = new MONITORINFO { cbSize = (uint)Marshal.SizeOf(typeof(MONITORINFO)) }; + PInvoke.GetMonitorInfo(monitor, ref monitorInfo); + var screenBounds = monitorInfo.rcMonitor; + return screenBounds; + } + + internal static double GetDpiScaleForWindow(HWND hWnd) + { + var monitor = PInvoke.MonitorFromWindow(hWnd, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST); + PInvoke.GetScaleFactorForMonitor(monitor, out DEVICE_SCALE_FACTOR scaleFactor).ThrowOnFailure(); + return (double)scaleFactor / 100; + } + + internal static void GetAppInfoUnderMouseCursor(out Process? process, out HWND hwnd) + { + process = null; + + // Grab the window under the cursor and attach to that process + PInvoke.GetCursorPos(out var pt); + hwnd = PInvoke.WindowFromPoint(pt); + + if (hwnd != HWND.Null) + { + // Walk up until we get the topmost parent window + HWND hwndParent = PInvoke.GetParent(hwnd); + + while (hwndParent != HWND.Null) + { + hwnd = hwndParent; + hwndParent = PInvoke.GetParent(hwnd); + } + + var processID = WindowHelper.GetProcessIdFromWindow(hwnd); + + if (processID != 0) + { + process = Process.GetProcessById((int)processID); + } + } + } + + // Only one ContentDialog can be shown at a time, so we have to keep track of the current one. + private static ContentDialog? ContentDialog { get; set; } + + internal static async void ShowTimedMessageDialog(FrameworkElement frameworkElement, string message, string closeButtonText) + { + if (ContentDialog is not null) + { + ContentDialog.Hide(); + ContentDialog = null; + } + + ContentDialog = new ContentDialog + { + XamlRoot = frameworkElement.XamlRoot, + RequestedTheme = frameworkElement.ActualTheme, + Content = message, + CloseButtonText = closeButtonText, + }; + + var timer = new DispatcherTimer + { + Interval = TimeSpan.FromSeconds(3), + }; + timer.Tick += (s, e) => + { + timer.Stop(); + if (ContentDialog is null) + { + return; + } + + ContentDialog.Hide(); + ContentDialog = null; + }; + + try + { + ContentDialog.Opened += (s, e) => timer.Start(); + ContentDialog.Closed += (s, e) => + { + timer.Stop(); + ContentDialog = null; + }; + await ContentDialog.ShowAsync(); + } + catch (Exception ex) + { + _log.Error(ex, "Error showing timed message dialog"); + } + } + + internal enum CpuArchitecture + { + X86, + X64, + ARM, + ARM64, + Unknown, + } + + internal static CpuArchitecture GetTargetArchitecture(IMAGE_FILE_MACHINE target) + { + return target switch + { + IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_I386 => CpuArchitecture.X86, + IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_AMD64 => CpuArchitecture.X64, + IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_ARM => CpuArchitecture.ARM, + IMAGE_FILE_MACHINE.IMAGE_FILE_MACHINE_ARM64 => CpuArchitecture.ARM64, + _ => CpuArchitecture.Unknown, + }; + } + + internal static string GetAppArchitecture(SafeProcessHandle handle, string moduleName) + { + var cpuArchitecture = CommonHelper.GetLocalizedString("CpuArchitecture_Unknown"); + + try + { + unsafe + { + IMAGE_FILE_MACHINE processInfo; + IMAGE_FILE_MACHINE machineInfo; + var isWow64Result = PInvoke.IsWow64Process2(handle, out processInfo, &machineInfo); + if (isWow64Result) + { + var processArchitecture = GetTargetArchitecture(processInfo); + var machineArchitecture = GetTargetArchitecture(machineInfo); + + // "Unknown" means this is not a WOW64 process. + if (processArchitecture == CpuArchitecture.Unknown) + { + if (machineArchitecture == CpuArchitecture.X64) + { + // If this is an x64 machine and it's not a WOW64 process, it's an x64 process. + cpuArchitecture = CommonHelper.GetLocalizedString("CpuArchitecture_X64onX64"); + } + else + { + // If this is not an x64 machine, we need to get the process architecture from the process itself. + var processMachineInfo = default(PROCESS_MACHINE_INFORMATION); + var getProcInfoResult + = PInvoke.GetProcessInformation( + handle, + PROCESS_INFORMATION_CLASS.ProcessMachineTypeInfo, + &processMachineInfo, + (uint)Marshal.SizeOf()); + if (getProcInfoResult) + { + // Report the process architecture and the machine architecture. + processArchitecture = GetTargetArchitecture(processMachineInfo.ProcessMachine); + cpuArchitecture = CommonHelper.GetLocalizedString( + "CpuArchitecture_ProcessOnMachine", processArchitecture, machineArchitecture); + } + else + { + // If we can't get the process architecture, just report the machine architecture. + cpuArchitecture = CommonHelper.GetLocalizedString( + "CpuArchitecture_UnknownOnMachine", machineArchitecture); + } + } + } + else + { + // This is a WOW64 process, so report the process architecture and the machine architecture. + cpuArchitecture = CommonHelper.GetLocalizedString( + "CpuArchitecture_ProcessOnMachine", processArchitecture, machineArchitecture); + } + } + } + } + catch (Exception ex) + { + _log.Error(ex, "Error getting app architecture"); + } + + return cpuArchitecture; + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Helpers/WindowHooker`1.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHooker`1.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Helpers/WindowHooker`1.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHooker`1.cs index ce45af25fb..0e44c2b8b9 100644 --- a/tools/DevInsights/DevHome.DevInsights/Helpers/WindowHooker`1.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Helpers/WindowHooker`1.cs @@ -1,86 +1,86 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using Serilog; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.UI.WindowsAndMessaging; - -namespace DevHome.DevInsights.Helpers; - -internal abstract class WindowHooker -{ - private static nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint newLong) - { - if (IntPtr.Size == 8) - { - return CommonInterop.SetWindowLongPtr64(hWnd, nIndex, newLong); - } - else - { - return (nint)PInvoke.SetWindowLong(hWnd, nIndex, (int)newLong); - } - } - - protected static readonly ILogger Log = Serilog.Log.ForContext("SourceContext", nameof(T)); - - private readonly WNDPROC windowProcHook; - - private HWND listenerHwnd; - - private WNDPROC? originalWndProc; - - protected HWND ListenerHwnd { get => listenerHwnd; set => listenerHwnd = value; } - - internal WindowHooker() - { - windowProcHook = CustomWndProc; - } - - public virtual void Start(HWND listeningWindow) - { - if (ListenerHwnd != HWND.Null) - { - // No-OP if we're already running - Debug.Assert(ListenerHwnd == listeningWindow, "Why are we trying to start with a different hwnd?"); - return; - } - - ArgumentNullException.ThrowIfNull(listeningWindow, nameof(listeningWindow)); - - var wndproc = SetWindowLongPtr(listeningWindow, WINDOW_LONG_PTR_INDEX.GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(windowProcHook)); - if (wndproc == IntPtr.Zero) - { - Log.Error("SetWindowLongPtr failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.InvariantCulture)); - return; - } - - originalWndProc = Marshal.GetDelegateForFunctionPointer(wndproc); - ListenerHwnd = listeningWindow; - } - - public virtual void Stop() - { - if (ListenerHwnd != HWND.Null) - { - Debug.Assert(originalWndProc != null, "Where did the original wndproc go?"); - - var result = SetWindowLongPtr(ListenerHwnd, WINDOW_LONG_PTR_INDEX.GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(originalWndProc)); - if (result == IntPtr.Zero) - { - Log.Error("SetWindowLongPtr failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.InvariantCulture)); - } - - ListenerHwnd = HWND.Null; - } - } - - protected virtual LRESULT CustomWndProc(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam) - { - return PInvoke.CallWindowProc(originalWndProc, hWnd, msg, wParam, lParam); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics; +using System.Globalization; +using System.Runtime.InteropServices; +using Serilog; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace DevHome.DevDiagnostics.Helpers; + +internal abstract class WindowHooker +{ + private static nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint newLong) + { + if (IntPtr.Size == 8) + { + return CommonInterop.SetWindowLongPtr64(hWnd, nIndex, newLong); + } + else + { + return (nint)PInvoke.SetWindowLong(hWnd, nIndex, (int)newLong); + } + } + + protected static readonly ILogger Log = Serilog.Log.ForContext("SourceContext", nameof(T)); + + private readonly WNDPROC windowProcHook; + + private HWND listenerHwnd; + + private WNDPROC? originalWndProc; + + protected HWND ListenerHwnd { get => listenerHwnd; set => listenerHwnd = value; } + + internal WindowHooker() + { + windowProcHook = CustomWndProc; + } + + public virtual void Start(HWND listeningWindow) + { + if (ListenerHwnd != HWND.Null) + { + // No-OP if we're already running + Debug.Assert(ListenerHwnd == listeningWindow, "Why are we trying to start with a different hwnd?"); + return; + } + + ArgumentNullException.ThrowIfNull(listeningWindow, nameof(listeningWindow)); + + var wndproc = SetWindowLongPtr(listeningWindow, WINDOW_LONG_PTR_INDEX.GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(windowProcHook)); + if (wndproc == IntPtr.Zero) + { + Log.Error("SetWindowLongPtr failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.InvariantCulture)); + return; + } + + originalWndProc = Marshal.GetDelegateForFunctionPointer(wndproc); + ListenerHwnd = listeningWindow; + } + + public virtual void Stop() + { + if (ListenerHwnd != HWND.Null) + { + Debug.Assert(originalWndProc != null, "Where did the original wndproc go?"); + + var result = SetWindowLongPtr(ListenerHwnd, WINDOW_LONG_PTR_INDEX.GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(originalWndProc)); + if (result == IntPtr.Zero) + { + Log.Error("SetWindowLongPtr failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.InvariantCulture)); + } + + ListenerHwnd = HWND.Null; + } + } + + protected virtual LRESULT CustomWndProc(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam) + { + return PInvoke.CallWindowProc(originalWndProc, hWnd, msg, wParam, lParam); + } +} diff --git a/tools/DevDiagnostics/DevHome.DevDiagnostics/Images/DD.ico b/tools/DevDiagnostics/DevHome.DevDiagnostics/Images/DD.ico new file mode 100644 index 0000000000000000000000000000000000000000..84014e6192492a72f9e12192525186c61e6583a3 GIT binary patch literal 151604 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�~6B*a(XPzHHZQp>4%Y&7=Brt1+AX8f7emwi59**N?EUc3s`Yt=~V453imbkG0f6hWN;4!D} zdOwMg8h6NKNnMRg&vCrZ|Lf}ng*hH$;?4m|b&XJ{x~|6a|0|Eexv{QV;MCR45R_&v zDPMpo%o-PeNnKstoEbA_AgFU0U0>tk*VL4kl`W~Mt3d<=s_O*(g^R0em{wL&?#b)X zcbxgv)r-qZpp39Zjf?L%Kn_{%`Z{Pfv!)K|0Ih&s+Jupwi&l zG~G8U-={X8r=+2l=h_plJE2cZNniHgR6H4%I1;8W4f;luFhf~h=fynZ_XvFBF;D)~ z@;VLru;W~ojw@k?QRTTWQ}taYaZTmv>q_NMT=ri~xTZ8oTMbn_#$}$GF4NRd%~#_R zM@?f~rt>UU!Zx2K63-U0Y}7B;a#1vs=Ap~$a3A*7*|^?zoc`bA`mN)9;Q?G2?-dtD z!@q$1F97e0t;kO~4t9B?&y4d2!6PzxeF;vJKIvAJ@BzIZCXH zqa9GJcol6>Yy;O`8_=Ez1~B70dqy~AdU!t@D1`f9bJPwFA41cD0@DD_aS_~(EAyw% znTACnbJ%xg{>-^^XU?3%-YfIOzqxZ}&Ag7$IYgK{SEMq>nLcwC{zRUDqyLTfIs5+s D^9AZs literal 0 HcmV?d00001 diff --git a/tools/DevInsights/DevHome.DevInsights/Models/AppRuntimeInfo.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/AppRuntimeInfo.cs similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Models/AppRuntimeInfo.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/AppRuntimeInfo.cs index 30e5ca54ad..3e701eec1a 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/AppRuntimeInfo.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/AppRuntimeInfo.cs @@ -8,11 +8,11 @@ using System.Management; using System.Text.RegularExpressions; using CommunityToolkit.Mvvm.ComponentModel; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI.Xaml; using Serilog; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class AppRuntimeInfo : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/ClipboardContents.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardContents.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Models/ClipboardContents.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardContents.cs index b3885915a7..325c1dc29c 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/ClipboardContents.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardContents.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class ClipboardContents { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/ClipboardMonitor.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardMonitor.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Models/ClipboardMonitor.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardMonitor.cs index 29465fdc21..48d5925567 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/ClipboardMonitor.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ClipboardMonitor.cs @@ -1,187 +1,187 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using System.Threading; -using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; -using Microsoft.UI.Xaml; -using Windows.Win32; -using Windows.Win32.Foundation; - -namespace DevHome.DevInsights.Models; - -internal sealed class ClipboardMonitor : WindowHooker, INotifyPropertyChanged -{ - public static readonly ClipboardMonitor Instance = new(); - - public ClipboardContents Contents { get; private set; } = new(); - - public event PropertyChangedEventHandler? PropertyChanged; - - internal ClipboardMonitor() - { - } - - private void ClipboardChanged() - { - SafeHandle? h = null; - ClipboardContents newContents = new(); - try - { - var clipboardText = string.Empty; - PInvoke.OpenClipboard(ListenerHwnd); - h = PInvoke.GetClipboardData_SafeHandle(13 /* CF_UNICODETEXT */); - if (!h.IsInvalid) - { - unsafe - { - var p = PInvoke.GlobalLock(h); - clipboardText = Marshal.PtrToStringUni((IntPtr)p) ?? string.Empty; - } - - if (clipboardText != string.Empty) - { - newContents = ParseClipboardContents(clipboardText); - } - } - } - finally - { - if (h is not null && !h.IsInvalid) - { - PInvoke.GlobalUnlock(h); - - // You're not suppose to close this handle. - h.SetHandleAsInvalid(); - } - - PInvoke.CloseClipboard(); - - Contents = newContents; - OnPropertyChanged(nameof(Contents)); - } - } - - /* TODO This pattern matches the following: - 100 - 0x100 - 0x80040005 - -2147221499 - -1 - 0xabc - abc - ffffffff - 1de - cab - bee - - ...but sequences like "cab", "bee", "fed" could be false positives. We need - more logic to exclude these. - */ - private static readonly Regex _findNumbersRegex = - new( - pattern: @"(?:0[xX][0-9A-Fa-f]+|-?\b(?:\d+|\d*\.\d+)\b|\b[0-9A-Fa-f]+\b)", - options: RegexOptions.Compiled | RegexOptions.IgnoreCase); - - private ClipboardContents ParseClipboardContents(string text) - { - ClipboardContents newContents = new(); - - // If this text contains a number, show it in different number bases. - var matches = _findNumbersRegex.Matches(text); - - foreach (var match in matches.Cast()) - { - var original = match.ToString(); - - // Assume the number is easily identifable as either base 10 or base 16... convert to int. - int? errorAsInt = CommonHelper.ParseStringToInt(original); - - if (errorAsInt is null) - { - // If this ConvertFromString() function fails due to a bad format, update the above regex to ensure - // the bad string isn't fed to this function. - Log.Warning("Failed to parse \" {original} \" to a number", original); - return newContents; - } - - newContents.Raw = original; - newContents.Hex = Convert.ToString((int)errorAsInt, 16); - newContents.Dec = Convert.ToString((int)errorAsInt, 10); - - var errors = ErrorLookupHelper.LookupError((int)errorAsInt); - if (errors is not null) - { - foreach (var error in errors) - { - // Seperate each error with a space. These errors aren't localized, so we may not need to worry - // about the space being in the wrong place. - if (newContents.Code != string.Empty) - { - newContents.Code += " "; - newContents.Help += " "; - } - - newContents.Code += error.Name; - newContents.Help += error.Help; - } - } - - break; - } - - return newContents; - } - - public void Start() - { - var primaryWindow = Application.Current.GetService(); - Start((HWND)primaryWindow.GetWindowHandle()); - } - - public override void Start(HWND hwndUsedForListening) - { - base.Start(hwndUsedForListening); - - var success = PInvoke.AddClipboardFormatListener(ListenerHwnd); - if (!success) - { - Log.Error("AddClipboardFormatListener failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.CurrentCulture)); - } - } - - public override void Stop() - { - if (ListenerHwnd != HWND.Null) - { - PInvoke.RemoveClipboardFormatListener(ListenerHwnd); - - base.Stop(); - } - } - - protected override LRESULT CustomWndProc(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam) - { - switch (msg) - { - case PInvoke.WM_CLIPBOARDUPDATE: - { - ThreadPool.QueueUserWorkItem((o) => ClipboardChanged()); - break; - } - } - - return base.CustomWndProc(hWnd, msg, wParam, lParam); - } - - private void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Threading; +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Helpers; +using Microsoft.UI.Xaml; +using Windows.Win32; +using Windows.Win32.Foundation; + +namespace DevHome.DevDiagnostics.Models; + +internal sealed class ClipboardMonitor : WindowHooker, INotifyPropertyChanged +{ + public static readonly ClipboardMonitor Instance = new(); + + public ClipboardContents Contents { get; private set; } = new(); + + public event PropertyChangedEventHandler? PropertyChanged; + + internal ClipboardMonitor() + { + } + + private void ClipboardChanged() + { + SafeHandle? h = null; + ClipboardContents newContents = new(); + try + { + var clipboardText = string.Empty; + PInvoke.OpenClipboard(ListenerHwnd); + h = PInvoke.GetClipboardData_SafeHandle(13 /* CF_UNICODETEXT */); + if (!h.IsInvalid) + { + unsafe + { + var p = PInvoke.GlobalLock(h); + clipboardText = Marshal.PtrToStringUni((IntPtr)p) ?? string.Empty; + } + + if (clipboardText != string.Empty) + { + newContents = ParseClipboardContents(clipboardText); + } + } + } + finally + { + if (h is not null && !h.IsInvalid) + { + PInvoke.GlobalUnlock(h); + + // You're not suppose to close this handle. + h.SetHandleAsInvalid(); + } + + PInvoke.CloseClipboard(); + + Contents = newContents; + OnPropertyChanged(nameof(Contents)); + } + } + + /* TODO This pattern matches the following: + 100 + 0x100 + 0x80040005 + -2147221499 + -1 + 0xabc + abc + ffffffff + 1de + cab + bee + + ...but sequences like "cab", "bee", "fed" could be false positives. We need + more logic to exclude these. + */ + private static readonly Regex _findNumbersRegex = + new( + pattern: @"(?:0[xX][0-9A-Fa-f]+|-?\b(?:\d+|\d*\.\d+)\b|\b[0-9A-Fa-f]+\b)", + options: RegexOptions.Compiled | RegexOptions.IgnoreCase); + + private ClipboardContents ParseClipboardContents(string text) + { + ClipboardContents newContents = new(); + + // If this text contains a number, show it in different number bases. + var matches = _findNumbersRegex.Matches(text); + + foreach (var match in matches.Cast()) + { + var original = match.ToString(); + + // Assume the number is easily identifable as either base 10 or base 16... convert to int. + int? errorAsInt = CommonHelper.ParseStringToInt(original); + + if (errorAsInt is null) + { + // If this ConvertFromString() function fails due to a bad format, update the above regex to ensure + // the bad string isn't fed to this function. + Log.Warning("Failed to parse \" {original} \" to a number", original); + return newContents; + } + + newContents.Raw = original; + newContents.Hex = Convert.ToString((int)errorAsInt, 16); + newContents.Dec = Convert.ToString((int)errorAsInt, 10); + + var errors = ErrorLookupHelper.LookupError((int)errorAsInt); + if (errors is not null) + { + foreach (var error in errors) + { + // Seperate each error with a space. These errors aren't localized, so we may not need to worry + // about the space being in the wrong place. + if (newContents.Code != string.Empty) + { + newContents.Code += " "; + newContents.Help += " "; + } + + newContents.Code += error.Name; + newContents.Help += error.Help; + } + } + + break; + } + + return newContents; + } + + public void Start() + { + var primaryWindow = Application.Current.GetService(); + Start((HWND)primaryWindow.GetWindowHandle()); + } + + public override void Start(HWND hwndUsedForListening) + { + base.Start(hwndUsedForListening); + + var success = PInvoke.AddClipboardFormatListener(ListenerHwnd); + if (!success) + { + Log.Error("AddClipboardFormatListener failed: {GetLastError}", Marshal.GetLastWin32Error().ToString(CultureInfo.CurrentCulture)); + } + } + + public override void Stop() + { + if (ListenerHwnd != HWND.Null) + { + PInvoke.RemoveClipboardFormatListener(ListenerHwnd); + + base.Stop(); + } + } + + protected override LRESULT CustomWndProc(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam) + { + switch (msg) + { + case PInvoke.WM_CLIPBOARDUPDATE: + { + ThreadPool.QueueUserWorkItem((o) => ClipboardChanged()); + break; + } + } + + return base.CustomWndProc(hWnd, msg, wParam, lParam); + } + + private void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Models/FrameworkType.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/FrameworkType.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Models/FrameworkType.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/FrameworkType.cs index f1a4eed32c..6f36a04388 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/FrameworkType.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/FrameworkType.cs @@ -3,7 +3,7 @@ using CommunityToolkit.Mvvm.ComponentModel; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class FrameworkType : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/Insight.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Insight.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Models/Insight.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Insight.cs index 380ab6fa2f..04f5b77e66 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/Insight.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Insight.cs @@ -4,7 +4,7 @@ using System.Text.RegularExpressions; using CommunityToolkit.Mvvm.ComponentModel; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; internal enum InsightType { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/InstalledAppInfo.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/InstalledAppInfo.cs similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Models/InstalledAppInfo.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/InstalledAppInfo.cs index 3ed18f71d4..102bdf2f1e 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/InstalledAppInfo.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/InstalledAppInfo.cs @@ -4,7 +4,7 @@ using Microsoft.UI.Xaml.Media.Imaging; using Windows.ApplicationModel; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class InstalledAppInfo { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/NavLink.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/NavLink.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Models/NavLink.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/NavLink.cs index f774c8e7b0..5065ccde6e 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/NavLink.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/NavLink.cs @@ -3,7 +3,7 @@ using System; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class NavLink { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/PackageInfo.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PackageInfo.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Models/PackageInfo.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PackageInfo.cs index 7d96ebe020..c9ccfd4da0 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/PackageInfo.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PackageInfo.cs @@ -3,7 +3,7 @@ using CommunityToolkit.Mvvm.ComponentModel; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class PackageInfo : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/PerfCounters.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PerfCounters.cs similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Models/PerfCounters.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PerfCounters.cs index dff7672124..0aedc40658 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/PerfCounters.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/PerfCounters.cs @@ -10,11 +10,11 @@ using CommunityToolkit.Mvvm.ComponentModel; using Serilog; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class PerfCounters : ObservableObject, IDisposable -{ - private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(PerfCounters)); +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(PerfCounters)); public static readonly PerfCounters Instance = new(); diff --git a/tools/DevInsights/DevHome.DevInsights/Models/ProcessModuleInfo.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ProcessModuleInfo.cs similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Models/ProcessModuleInfo.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ProcessModuleInfo.cs index 1f2ef5dbb9..f3cff12e8d 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/ProcessModuleInfo.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ProcessModuleInfo.cs @@ -4,7 +4,7 @@ using System.Diagnostics; using System.IO; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class ProcessModuleInfo { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/RestoreState.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/RestoreState.cs similarity index 91% rename from tools/DevInsights/DevHome.DevInsights/Models/RestoreState.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/RestoreState.cs index 42e34616fa..1e1206a6eb 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/RestoreState.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/RestoreState.cs @@ -3,7 +3,7 @@ using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; internal sealed class RestoreState { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/Setting.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Setting.cs similarity index 91% rename from tools/DevInsights/DevHome.DevInsights/Models/Setting.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Setting.cs index 3cdae29e2a..0eeed2d7c9 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/Setting.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/Setting.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class Setting { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/TargetAppData.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/TargetAppData.cs similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Models/TargetAppData.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/TargetAppData.cs index fdcc95d3ff..a42ca63520 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/TargetAppData.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/TargetAppData.cs @@ -11,9 +11,9 @@ using Microsoft.Win32.SafeHandles; using Windows.Win32; using Windows.Win32.Foundation; -using static DevHome.DevInsights.Helpers.WindowHelper; +using static DevHome.DevDiagnostics.Helpers.WindowHelper; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class TargetAppData : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/ThemeName.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ThemeName.cs similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/Models/ThemeName.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ThemeName.cs index b9399f4944..0ee4e8891a 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/ThemeName.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/ThemeName.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.UI.Xaml; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class ThemeName { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalysis.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysis.cs similarity index 97% rename from tools/DevInsights/DevHome.DevInsights/Models/WERAnalysis.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysis.cs index 1aed780182..95563c7f55 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalysis.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysis.cs @@ -5,10 +5,10 @@ using System.Diagnostics; using System.IO; using System.Text.RegularExpressions; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Serilog; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; // This class holds the WER analysis from a single dump analysis tool public class WERAnalysis diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalysisReport.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysisReport.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Models/WERAnalysisReport.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysisReport.cs index ecb0d19a46..cbe0e34205 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalysisReport.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalysisReport.cs @@ -6,10 +6,10 @@ using System.Diagnostics; using CommunityToolkit.Mvvm.ComponentModel; using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI.Xaml; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; // This class contains a collection of all of the analysis reports generated by the // different tools that are registered as crash analyzers diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalyzer.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalyzer.cs similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Models/WERAnalyzer.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalyzer.cs index f1d76efc07..7f62b1469f 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WERAnalyzer.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERAnalyzer.cs @@ -9,10 +9,10 @@ using System.Linq; using System.Threading; using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI.Xaml; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; // This class monitors for WER reports and runs analysis on them public class WERAnalyzer : IDisposable diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WERHelper.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERHelper.cs similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Models/WERHelper.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERHelper.cs index 7fbffce937..1d2dd13783 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WERHelper.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERHelper.cs @@ -11,11 +11,11 @@ using System.IO; using System.Threading; using DevHome.Common.Helpers; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.Win32; using Serilog; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; /* * This class is responsible for monitoring the system for WER reports. These reports are generated when an application crashes. diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WERReport.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERReport.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Models/WERReport.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERReport.cs index ae72808e11..f131e9e65f 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WERReport.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WERReport.cs @@ -7,7 +7,7 @@ using System.Runtime.CompilerServices; using CommunityToolkit.Mvvm.ComponentModel; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public partial class WERReport : ObservableObject { diff --git a/tools/DevInsights/DevHome.DevInsights/Models/WinLogsEntry.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WinLogsEntry.cs similarity index 92% rename from tools/DevInsights/DevHome.DevInsights/Models/WinLogsEntry.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WinLogsEntry.cs index 4562004e13..ac7473553a 100644 --- a/tools/DevInsights/DevHome.DevInsights/Models/WinLogsEntry.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Models/WinLogsEntry.cs @@ -3,11 +3,11 @@ using System; using System.Globalization; -using DevHome.DevInsights.Helpers; +using DevHome.DevDiagnostics.Helpers; using Microsoft.UI; using Microsoft.UI.Xaml.Media; -namespace DevHome.DevInsights.Models; +namespace DevHome.DevDiagnostics.Models; public class WinLogsEntry { diff --git a/tools/DevInsights/DevHome.DevInsights/NativeMethods.json b/tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.json similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/NativeMethods.json rename to tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.json index a6c9ed8b47..1175df48bf 100644 --- a/tools/DevInsights/DevHome.DevInsights/NativeMethods.json +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.json @@ -1,4 +1,4 @@ -{ - "$schema": "https://aka.ms/CsWin32.schema.json", - "wideCharOnly": true +{ + "$schema": "https://aka.ms/CsWin32.schema.json", + "wideCharOnly": true } \ No newline at end of file diff --git a/tools/DevInsights/DevHome.DevInsights/NativeMethods.txt b/tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.txt similarity index 93% rename from tools/DevInsights/DevHome.DevInsights/NativeMethods.txt rename to tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.txt index a47c8c19d9..99b722831e 100644 --- a/tools/DevInsights/DevHome.DevInsights/NativeMethods.txt +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/NativeMethods.txt @@ -1,119 +1,119 @@ -AddClipboardFormatListener -CallWindowProc -CloseClipboard -CoCreateInstance -CombineRgn -CreateEllipticRgn -CreateRectRgn -CreateRoundRectRgn -DefSubclassProc -DwmGetWindowAttribute -DwmSetWindowAttribute -DwmSetWindowAttribute -EnumChildWindows -EnumThreadWindows -EnumWindows -GetAncestor -GetBinaryType -GetClassLong -GetClassName -GetClipboardData -GetCurrentPackageFullName -GetCursorPos -GetDesktopWindow -GetForegroundWindow -GetMonitorInfo -GetMonitorInfo -GetOpenFileName -GetParent -GetProcessInformation -GetScaleFactorForMonitor -GetTopWindow -GetWindowInfo -GetWindowLong -GetWindowRect -GetWindowText -GetWindowText -GetWindowTextLength -GetWindowTextLength -GetWindowThreadProcessId -GlobalAddAtom -GlobalDeleteAtom -GlobalLock -GlobalUnlock -IsIconic -IsImmersiveProcess -IsWindow -IsWindowArranged -IsWindowVisible -IsWow64Process2 -IsZoomed -LoadIcon -LoadImage -MessageBox -MonitorFromWindow -MoveWindow -NtQueryInformationProcess -OpenClipboard -OpenProcessToken -RegisterHotKey -RemoveClipboardFormatListener -RmRegisterResources -RmStartSession -RmGetList -RmEndSession -SendMessage -SetFocus -SetForegroundWindow -SetParent -SetWindowLong -SetWindowLong -SetWindowPos -SetWindowRgn -SetWindowSubclass -SetWinEventHook -ShowWindow -SystemParametersInfo -UnhookWinEvent -UnregisterHotKey -WaitForSingleObject -WindowFromPoint -CF_* -DEVICE_SCALE_FACTOR -DWMWA_* -DWMWINDOWATTRIBUTE -EVENT_* -EVENT_OBJECT_DESTROY -EVENT_OBJECT_LOCATIONCHANGE -EVENT_SYSTEM_FOREGROUND -GET_ANCESTOR_FLAGS -GET_CLASS_LONG_INDEX -HMONITOR -HWND_* -ICON_* -ICON_* -ICON_* -IDI_* -IMAGE_* -INVALID_HANDLE_VALUE -LR_* -MOD_* -// MONITOR_DEFAULTTONEAREST -PROCESS_BASIC_INFORMATION -PROCESS_INFORMATION_CLASS -PROCESS_MACHINE_INFORMATION -RM_APP_TYPE -RM_UNIQUE_PROCESS -RM_PROCESS_INFO -RM_REBOOT_REASON -SECTION_FLAGS -SUBCLASSPROC -SW_* -VIRTUAL_KEY -WIN32_ERROR -WINEVENT_* -WINEVENT_OUTOFCONTEXT -WINEVENT_SKIPOWNPROCESS -WINDOWPOS -WM_* -WS_* +AddClipboardFormatListener +CallWindowProc +CloseClipboard +CoCreateInstance +CombineRgn +CreateEllipticRgn +CreateRectRgn +CreateRoundRectRgn +DefSubclassProc +DwmGetWindowAttribute +DwmSetWindowAttribute +DwmSetWindowAttribute +EnumChildWindows +EnumThreadWindows +EnumWindows +GetAncestor +GetBinaryType +GetClassLong +GetClassName +GetClipboardData +GetCurrentPackageFullName +GetCursorPos +GetDesktopWindow +GetForegroundWindow +GetMonitorInfo +GetMonitorInfo +GetOpenFileName +GetParent +GetProcessInformation +GetScaleFactorForMonitor +GetTopWindow +GetWindowInfo +GetWindowLong +GetWindowRect +GetWindowText +GetWindowText +GetWindowTextLength +GetWindowTextLength +GetWindowThreadProcessId +GlobalAddAtom +GlobalDeleteAtom +GlobalLock +GlobalUnlock +IsIconic +IsImmersiveProcess +IsWindow +IsWindowArranged +IsWindowVisible +IsWow64Process2 +IsZoomed +LoadIcon +LoadImage +MessageBox +MonitorFromWindow +MoveWindow +NtQueryInformationProcess +OpenClipboard +OpenProcessToken +RegisterHotKey +RemoveClipboardFormatListener +RmRegisterResources +RmStartSession +RmGetList +RmEndSession +SendMessage +SetFocus +SetForegroundWindow +SetParent +SetWindowLong +SetWindowLong +SetWindowPos +SetWindowRgn +SetWindowSubclass +SetWinEventHook +ShowWindow +SystemParametersInfo +UnhookWinEvent +UnregisterHotKey +WaitForSingleObject +WindowFromPoint +CF_* +DEVICE_SCALE_FACTOR +DWMWA_* +DWMWINDOWATTRIBUTE +EVENT_* +EVENT_OBJECT_DESTROY +EVENT_OBJECT_LOCATIONCHANGE +EVENT_SYSTEM_FOREGROUND +GET_ANCESTOR_FLAGS +GET_CLASS_LONG_INDEX +HMONITOR +HWND_* +ICON_* +ICON_* +ICON_* +IDI_* +IMAGE_* +INVALID_HANDLE_VALUE +LR_* +MOD_* +// MONITOR_DEFAULTTONEAREST +PROCESS_BASIC_INFORMATION +PROCESS_INFORMATION_CLASS +PROCESS_MACHINE_INFORMATION +RM_APP_TYPE +RM_UNIQUE_PROCESS +RM_PROCESS_INFO +RM_REBOOT_REASON +SECTION_FLAGS +SUBCLASSPROC +SW_* +VIRTUAL_KEY +WIN32_ERROR +WINEVENT_* +WINEVENT_OUTOFCONTEXT +WINEVENT_SKIPOWNPROCESS +WINDOWPOS +WM_* +WS_* diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/AboutPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AboutPage.xaml similarity index 97% rename from tools/DevInsights/DevHome.DevInsights/Pages/AboutPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AboutPage.xaml index 88eec9f915..bd87b1f75a 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/AboutPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AboutPage.xaml @@ -1,6 +1,6 @@ - + + xmlns:controls="using:DevHome.DevDiagnostics.Controls"> diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/AdditionalToolsPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdditionalToolsPage.xaml.cs similarity index 87% rename from tools/DevInsights/DevHome.DevInsights/Pages/AdditionalToolsPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdditionalToolsPage.xaml.cs index 997cd0c52f..c951b01f70 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/AdditionalToolsPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdditionalToolsPage.xaml.cs @@ -2,11 +2,11 @@ // Licensed under the MIT License. using DevHome.Common.Extensions; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Pages; +namespace DevHome.DevDiagnostics.Pages; public sealed partial class AdditionalToolsPage : Page { diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/AdvancedSettingsPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdvancedSettingsPage.xaml similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Pages/AdvancedSettingsPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdvancedSettingsPage.xaml index eacb1b5700..aec0de71f0 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/AdvancedSettingsPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AdvancedSettingsPage.xaml @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/AppDetailsPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AppDetailsPage.xaml.cs similarity index 82% rename from tools/DevInsights/DevHome.DevInsights/Pages/AppDetailsPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AppDetailsPage.xaml.cs index 36e6f0a5bd..b9f4943fcb 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/AppDetailsPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/AppDetailsPage.xaml.cs @@ -1,28 +1,28 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using DevHome.Common.Extensions; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Navigation; - -namespace DevHome.DevInsights.Pages; - -public partial class AppDetailsPage : Page -{ - private AppDetailsPageViewModel ViewModel { get; } - - public AppDetailsPage() - { - ViewModel = Application.Current.GetService(); - InitializeComponent(); - } - - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - Application.Current.GetService().SwitchTo(Feature.AppDetails); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; + +namespace DevHome.DevDiagnostics.Pages; + +public partial class AppDetailsPage : Page +{ + private AppDetailsPageViewModel ViewModel { get; } + + public AppDetailsPage() + { + ViewModel = Application.Current.GetService(); + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + Application.Current.GetService().SwitchTo(Feature.AppDetails); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml similarity index 95% rename from tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml index 8757bd9e1c..47a8b1b6e1 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml @@ -1,14 +1,14 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml.cs similarity index 84% rename from tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml.cs index 1df347b8a8..238fd34e24 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/InsightsPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/InsightsPage.xaml.cs @@ -2,13 +2,13 @@ // Licensed under the MIT License. using DevHome.Common.Extensions; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Navigation; -namespace DevHome.DevInsights.Pages; +namespace DevHome.DevDiagnostics.Pages; public sealed partial class InsightsPage : Page { diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml index e5a2f50d97..4a990a0456 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml @@ -1,78 +1,78 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml.cs similarity index 84% rename from tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml.cs index 230e370366..c2801b0e18 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/ModulesPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ModulesPage.xaml.cs @@ -1,34 +1,34 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using DevHome.Common.Extensions; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Navigation; - -namespace DevHome.DevInsights.Pages; - -public sealed partial class ModulesPage : Page -{ - private ModulesPageViewModel ViewModel { get; } - - public ModulesPage() - { - ViewModel = Application.Current.GetService(); - InitializeComponent(); - } - - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - Application.Current.GetService().SwitchTo(Feature.LoadedModule); - } - - private void GridSplitter_PointerPressed(object sender, PointerRoutedEventArgs e) - { - e.Handled = true; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Navigation; + +namespace DevHome.DevDiagnostics.Pages; + +public sealed partial class ModulesPage : Page +{ + private ModulesPageViewModel ViewModel { get; } + + public ModulesPage() + { + ViewModel = Application.Current.GetService(); + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + Application.Current.GetService().SwitchTo(Feature.LoadedModule); + } + + private void GridSplitter_PointerPressed(object sender, PointerRoutedEventArgs e) + { + e.Handled = true; + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/PreferencesPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/PreferencesPage.xaml similarity index 97% rename from tools/DevInsights/DevHome.DevInsights/Pages/PreferencesPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/PreferencesPage.xaml index 8bfd152ea5..17d1782466 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/PreferencesPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/PreferencesPage.xaml @@ -1,6 +1,6 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/ProcessListPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ProcessListPage.xaml.cs similarity index 85% rename from tools/DevInsights/DevHome.DevInsights/Pages/ProcessListPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ProcessListPage.xaml.cs index 2e2b3c154e..00fdb23744 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/ProcessListPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ProcessListPage.xaml.cs @@ -2,13 +2,13 @@ // Licensed under the MIT License. using DevHome.Common.Extensions; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Navigation; -namespace DevHome.DevInsights.Pages; +namespace DevHome.DevDiagnostics.Pages; public sealed partial class ProcessListPage : Page { diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml index 602a622ca3..0c9f0a1849 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml @@ -1,61 +1,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml.cs similarity index 84% rename from tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml.cs index 86deee8905..dff5679f52 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/ResourceUsagePage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/ResourceUsagePage.xaml.cs @@ -1,35 +1,35 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using DevHome.Common.Extensions; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Navigation; - -namespace DevHome.DevInsights.Pages; - -public sealed partial class ResourceUsagePage : Page, IDisposable -{ - private ResourceUsagePageViewModel ViewModel { get; } - - public ResourceUsagePage() - { - ViewModel = Application.Current.GetService(); - InitializeComponent(); - } - - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - Application.Current.GetService().SwitchTo(Feature.ResourceUsage); - } - - public void Dispose() - { - ViewModel.Dispose(); - GC.SuppressFinalize(this); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; + +namespace DevHome.DevDiagnostics.Pages; + +public sealed partial class ResourceUsagePage : Page, IDisposable +{ + private ResourceUsagePageViewModel ViewModel { get; } + + public ResourceUsagePage() + { + ViewModel = Application.Current.GetService(); + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + Application.Current.GetService().SwitchTo(Feature.ResourceUsage); + } + + public void Dispose() + { + ViewModel.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml similarity index 92% rename from tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml index 63446f3a63..8ca2a7707e 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml @@ -1,12 +1,12 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml.cs similarity index 80% rename from tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml.cs index c6b7835912..d333b94d6c 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/SettingsPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/SettingsPage.xaml.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Pages; +namespace DevHome.DevDiagnostics.Pages; public sealed partial class SettingsPage : Page { diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml similarity index 98% rename from tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml index 60185893da..ec5cd28873 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml @@ -1,12 +1,12 @@ diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml.cs index deb586085b..da708366fd 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/WERPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WERPage.xaml.cs @@ -7,15 +7,15 @@ using System.Linq; using CommunityToolkit.WinUI.UI.Controls; using DevHome.Common.Extensions; -using DevHome.DevInsights.Helpers; -using DevHome.DevInsights.Models; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.Helpers; +using DevHome.DevDiagnostics.Models; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Navigation; -namespace DevHome.DevInsights.Pages; +namespace DevHome.DevDiagnostics.Pages; public sealed partial class WERPage : Page { diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml index f02a690d25..49e93f1f41 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml @@ -1,109 +1,109 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml.cs similarity index 82% rename from tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml.cs index f4c3f9fbdf..4229ee3605 100644 --- a/tools/DevInsights/DevHome.DevInsights/Pages/WinLogsPage.xaml.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Pages/WinLogsPage.xaml.cs @@ -1,39 +1,39 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.ObjectModel; -using System.Linq; -using DevHome.Common.Extensions; -using DevHome.DevInsights.Models; -using DevHome.DevInsights.Telemetry; -using DevHome.DevInsights.ViewModels; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Navigation; - -namespace DevHome.DevInsights.Pages; - -public partial class WinLogsPage : Page, IDisposable -{ - public WinLogsPageViewModel ViewModel { get; } - - public WinLogsPage() - { - ViewModel = Application.Current.GetService(); - InitializeComponent(); - DataContext = this; - } - - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - Application.Current.GetService().SwitchTo(Feature.WinLogs); - } - - public void Dispose() - { - ViewModel.Dispose(); - GC.SuppressFinalize(this); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.ObjectModel; +using System.Linq; +using DevHome.Common.Extensions; +using DevHome.DevDiagnostics.Models; +using DevHome.DevDiagnostics.Telemetry; +using DevHome.DevDiagnostics.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; + +namespace DevHome.DevDiagnostics.Pages; + +public partial class WinLogsPage : Page, IDisposable +{ + public WinLogsPageViewModel ViewModel { get; } + + public WinLogsPage() + { + ViewModel = Application.Current.GetService(); + InitializeComponent(); + DataContext = this; + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + Application.Current.GetService().SwitchTo(Feature.WinLogs); + } + + public void Dispose() + { + ViewModel.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Program.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Program.cs similarity index 92% rename from tools/DevInsights/DevHome.DevInsights/Program.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Program.cs index a232295d07..4d5c710361 100644 --- a/tools/DevInsights/DevHome.DevInsights/Program.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Program.cs @@ -1,254 +1,254 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using DevHome.Common.Extensions; -using DevHome.Common.Helpers; -using DevHome.DevInsights.Helpers; -using DevHome.DevInsights.Models; -using DevHome.Service; -using Microsoft.Extensions.Configuration; -using Microsoft.UI.Dispatching; -using Microsoft.UI.Xaml; -using Microsoft.Windows.AppLifecycle; -using Serilog; -using Windows.ApplicationModel.Activation; -using WinRT; - -namespace DevHome.DevInsights; - -public static class Program -{ - private static App? _app; - private static bool _firstActivation = true; - - [global::System.Runtime.InteropServices.DllImport("Microsoft.ui.xaml.dll")] - [global::System.Runtime.InteropServices.DefaultDllImportSearchPaths(global::System.Runtime.InteropServices.DllImportSearchPath.SafeDirectories)] - private static extern void XamlCheckProcessRequirements(); - - private const string MainInstanceKey = "mainInstance"; - - private const string ElevatedInstanceKey = "elevatedInstance"; - - [STAThread] - public static void Main(string[] args) - { - var service = CommonHelper.GetDevHomeService(); - int num = service.GetNumber(); - - // Set up Logging - Environment.SetEnvironmentVariable("DEVHOME_LOGS_ROOT", Path.Join(Common.Logging.LogFolderRoot, "DevHome.DevInsights")); - var configuration = new ConfigurationBuilder() - .AddJsonFile("appsettings_di.json") - .Build(); - Log.Logger = new LoggerConfiguration() - .ReadFrom.Configuration(configuration) - .CreateLogger(); - - var stopEvent = new EventWaitHandle(false, EventResetMode.ManualReset, $"DevHomePI-{Environment.ProcessId}"); - ThreadPool.QueueUserWorkItem((o) => - { - var waitResult = stopEvent.WaitOne(); - - _app?.UIDispatcher?.TryEnqueue(() => - { - var primaryWindow = Application.Current.GetService(); - primaryWindow.Close(); - }); - }); - - try - { - XamlCheckProcessRequirements(); - - WinRT.ComWrappersSupport.InitializeComWrappers(); - - var isRedirect = DecideRedirection().GetAwaiter().GetResult(); - - if (!isRedirect) - { - Log.Information("Starting application"); - Application.Start((p) => - { - var dispatcherQueue = DispatcherQueue.GetForCurrentThread(); - var context = new DispatcherQueueSynchronizationContext(dispatcherQueue); - SynchronizationContext.SetSynchronizationContext(context); - _app = new App(); - OnActivated(null, AppInstance.GetCurrent().GetActivatedEventArgs()); - }); - } - - stopEvent.Close(); - stopEvent.Dispose(); - } - catch (Exception ex) - { - Log.Fatal(ex, "Application start-up failed"); - } - finally - { - Log.CloseAndFlush(); - } - } - - private static async Task DecideRedirection() - { - var activatedEventArgs = AppInstance.GetCurrent().GetActivatedEventArgs(); - var isElevatedInstancePresent = false; - var isUnElevatedInstancePresent = false; - var instanceList = AppInstance.GetInstances(); - foreach (var appInstance in instanceList) - { - if (appInstance.Key.Equals(MainInstanceKey, StringComparison.OrdinalIgnoreCase)) - { - isUnElevatedInstancePresent = true; - } - else if (appInstance.Key.Equals(ElevatedInstanceKey, StringComparison.OrdinalIgnoreCase)) - { - isElevatedInstancePresent = true; - } - } - - AppInstance instance; - if (isElevatedInstancePresent) - { - // Redirect to the elevated instance if present. - instance = AppInstance.FindOrRegisterForKey(ElevatedInstanceKey); - } - else if (RuntimeHelper.IsCurrentProcessRunningAsAdmin()) - { - // Wait for unelevated instance to exit - while (isUnElevatedInstancePresent) - { - isUnElevatedInstancePresent = false; - instanceList = AppInstance.GetInstances(); - foreach (var appInstance in instanceList) - { - if (appInstance.Key.Equals(MainInstanceKey, StringComparison.OrdinalIgnoreCase)) - { - isUnElevatedInstancePresent = true; - var stopAppInstance = new EventWaitHandle(false, EventResetMode.ManualReset, $"DevHomePI-{appInstance.ProcessId}"); - stopAppInstance.Set(); - } - } - } - - // Register the elevated instance key - instance = AppInstance.FindOrRegisterForKey(ElevatedInstanceKey); - } - else - { - instance = AppInstance.FindOrRegisterForKey(MainInstanceKey); - } - - var isRedirect = false; - if (instance.IsCurrent) - { - instance.Activated += OnActivated; - } - else - { - // Redirect the activation (and args) to the registered instance, and exit. - await instance.RedirectActivationToAsync(activatedEventArgs); - isRedirect = true; - } - - return isRedirect; - } - - private static void OnActivated(object? sender, Microsoft.Windows.AppLifecycle.AppActivationArguments e) - { - var wasFirstActivation = _firstActivation; - _firstActivation = false; - var commandLine = string.Empty; - if (e.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.Launch) - { - commandLine = e.Data.As().Arguments; - } - else if (e.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.StartupTask) - { - // Start the app in the background to handle the startup task and register the hotkey - if (wasFirstActivation && !App.IsFeatureEnabled()) - { - // Exit the process if PI Expermental feature is not enabled and its the first activation in the process - Log.Information("Experimental feature is not enabled. Exiting the process."); - Process.GetCurrentProcess().Kill(false); - } - - // Don't show the bar window for startup task activations. - return; - } - - // Convert commandLine into a string array. We just can't split based just on spaces, in case there are spaces inclosed in quotes - // i.e. --application "My App" - var commandLineArgs = Regex.Matches(commandLine, @"[\""].+?[\""]|[^ ]+").Select(m => m.Value).ToArray(); - - // TODO: This should be replaced with system.commandline Microsoft.Extensions.Configuration - // is not intended to be a general purpose commandline parser, but rather only supports /key=value or /key value pairs - var builder = new ConfigurationBuilder(); - builder.AddCommandLine(commandLineArgs); - var config = builder.Build(); - - Process? targetProcess = null; - var targetApp = config["application"]; - var targetPid = config["pid"]; - var pageToExpand = config["expandWindow"]; - - try - { - if (targetApp != null) - { - Debug.Assert(targetApp != string.Empty, "Why is appname empty?"); - - Process[] processes = Process.GetProcessesByName(targetApp); - if (processes.Length > 0) - { - targetProcess = processes[0]; - } - } - else if (targetPid != null) - { - var pid = int.Parse(targetPid, CultureInfo.CurrentCulture); - targetProcess = Process.GetProcessById(pid); - } - } - catch (Exception ex) - { - Log.Error(ex, "Failed to find target process {TargetApp} {TargetPid}", targetApp, targetPid); - } - - Debug.Assert(_app != null, "Why is _app null on a redirection?"); - - // Be sure to set the target app on the UI thread - _app?.UIDispatcher?.TryEnqueue(() => - { - if (targetProcess != null) - { - TargetAppData.Instance.SetNewAppData(targetProcess, Windows.Win32.Foundation.HWND.Null); - } - - // Show the bar window - var primaryWindow = Application.Current.GetService(); - primaryWindow.ShowBarWindow(); - - if (pageToExpand != null) - { - var barWindow = primaryWindow.DBarWindow; - Debug.Assert(barWindow is not null, "We show the bar window, so it cannot be null here"); - - var pageType = Type.GetType($"DevHome.DevInsights.ViewModels.{pageToExpand}"); - if (pageType is not null) - { - barWindow.NavigateTo(pageType); - } - } - }); - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using DevHome.Common.Extensions; +using DevHome.Common.Helpers; +using DevHome.DevDiagnostics.Helpers; +using DevHome.DevDiagnostics.Models; +using DevHome.Service; +using Microsoft.Extensions.Configuration; +using Microsoft.UI.Dispatching; +using Microsoft.UI.Xaml; +using Microsoft.Windows.AppLifecycle; +using Serilog; +using Windows.ApplicationModel.Activation; +using WinRT; + +namespace DevHome.DevDiagnostics; + +public static class Program +{ + private static App? _app; + private static bool _firstActivation = true; + + [global::System.Runtime.InteropServices.DllImport("Microsoft.ui.xaml.dll")] + [global::System.Runtime.InteropServices.DefaultDllImportSearchPaths(global::System.Runtime.InteropServices.DllImportSearchPath.SafeDirectories)] + private static extern void XamlCheckProcessRequirements(); + + private const string MainInstanceKey = "mainInstance"; + + private const string ElevatedInstanceKey = "elevatedInstance"; + + [STAThread] + public static void Main(string[] args) + { + var service = CommonHelper.GetDevHomeService(); + int num = service.GetNumber(); + + // Set up Logging + Environment.SetEnvironmentVariable("DEVHOME_LOGS_ROOT", Path.Join(Common.Logging.LogFolderRoot, "DevHome.DevDiagnostics")); + var configuration = new ConfigurationBuilder() + .AddJsonFile("appsettings_dd.json") + .Build(); + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .CreateLogger(); + + var stopEvent = new EventWaitHandle(false, EventResetMode.ManualReset, $"DevHomeDD-{Environment.ProcessId}"); + ThreadPool.QueueUserWorkItem((o) => + { + var waitResult = stopEvent.WaitOne(); + + _app?.UIDispatcher?.TryEnqueue(() => + { + var primaryWindow = Application.Current.GetService(); + primaryWindow.Close(); + }); + }); + + try + { + XamlCheckProcessRequirements(); + + WinRT.ComWrappersSupport.InitializeComWrappers(); + + var isRedirect = DecideRedirection().GetAwaiter().GetResult(); + + if (!isRedirect) + { + Log.Information("Starting application"); + Application.Start((p) => + { + var dispatcherQueue = DispatcherQueue.GetForCurrentThread(); + var context = new DispatcherQueueSynchronizationContext(dispatcherQueue); + SynchronizationContext.SetSynchronizationContext(context); + _app = new App(); + OnActivated(null, AppInstance.GetCurrent().GetActivatedEventArgs()); + }); + } + + stopEvent.Close(); + stopEvent.Dispose(); + } + catch (Exception ex) + { + Log.Fatal(ex, "Application start-up failed"); + } + finally + { + Log.CloseAndFlush(); + } + } + + private static async Task DecideRedirection() + { + var activatedEventArgs = AppInstance.GetCurrent().GetActivatedEventArgs(); + var isElevatedInstancePresent = false; + var isUnElevatedInstancePresent = false; + var instanceList = AppInstance.GetInstances(); + foreach (var appInstance in instanceList) + { + if (appInstance.Key.Equals(MainInstanceKey, StringComparison.OrdinalIgnoreCase)) + { + isUnElevatedInstancePresent = true; + } + else if (appInstance.Key.Equals(ElevatedInstanceKey, StringComparison.OrdinalIgnoreCase)) + { + isElevatedInstancePresent = true; + } + } + + AppInstance instance; + if (isElevatedInstancePresent) + { + // Redirect to the elevated instance if present. + instance = AppInstance.FindOrRegisterForKey(ElevatedInstanceKey); + } + else if (RuntimeHelper.IsCurrentProcessRunningAsAdmin()) + { + // Wait for unelevated instance to exit + while (isUnElevatedInstancePresent) + { + isUnElevatedInstancePresent = false; + instanceList = AppInstance.GetInstances(); + foreach (var appInstance in instanceList) + { + if (appInstance.Key.Equals(MainInstanceKey, StringComparison.OrdinalIgnoreCase)) + { + isUnElevatedInstancePresent = true; + var stopAppInstance = new EventWaitHandle(false, EventResetMode.ManualReset, $"DevHomeDD-{appInstance.ProcessId}"); + stopAppInstance.Set(); + } + } + } + + // Register the elevated instance key + instance = AppInstance.FindOrRegisterForKey(ElevatedInstanceKey); + } + else + { + instance = AppInstance.FindOrRegisterForKey(MainInstanceKey); + } + + var isRedirect = false; + if (instance.IsCurrent) + { + instance.Activated += OnActivated; + } + else + { + // Redirect the activation (and args) to the registered instance, and exit. + await instance.RedirectActivationToAsync(activatedEventArgs); + isRedirect = true; + } + + return isRedirect; + } + + private static void OnActivated(object? sender, Microsoft.Windows.AppLifecycle.AppActivationArguments e) + { + var wasFirstActivation = _firstActivation; + _firstActivation = false; + var commandLine = string.Empty; + if (e.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.Launch) + { + commandLine = e.Data.As().Arguments; + } + else if (e.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.StartupTask) + { + // Start the app in the background to handle the startup task and register the hotkey + if (wasFirstActivation && !App.IsFeatureEnabled()) + { + // Exit the process if PI Expermental feature is not enabled and its the first activation in the process + Log.Information("Experimental feature is not enabled. Exiting the process."); + Process.GetCurrentProcess().Kill(false); + } + + // Don't show the bar window for startup task activations. + return; + } + + // Convert commandLine into a string array. We just can't split based just on spaces, in case there are spaces inclosed in quotes + // i.e. --application "My App" + var commandLineArgs = Regex.Matches(commandLine, @"[\""].+?[\""]|[^ ]+").Select(m => m.Value).ToArray(); + + // TODO: This should be replaced with system.commandline Microsoft.Extensions.Configuration + // is not intended to be a general purpose commandline parser, but rather only supports /key=value or /key value pairs + var builder = new ConfigurationBuilder(); + builder.AddCommandLine(commandLineArgs); + var config = builder.Build(); + + Process? targetProcess = null; + var targetApp = config["application"]; + var targetPid = config["pid"]; + var pageToExpand = config["expandWindow"]; + + try + { + if (targetApp != null) + { + Debug.Assert(targetApp != string.Empty, "Why is appname empty?"); + + Process[] processes = Process.GetProcessesByName(targetApp); + if (processes.Length > 0) + { + targetProcess = processes[0]; + } + } + else if (targetPid != null) + { + var pid = int.Parse(targetPid, CultureInfo.CurrentCulture); + targetProcess = Process.GetProcessById(pid); + } + } + catch (Exception ex) + { + Log.Error(ex, "Failed to find target process {TargetApp} {TargetPid}", targetApp, targetPid); + } + + Debug.Assert(_app != null, "Why is _app null on a redirection?"); + + // Be sure to set the target app on the UI thread + _app?.UIDispatcher?.TryEnqueue(() => + { + if (targetProcess != null) + { + TargetAppData.Instance.SetNewAppData(targetProcess, Windows.Win32.Foundation.HWND.Null); + } + + // Show the bar window + var primaryWindow = Application.Current.GetService(); + primaryWindow.ShowBarWindow(); + + if (pageToExpand != null) + { + var barWindow = primaryWindow.DBarWindow; + Debug.Assert(barWindow is not null, "We show the bar window, so it cannot be null here"); + + var pageType = Type.GetType($"DevHome.DevDiagnostics.ViewModels.{pageToExpand}"); + if (pageType is not null) + { + barWindow.NavigateTo(pageType); + } + } + }); + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-arm64.pubxml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-arm64.pubxml similarity index 100% rename from tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-arm64.pubxml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-arm64.pubxml diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-x64.pubxml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-x64.pubxml similarity index 100% rename from tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-x64.pubxml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-x64.pubxml diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-x86.pubxml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-x86.pubxml similarity index 100% rename from tools/DevInsights/DevHome.DevInsights/Properties/PublishProfiles/win-x86.pubxml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/PublishProfiles/win-x86.pubxml diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/Settings.Designer.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.Designer.cs similarity index 96% rename from tools/DevInsights/DevHome.DevInsights/Properties/Settings.Designer.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.Designer.cs index 4797f1b98e..e5ba9ff041 100644 --- a/tools/DevInsights/DevHome.DevInsights/Properties/Settings.Designer.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.Designer.cs @@ -1,244 +1,244 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace DevHome.DevInsights.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeConHost { - get { - return ((bool)(this["IsProcessFilterIncludeConHost"])); - } - set { - this["IsProcessFilterIncludeConHost"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeDllHost { - get { - return ((bool)(this["IsProcessFilterIncludeDllHost"])); - } - set { - this["IsProcessFilterIncludeDllHost"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeSvcHost { - get { - return ((bool)(this["IsProcessFilterIncludeSvcHost"])); - } - set { - this["IsProcessFilterIncludeSvcHost"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeEdge { - get { - return ((bool)(this["IsProcessFilterIncludeEdge"])); - } - set { - this["IsProcessFilterIncludeEdge"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeWebview { - get { - return ((bool)(this["IsProcessFilterIncludeWebview"])); - } - set { - this["IsProcessFilterIncludeWebview"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeRtb { - get { - return ((bool)(this["IsProcessFilterIncludeRtb"])); - } - set { - this["IsProcessFilterIncludeRtb"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeWmi { - get { - return ((bool)(this["IsProcessFilterIncludeWmi"])); - } - set { - this["IsProcessFilterIncludeWmi"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeWudf { - get { - return ((bool)(this["IsProcessFilterIncludeWudf"])); - } - set { - this["IsProcessFilterIncludeWudf"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsProcessFilterIncludeBgTaskHost { - get { - return ((bool)(this["IsProcessFilterIncludeBgTaskHost"])); - } - set { - this["IsProcessFilterIncludeBgTaskHost"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Default")] - public string CurrentTheme { - get { - return ((string)(this["CurrentTheme"])); - } - set { - this["CurrentTheme"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool IsCpuUsageMonitoringEnabled { - get { - return ((bool)(this["IsCpuUsageMonitoringEnabled"])); - } - set { - this["IsCpuUsageMonitoringEnabled"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool IsInsightsOnStartupEnabled { - get { - return ((bool)(this["IsInsightsOnStartupEnabled"])); - } - set { - this["IsInsightsOnStartupEnabled"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool IsClipboardMonitoringEnabled { - get { - return ((bool)(this["IsClipboardMonitoringEnabled"])); - } - set { - this["IsClipboardMonitoringEnabled"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n DevHome.DevInsights\r\n DevEnv\r\n")] - public global::System.Collections.Specialized.StringCollection ExcludedProcesses { - get { - return ((global::System.Collections.Specialized.StringCollection)(this["ExcludedProcesses"])); - } - set { - this["ExcludedProcesses"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0")] - public double ExpandedWindowHeight { - get { - return ((double)(this["ExpandedWindowHeight"])); - } - set { - this["ExpandedWindowHeight"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool ApplyAppFilteringToData { - get { - return ((bool)(this["ApplyAppFilteringToData"])); - } - set { - this["ApplyAppFilteringToData"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("0")] - public double WindowWidth { - get { - return ((double)(this["WindowWidth"])); - } - set { - this["WindowWidth"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool IsClipboardMonitorToolPinned { - get { - return ((bool)(this["IsClipboardMonitorToolPinned"])); - } - set { - this["IsClipboardMonitorToolPinned"] = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DevHome.DevDiagnostics.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeConHost { + get { + return ((bool)(this["IsProcessFilterIncludeConHost"])); + } + set { + this["IsProcessFilterIncludeConHost"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeDllHost { + get { + return ((bool)(this["IsProcessFilterIncludeDllHost"])); + } + set { + this["IsProcessFilterIncludeDllHost"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeSvcHost { + get { + return ((bool)(this["IsProcessFilterIncludeSvcHost"])); + } + set { + this["IsProcessFilterIncludeSvcHost"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeEdge { + get { + return ((bool)(this["IsProcessFilterIncludeEdge"])); + } + set { + this["IsProcessFilterIncludeEdge"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeWebview { + get { + return ((bool)(this["IsProcessFilterIncludeWebview"])); + } + set { + this["IsProcessFilterIncludeWebview"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeRtb { + get { + return ((bool)(this["IsProcessFilterIncludeRtb"])); + } + set { + this["IsProcessFilterIncludeRtb"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeWmi { + get { + return ((bool)(this["IsProcessFilterIncludeWmi"])); + } + set { + this["IsProcessFilterIncludeWmi"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeWudf { + get { + return ((bool)(this["IsProcessFilterIncludeWudf"])); + } + set { + this["IsProcessFilterIncludeWudf"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsProcessFilterIncludeBgTaskHost { + get { + return ((bool)(this["IsProcessFilterIncludeBgTaskHost"])); + } + set { + this["IsProcessFilterIncludeBgTaskHost"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Default")] + public string CurrentTheme { + get { + return ((string)(this["CurrentTheme"])); + } + set { + this["CurrentTheme"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool IsCpuUsageMonitoringEnabled { + get { + return ((bool)(this["IsCpuUsageMonitoringEnabled"])); + } + set { + this["IsCpuUsageMonitoringEnabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsInsightsOnStartupEnabled { + get { + return ((bool)(this["IsInsightsOnStartupEnabled"])); + } + set { + this["IsInsightsOnStartupEnabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool IsClipboardMonitoringEnabled { + get { + return ((bool)(this["IsClipboardMonitoringEnabled"])); + } + set { + this["IsClipboardMonitoringEnabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n DevHome.DevDiagnostics\r\n DevEnv\r\n")] + public global::System.Collections.Specialized.StringCollection ExcludedProcesses { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["ExcludedProcesses"])); + } + set { + this["ExcludedProcesses"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double ExpandedWindowHeight { + get { + return ((double)(this["ExpandedWindowHeight"])); + } + set { + this["ExpandedWindowHeight"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ApplyAppFilteringToData { + get { + return ((bool)(this["ApplyAppFilteringToData"])); + } + set { + this["ApplyAppFilteringToData"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public double WindowWidth { + get { + return ((double)(this["WindowWidth"])); + } + set { + this["WindowWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool IsClipboardMonitorToolPinned { + get { + return ((bool)(this["IsClipboardMonitorToolPinned"])); + } + set { + this["IsClipboardMonitorToolPinned"] = value; + } + } + } +} diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/Settings.settings b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.settings similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Properties/Settings.settings rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.settings index 5b40623c38..90bfa1e423 100644 --- a/tools/DevInsights/DevHome.DevInsights/Properties/Settings.settings +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/Settings.settings @@ -1,64 +1,64 @@ - - - - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - Default - - - True - - - False - - - True - - - <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <string>DevHome.DevInsights</string> - <string>DevEnv</string> -</ArrayOfString> - - - 0 - - - True - - - 0 - - - True - - + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + Default + + + True + + + False + + + True + + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string>DevHome.DevDiagnostics</string> + <string>DevEnv</string> +</ArrayOfString> + + + 0 + + + True + + + 0 + + + True + + \ No newline at end of file diff --git a/tools/DevInsights/DevHome.DevInsights/Properties/launchSettings.json b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/launchSettings.json similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Properties/launchSettings.json rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/launchSettings.json index 42306ffcb9..6b879c1875 100644 --- a/tools/DevInsights/DevHome.DevInsights/Properties/launchSettings.json +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Properties/launchSettings.json @@ -1,8 +1,8 @@ -{ - "profiles": { - "DevHome.PI (Unpackaged)": { - "commandName": "Project", - "nativeDebugging": true - } - } +{ + "profiles": { + "DevHome.PI (Unpackaged)": { + "commandName": "Project", + "nativeDebugging": true + } + } } \ No newline at end of file diff --git a/tools/DevInsights/DevHome.DevInsights/Services/DIAppInfoService.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDAppInfoService.cs similarity index 86% rename from tools/DevInsights/DevHome.DevInsights/Services/DIAppInfoService.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDAppInfoService.cs index 14aa5518a4..1d8cbafed6 100644 --- a/tools/DevInsights/DevHome.DevInsights/Services/DIAppInfoService.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDAppInfoService.cs @@ -7,11 +7,11 @@ using DevHome.Common.Helpers; using Windows.ApplicationModel; -namespace DevHome.DevInsights.Services; +namespace DevHome.DevDiagnostics.Services; -public class DIAppInfoService +public class DDAppInfoService { - public string IconPath { get; } = Path.Combine(AppContext.BaseDirectory, "Images/DI.ico"); + public string IconPath { get; } = Path.Combine(AppContext.BaseDirectory, "Images/DD.ico"); public Version GetAppVersion() { diff --git a/tools/DevInsights/DevHome.DevInsights/Services/DIInsightsService.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDInsightsService.cs similarity index 90% rename from tools/DevInsights/DevHome.DevInsights/Services/DIInsightsService.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDInsightsService.cs index 4f1e5567ca..4787b951e5 100644 --- a/tools/DevInsights/DevHome.DevInsights/Services/DIInsightsService.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDInsightsService.cs @@ -7,11 +7,11 @@ using System.Diagnostics; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; -using DevHome.DevInsights.Models; +using DevHome.DevDiagnostics.Models; -namespace DevHome.DevInsights.Services; +namespace DevHome.DevDiagnostics.Services; -public partial class DIInsightsService : ObservableObject +public partial class DDInsightsService : ObservableObject { private Process? _targetProcess; @@ -21,7 +21,7 @@ public partial class DIInsightsService : ObservableObject [ObservableProperty] private ObservableCollection _insightsList; - public DIInsightsService() + public DDInsightsService() { TargetAppData.Instance.PropertyChanged += TargetApp_PropertyChanged; _insightsList = []; diff --git a/tools/DevInsights/DevHome.DevInsights/Services/DINavigationService.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDNavigationService.cs similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Services/DINavigationService.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDNavigationService.cs index 46914b509a..1b8eeb1511 100644 --- a/tools/DevInsights/DevHome.DevInsights/Services/DINavigationService.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDNavigationService.cs @@ -4,16 +4,16 @@ using System.Diagnostics.CodeAnalysis; using DevHome.Common.Extensions; using DevHome.Common.Services; -using DevHome.DevInsights.Contracts.ViewModels; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.Contracts.ViewModels; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Navigation; -namespace DevHome.DevInsights.Services; +namespace DevHome.DevDiagnostics.Services; // Similar to DevHome.Services.NavigationService -internal sealed class DINavigationService : INavigationService +internal sealed class DDNavigationService : INavigationService { private readonly IPageService pageService; private object? lastParameterUsed; @@ -61,7 +61,7 @@ public string DefaultPage [MemberNotNullWhen(true, nameof(Frame), nameof(frame))] public bool CanGoForward => Frame != null && Frame.CanGoForward; - public DINavigationService(IPageService pageService) + public DDNavigationService(IPageService pageService) { this.pageService = pageService; } diff --git a/tools/DevInsights/DevHome.DevInsights/Services/DIPageService.cs b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDPageService.cs similarity index 74% rename from tools/DevInsights/DevHome.DevInsights/Services/DIPageService.cs rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDPageService.cs index 52fadad775..04d4575fed 100644 --- a/tools/DevInsights/DevHome.DevInsights/Services/DIPageService.cs +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Services/DDPageService.cs @@ -6,18 +6,18 @@ using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using DevHome.Common.Services; -using DevHome.DevInsights.Pages; -using DevHome.DevInsights.ViewModels; +using DevHome.DevDiagnostics.Pages; +using DevHome.DevDiagnostics.ViewModels; using Microsoft.UI.Xaml.Controls; -namespace DevHome.DevInsights.Services; +namespace DevHome.DevDiagnostics.Services; // Similar to DevHome.Services.PageService -internal sealed class DIPageService : IPageService +internal sealed class DDPageService : IPageService { - private readonly Dictionary pages = new(); + private readonly Dictionary _pages = new(); - public DIPageService() + public DDPageService() { Configure(); Configure(); @@ -28,7 +28,7 @@ public DIPageService() Configure(); Configure(); - // Settings sub-pages. + // Settings sub-_pages. Configure(); Configure(); Configure(); @@ -38,9 +38,9 @@ public DIPageService() public Type GetPageType(string key) { Type? pageType; - lock (pages) + lock (_pages) { - if (!pages.TryGetValue(key, out pageType)) + if (!_pages.TryGetValue(key, out pageType)) { throw new ArgumentException($"Page not found: {key}. Did you forget to call PageService.Configure?"); } @@ -53,21 +53,21 @@ public void Configure() where T_VM : ObservableObject where T_V : Page { - lock (pages) + lock (_pages) { var key = typeof(T_VM).FullName!; - if (pages.ContainsKey(key)) + if (_pages.ContainsKey(key)) { throw new ArgumentException($"The key {key} is already configured in PageService"); } var type = typeof(T_V); - if (pages.Any(p => p.Value == type)) + if (_pages.Any(p => p.Value == type)) { - throw new ArgumentException($"This type is already configured with key {pages.First(p => p.Value == type).Key}"); + throw new ArgumentException($"This type is already configured with key {_pages.First(p => p.Value == type).Key}"); } - pages.Add(key, type); + _pages.Add(key, type); } } } diff --git a/tools/DevInsights/DevHome.DevInsights/Strings/en-us/Resources.resw b/tools/DevDiagnostics/DevHome.DevDiagnostics/Strings/en-us/Resources.resw similarity index 94% rename from tools/DevInsights/DevHome.DevInsights/Strings/en-us/Resources.resw rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Strings/en-us/Resources.resw index 47a0b93b14..9b3d629962 100644 --- a/tools/DevInsights/DevHome.DevInsights/Strings/en-us/Resources.resw +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Strings/en-us/Resources.resw @@ -1,1285 +1,1281 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Minimize - Tooltip for the minimize button in the BarWindow - - - Maximize - Tooltip for the maximize button in the BarWindow - - - Pin - A label for the menu item to pin a tool on the bar. - - - Unregister - The label for Unregister menu flyout for an icon in the toolbar. This will cause the program to no longer be registered with the bar. - - - Dissociate so that Dev Insights is not tracking any app - The tooltip for a button which causes Dev Insights to no longer track any app - - - Expand the large content panel - The tooltip for a button which expands the large content panel. - - - Settings - The tooltip for a button that takes the user to the settings for Dev Insights. - - - External tools: add/remove, configure and launch - The tooltip for a button that takes the user to the external tools section of Dev Insights. - - - Error - The title of an error message dialog when something goes wrong. - - - Failed to launch: {0} - {Locked="{0}"} Text for when there was an error launching an external tool. {0} is the name of an executable(.exe) file. - - - App details - The contents of a text block referring to details about an application. - - - ID - The contents of a text block referring to identity (ID) of an application. - - - Base priority - The contents of a text block referring to base CPU priority of an application. - - - Priority class - The contents of a text block referring to scheduling priority of an application. - - - Main module - This refers to the main module of an application like winword.exe or notepad.exe as an example. - - - CPU architecture - This refers to the CPU architecture of the target process and the host machine. - - - MSIX packaged - This refers to whether the application is using MSIX packaging technology. - - - Loaded modules - The contents of a text block referring to loaded application modules. - - - File Version Info - The contents of a text block referring to version of the module file loaded by an application. - - - Memory Size - The contents of a text block referring to size in memory of the module. - - - Filter... - The contents of a combo box that allows editing to filter out elements. - - - BgTaskHost - {Locked}The contents of a check box that refers to specific process names. - - - ConHost - {Locked}The contents of a check box that refers to specific process names. - - - DllHost - {Locked}The contents of a check box that refers to specific process names. - - - SvcHost - {Locked}The contents of a check box that refers to specific process names. - - - MsEdgeWebView2 - {Locked}The contents of a check box that refers to specific process names. - - - RuntimeBroker - {Locked}The contents of a check box that refers to specific process names. - - - WmiPrvSe - {Locked}The contents of a check box that refers to specific process names. - - - WudfHost - {Locked}The contents of a check box that refers to specific process names. - - - Refresh the process list - The contents of a button tool tip that will refresh the contents of the list. - - - PID - Process identifier. - - - Executable - The name of a process (winword.exe or notepad.exe for example). - - - Resource usage - The contents of a text block referring to process resource usage information. - - - Is responding - Refers to whether the application or process is responsive, or if it is stuck. - - - CPU usage - Refers to how much of the central processing unit (CPU) the process is utilizing. - - - GPU usage - Refers to how much of the graphical processing unit (GPU) the process is utilizing. - - - Memory usage - Refers to how much random access memory (RAM) the process is utilizing. - - - Disk usage - Refers to how much disk storage (hard drive/solid state drive) the process is utilizing. - - - Crash reports - The contents of a WER crash dumps. - - - Time generated - The time at which the WER report was generated. - - - Faulting executable - Refers to the process/application executable which caused the fault which generated the crash report - - - Info about the Windows Error Report - Refers to the WER diagnostic information about a process crash. - - - Windows logs - The contents of a text block referring to Windows logs. - - - Event Tracing for Windows (ETW) logs - Whether to enable Event Trace for Windows (ETW) logs in the log view output. - - - Debug output from the target app - Tooltip for whether to enable debug output (from OutputDebugString API) in the log view output. - - - Entries from the event log for the target app - Tooltip for whether to enable event viewer logs in the log view output. - - - Entries from the event log for the target app - Tooltip for whether the WER report logs are shown in the log view output. - - - Clear the list - Tooltip for a button that will clear the log list. - - - Time Generated - The time at which the log was generated. - - - Category - A header for what category the log entry belongs. - - - Tool - A header for what tool generated the log entry. - - - Message - The contents of a log entry. - - - Could not start OutputDebugString monitor since there is one already running. - An error message indicating that the resource is mutually exclusive due to an instance already running. - - - Tool Name - The name the user can assign to the tool they are adding. - - - Tool path - The name the user can assign to the tool they are adding. - - - Browse - A button to browse the filesystem. - - - Basic arguments - Refers to arguments that can be passed to a process when it is created - - - None - Refers to the type of data being shown - - - Prefix (if any) - Refers to arguments that can be passed to a process when it is created - - - OK - An affirmative value for a button - - - Cancel - Cancels the current operation the user is performing - - - Name - The name of a tool that could be edited. - - - Unregister - Text on a button for unregistering a tool. - - - Settings - The contents of a text block refering to settings. - - - Preferences - The contents of a text block refering to a user's settings preferences. - - - Theme selection - The contents of a text block refering to an application's color theme. - - - Light - Refers to a color theme or scheme - - - Dark - Refers to a color theme or scheme - - - Windows default - Refers to a color theme or scheme - - - Additional tools - Refers to tools the user has added. - - - Add a tool to the bar - Refers to tools a user could add to the bar UI. - - - Edit the configuration for registered tools - Refers to tools a user could edit that are already registered to the bar UI. - - - Monitor CPU usage for the target app - Refers tracing central processing unit (CPU) usage of the app the user has selected. - - - Show Insights on start-up - Refers showing insightful suggestions to the user about the app on startup. - - - Enable Clipboard monitoring - Refers monitoring the user's clipboard for error messages. - - - Processes to exclude when finding the foreground window. Enter the process names here, comma-separated. - Refers application process names for example notepad.exe, winword.exe etc, in a comma-separated list. - - - Save - Saves the data that the user has input. - - - About - A header for an about page. - - - App Info - The contents of a text block refering to the main window title. - - - File error - The contents of a text block refering to the main window title. - - - The Event Log lists several entries where the app has tried to open a file at 'C:\\Temp\\Scratch\\Foo.jpg'. That folder path exists, and you do have permission to access it, but the file specified does not exist in that path. However, I can see that there is a file with that name at a different folder path: 'C:\\Temp\\Foo.jpg' - perhaps this is the one you're looking for. - The contents of a text label. - - - See more - The contents of a text label. - - - Resource usage - The contents of a text label for computer resource usage (CPU/GPU/Disk/Network etc). - - - Over the last 24 hours, this app has exceeded 30% of CPU usage on 247 separate occasions. If the app is doing compute-intensive operations, this might be reasonable, but you should examine your code and your tests to ensure that this is within expected parameters. - The contents of a text label for computer resource usage (CPU/GPU/Disk/Network etc). - - - See more - The contents of a text label. - - - Hex - This refers to a short hand for hexadecimal number notation. - - - Dec - This refers to a short hand for decimal number notation. - - - Code - This refers to a short hand for an error code representation of the contents of the clipboard. - - - Is running as Admin - This refers to whether the application is running as admin - - - Is running as System - This refers to whether the application is running as System - - - Go to the key insights - The tooltip for a button that takes the user to the key insights page - - - Process list - The contents of a text block referring to Process list. - - - {0} (terminated) - {Locked="{0}"} Text indicating that the process has terminated. {0} is the process name. - - - Insights - The contents of a text block referring to Insights. - - - Help - Description of the error code - - - PID: {0} - {Locked="{0}"} Showing a process identifier. {0} is an integer - - - {0:0.0}% CPU usage - {Locked="{0:0.0}"} Showing CPU utilization. {0} is a percentage 0-100 - - - {0:N2} MB Memory used - {Locked="{0:N2}"} Showing RAM utilization. MB stands for megabytes. {0} is a number. - - - {0:N0} MB/s Disk utilization - {Locked="{0:N0}"} Showing disk utilization. MB/s stands for megabytes per second. {0} is a number. - - - cpu: n/a % - Showing CPU utilization which is not available/applicable. - - - memory: n/a MB - Showing RAM utilization which is not available/applicable. MB stands for megabytes. - - - dsk: n/a MB/s - Showing disk utilization which is not available/applicable. MB/s stands for megabytes per second. - - - {0} CPU usage: {1:0.0}% - {Locked="{0},{1:0.0}"} A notification for CPU usage. {0} is the name of a process (notepad.exe for example). {1} is a percentage - - - GOT UNHANDLED EVENT: {0} - {Locked="{0}"} An error message when an unhandled trace event is encountered. {0} is a verbose version of the event - - - Could not start EventViewer - An error message when the program is unable to start the Windows Event Viewer - - - Locked file - Describes a computer file that is locked for exclusive access - - - The app is trying to access the file '{0}', but this is locked by '{1}'. To fix this, close '{1}' - {Locked="{0}", "{1}"} A description to help a user that is dealing with a file locked for exclusive access. {0} is a file name. {1} is the name of an executable(.exe) process. - - - The app is trying to access the file '{0}', but this is locked by an unknown process - {Locked="{0}"} A description to help a user that is dealing with a file locked for exclusive access. {0} is a file name. - - - Could not start WER crash dump monitoring - Refers to being unable to start monitoring the WER error logs. - - - Preferences - Refers to a user's settings preferences. - - - Additional tools - Refers to a additional executable tools the user can add to the product - - - Advanced settings - Refers to a additional more complex settings. - - - About - Refers to additional information about the product. - - - {0:0.0}% - {Locked="{0:0.0}"} Showing CPU utilization. {0} is a percentage 0-100 - - - {0:N0} MB/s - {Locked="{0:N0}"} Showing disk utilization. MB/s stands for megabytes per second. {0} is a number. - - - {0:0.0}% - {Locked="{0:0.0}"} Showing GPU utilization. {0} is a percentage 0-100 - - - {0:N2} MB - {Locked="{0:N2}"} Showing RAM utilization. MB stands for megabytes. {0} is a number. - - - CPU usage of the attached process. - Refers to the amount of CPU a process is using, shown in the bar. - - - Process ID of the attached process. - Refers to the app's PID in the bar - - - {0:0.0}% - {Locked="{0:0.0}"} Showing Disk utilization. {0} is a percentage 0-100 - - - CPU usage of the attached process. - Refers to the amount of CPU a process is using, shown in the bottom bar. - - - Disk usage of the attached process. - Refers to the amount of disk usage a process is using, shown in the bottom bar. - - - Memory usage of the attached process. - Refers to the amount of Memory a process is using, shown in the bottom bar. - - - Process ID of the attached process. - Refers to the app's PID in the bottom bar - - - {0:N2} GB - {Locked="{0:N2}"} Showing RAM utilization. GB stands for gigabytes. {0} is a number. - - - Amount of CPU used by the overall system. - Tooltip for the system CPU usage box in the bar - - - Amount of disk utilization by the overall system. - Tooltip for the system disk usage box in the bar - - - Amount of committed memory used by the overall system. - Tooltip for the system memory usage box in the bar - - - Dev Insights - {Locked}The name of the Dev Insights application - - - Dev Insights - {Locked}The description of the Dev Insights application - - - Hotkey for Dev Insights - The description of the startup task for Dev Insights. This shows up in task manager/Windows Settings > Startup Apps. - - - Is Python - This refers to whether the application is a Python app. - - - Memory violation - Describes an issue related to a memory access violation. - - - This is a Python app that is using the ctypes foreign function library. This provides C-compatible data types, and allows calling functions in DLLs, and using raw pointers. A memory access violation can result if the code misuses pointers. - Describes an issue with a specific Python memory access violation. - - - Security issue - Describes an issue related to security. - - - Failure Bucket ID - Refers to the module which caused the fault which generated the crash report - - - Error {0}: {1} - {Locked="{0}", "{1}"} A description to help a user that is dealing with non-specific error situation. {0} is the error name. {1} is the error description. - - - Frameworks detected - This refers to the set of application frameworks this application uses. - - - Base address - The contents of a text block referring to the base address of a loaded module. - - - Entrypoint address - The contents of a text block referring to the entrypoint address of a loaded module. - - - Pinned - Text to show when the switch is turned on, to pin the tool to the bar. - - - Not pinned - Text to show when the switch is turned off, to not pin the tool to the bar. - - - Unpin - A label for the menuitem to unpin a tool on the bar. - - - Unpin - Should be the same as UnpinMenuItem.Text - - - Unregister - Same as UnregisterMenuItem.Text - - - About - Header for the Settings item for product information and privacy statement. - - - Info, Privacy Statement - Sub-header for the Settings item for product information and privacy statement. - - - Additional tools - Header for the Settings item for configuring additional tools. - - - Add or edit tool configurations - Sub-header for the Settings item for configuring additional tools. - - - Advanced settings - Header for the Settings item for configuring advanced features. - - - Configure advanced features - Sub-header for the Settings item for configuring advanced features. - - - Preferences - Header for the Settings item for user preferences. - - - Themes - Sub-header for the Settings item for user preferences. - - - Settings - The title of the main Settings page. - - - Theme - Title for the theme settings sub-page item. - - - Dark - Refers to a color theme or scheme. - - - Windows default - Refers to a color theme or scheme. - - - Light - Refers to a color theme or scheme. - - - Dev Insights - {Locked} This is the name of the product. - - - © Microsoft. All rights reserved. - This is the copyright notice for the product. - - - Related links - Header for a set of hyperlinks to information about the product. - - - Documentation - Label for the link to the documentation for the product. - - - https://go.microsoft.com/fwlink/?linkid=2275140 - Link to the documentation for the product. - - - Privacy Statement - Label for the link to the standard privacy policy statement. - - - https://go.microsoft.com/fwlink/?linkid=2234882 - Link to the standard privacy policy statement. - - - Source code - Label for the link to the source code for the product. - - - https://go.microsoft.com/fwlink/?linkid=2234396 - Link to the source code for the product. - - - Register an external tool with Dev Insights - Header for the settings item to add a tool to the product. - - - Edit or unregister existing tools - Header for the setting item to edit or unregister tools from the product. - - - The starting priority for threads created within this process - Tooltip for the Base Priority field. - - - The CPU architecture of the target process - Tooltip for the CPU Architecture field. - - - The windowing or application frameworks used in this app - Tooltip for the Framework Types field. - - - The process ID of the target process - Tooltip for the PID field. - - - True if the target process is running under an Administrator account - Tooltip for the Running as Admin field. - - - True if the target process is running as a System process, based on its Session ID - Tooltip for the Running as System field. - - - The executable used to start the process - Tooltip for the Main Module field. - - - True if this process is packaged with MSIX - Tooltip for the MSIX Packaged field. - - - Threads with different priorities in the process run relative to the priority class of the process - Tooltip for the Priority Class field. - - - Close - Text used on the Close button on a message dialog. - - - External tool {0} registered - Message shown to the user when an external tool is registered. - - - Executable - The executable path of an external tool. - - - Invalid tool path or name - Text for the message to show to the user when the supplied path or name is not valid. - - - Select a process to investigate - Describes using a button in Dev Insights' UX to investigate another process running on the system - - - Dev Insights - {Locked} The product name - - - {0} process running on {1} machine - {Locked="{0}", "{1}"} Message text when the process is the specified CPU architecture running on the specified CPU machine. {0} is the process architecture, {1} is the machine architecture. - - - Unknown - Message text when the CPU architecture of the process is unknown. - - - Unknown process type running on {0} - {Locked="{0}"}. Message text when the process is unknown CPU architecture running on the specified CPU machine. {0} is the machine architecture. - - - X64 process running on X64 machine - Message text when the process is x64 CPU architecture running on an X64 CPU machine. - - - Go to Advanced app settings - Content Dialog button text which on click opens the Advanced App settings page in Windows Settings app. - - - Go to Windows Settings > Apps > Advanced app settings > App execution alias > Dev Insights > Enable the toggle and try to launch Dev Insights as admin again. - Content Dialog content suggesting users steps to enable app execution alias from Windows Settings app - - - Enable App Execution Alias for Dev Insights and try again - Content Dialog title to enable app execution alias for Dev Insights - - - Detach from the currently targeted process - Used to describe what the DetachAppButton does - - - Detach - Menu Item that allows the user to detach from the current process - - - Dump file - Header text for the link to a WER dump - - - Activation - Header text for a group of radio buttons indicating the activation type - - - Refresh - Text for a button to refresh the list of apps - - - Icon - Column heading for the icon column in a datagrid - - - Name - Column heading for the name column in a datagrid - - - Provide the command-line or protocol arguments here. Use {pid}, {hwnd}, or {crashDumpPath} if you want Dev Insights to substitute the target app's process ID or window handle. For example: - {Locked="{pid}", "{hwnd}", "{crashDumpPath}"} Description text for a section where the user can type in the arguments to be used for the app - - - Arguments - Header text for a section describing the arguments to be used for the app - - - Launch - Text for a radio button for the launch activation option - - - Protocol - Text for a radio button for the protocol option - - - Launch example: /something /process={pid} /another={hwnd} - Example launch activation argument string - - - Protocol example: myprotocol:///args?one=ABC&two={pid}&three={hwnd} - Example protocol argument string - - - The type of activation for this tool - Describes the section where the user can specify the type of tool activation to use. - - - Get a list of installed apps - Describes a button that will get a list of installed apps. - - - Pin this tool to the toolbar, as well as adding it to the menu - Describes a toggle switch for pinning a tool to the toolbar. - - - Launch this tool by its path or package identity - Describes a radio button that specifies how to launch the selected tool. - - - Launch this tool by its registered protocol - Describes a radio button that specifies how to launch the selected tool. - - - Browse the filesystem to find a tool - Describes a button for browsing the filesystem. - - - The name you want to use for this tool in the menu and toolbar - Describes a textbox where the user can enter a name for the tool. - - - Collapse the large content panel - The tooltip for a button which collapses the large content panel. - - - Name of the attached app - Refers to the app's name in the bar - - - Clipboard Monitor - A label for the Clipboard Monitor tool - - - See insights that Dev Insights has gained - Tooltip that tells users what the Insights button will do - - - Insights - A text label for the Insights button - - - Processes - A text label for the Processes button - - - Manage Tools - Label for a button to allow users to manage external tools - - - All Files - Filter string to specify that the file dialog should include all files - - - Batch Files - Filter string to specify that the file dialog should include batch files - - - Command Files - Filter string to specify that the file dialog should include command files - - - Executables - Filter string to specify that the file dialog should include executable files - - - Management Console Files - Filter string to specify that the file dialog should include Management Console files - - - PowerShell Scripts - Filter string to specify that the file dialog should include PowerShell files - - - Local WER crash dump collection for app - Label for Windows Error reporting toggle switch - - - Toggle settings to allow capture of Windows Error Reporting dumps for offline analysis - Tooltip for Windows Error reporting toggle switch - - - More - Label for a link that navigates the user to a location to learn more about WER local dumps - - - Change - The contents of a button to allow the user to trigger elevation to change WER settings - - - Dev Insights needs to run as Admin in order to modify WER crash dump collection for an app. - Tooltip for a button that relaunches Dev Insights as admin to change WER settings - - - Get Information - The contents of a button to allow the user to trigger elevation to get more information - - - Dev Insights needs to run as Admin in order to get more data for an app. - Tooltip for a button that relaunches Dev Insights as admin to get more data - - - Dump Info - Selector Pivot that shows information about a Dump File - - - Filter Data to Target App - Label on a toggle button that controls whether presented data is filtered to the selected app - - - Controls whether data presented is for the entire system or filtered to the selected app - Tooltip for the FilterDataToTargetApp toggle - - - Activation arguments - Label for the arguments passed in when activating the target app. - - - Any arguments provided to the app when it was activated - Tooltip for the arguments passed in when activating the target app. - - - Full name - Textblock showing the full name of the MSIX package for this app. - - - Package full name - Tooltip for the full name of the MSIX package for this app. - - - Version - Textblock showing the version of the MSIX package for this app. - - - Package version - Tooltip for the version of the MSIX package for this app. - - - Display name - Textblock showing the display name of the MSIX package for this app. - - - Display name for this package - Tooltip for the display name of the MSIX package for this app. - - - Installed date - Textblock showing the installed date of the MSIX package for this app. - - - Date this package was installed - Tooltip for the installed date of the MSIX package for this app. - - - Installed path - Textblock showing the installed path of the MSIX package for this app. - - - Filesystem path where this package is installed - Tooltip for the installed path of the MSIX package for this app. - - - Publisher - Textblock showing the publisher name of the MSIX package for this app. - - - Name of the package publisher - Tooltip for the full publisher of the MSIX package for this app. - - - Development mode - Textblock showing whether the MSIX package for this app was installed in development mode. - - - Was this package sideloaded in development mode - Tooltip for whether the MSIX package for this app was installed in development mode. - - - Signature kind - Textblock showing the signature kind of the MSIX package for this app. - - - The kind of signature used to sign this package, if any - Tooltip for the signature kind of the MSIX package for this app. - - - Status - Textblock showing the status of the MSIX package for this app. - - - Deployment status of this package - Tooltip for the status of the MSIX package for this app. - - - Dependencies - Textblock showing the list of dependencies for the MSIX package for this app. - - - Additional packages this app depends on - Tooltip for the list of dependencies for the MSIX package for this app. - - - (unknown) - Text used in messages to indicate that the value of this item is unknown. - - - No issues - A message indicating that there are no issues with the given item. - - - Tool Type - Button text allowing the user to select the type of tool - - - Set the type of the tool being added. - Tooltip for the button text allowing the user to select the type of tool - - - WER crash dump analyzer - Describes type of tool used to analyze WER dumps - - - Tool that will be used to analyze WER crash dumps generated on the system - Tooltip that describes what a WER Dump analyzer does - - - Dev Insights Clipboard Monitor - Window title for the clipboard monitor tool - - - Analysis unavailable. - Message shown when there isn't crash analysis available. - - - Dump File Size: {0} bytes -Dump File creation time: {1} - {Locked="{0}", "{1}"} Created string that contains basic information about a crash dump - - - Use this tool for WER crash dump bucketing - Context menu button used to select a tool that is using to bucket WER reports - - - Use this tool for WER crash dump bucketing - Context menu button used to select a tool that is using to bucket WER reports - - - Regular Expression for WER crash dump bucket - Label for a textbox that will contain the regular expression a tool uses to determine the bucketing string of a cab. - - - Process list - Name of the button that brings up the process list page - - - Insights - Name of the button that brings up the Insights page - - - Expand or Collapse - Name of the button expands or collapses the UI. - - - Page Navigation - Name of the nav list. - - - Detach from currently targetted process - Description of the detach app button for narrator to read. - - - Run as administrator - Description of the button to run as administrator. - - - Resize navigation pane - Description of the control to change the size of the navigation pane - - - Refresh the process list - Narrator description for the button that refreshes the process list - - - Process list filter - Narrator description for the combobox that filters the process list - - - Modules - Narrator description for the Modules List ListView - - - Resize modules pane - Description of the control to change the size of the navigation pane - - - Run as administrator - Description of the button to run Dev Insights as administrator - - - Run as administrator - Description of the control button to run Dev Insights as administrator - - - Clear the list - Description of the button to clear the log output of the WinLogs page - - - Filter the list - Description of the button to filter the log output list - - - A list of all running processes. You can select an item from the list to target. You can also type a name in the search box to find that process. The drop-down contains a list of all items that are filtered out by default - you can select any of these to include them in the main list. Another way to select your target process is to bring its window to the foreground and then use the hotkey Windows+F12. - {Locked="Windows+F12"} Description of the Process list page. - - - Recent crash reports available on this machine. By default, this is filtered to your target app (if any). You can select any dump file in the list to open it in a dump analyzer tool of your choice. If you want to change your choice of dump analyzer tool, go to Windows Settings > Apps > Default apps > Set default for ".dmp" file type. - {Locked=".dmp"} Description of the Crash reports page. - - - As Dev Insights gathers context data for your target app, it can analyze the data, and in some cases it can provide insights into the nature of the problem. If Dev Insights does identify insights, they will be listed here. (Note that this is a work in progress, and initially there are very few cases where Dev Insights can provide definitive analysis.) - Description of the Insights page. - - - A list of a wide range of resource usage and sensor items for both your target app (if any), and for the system as a whole. - Description of the Resource usage page. - - - All the modules (DLLs, etc) that have been loaded by your target process. - Description of the Loaded modules page. - - - As you exercise the features of your target app, this will generate log outputs in various forms. By default, this page tracks Event Tracing for Windows (ETW) logs, the system Event log, and Windows Error Reporting (WER) logs. You can also enable Debug Output tracking, althought this can produce a large amount of output, depending on the app. Dev Insights analyzes log output and in some cases can generate insights. - Description of the Windows logs page. - - - Information about the current target app. - Description of the App details page. - - - (No insights found) - Placeholder text on the Insights page when the insights list is empty. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Minimize + Tooltip for the minimize button in the BarWindow + + + Maximize + Tooltip for the maximize button in the BarWindow + + + Pin + A label for the menu item to pin a tool on the bar. + + + Unregister + The label for Unregister menu flyout for an icon in the toolbar. This will cause the program to no longer be registered with the bar. + + + Expand the large content panel + The tooltip for a button which expands the large content panel. + + + Settings + The tooltip for a button that takes the user to the settings for Dev Diagnostics. + + + External tools: add/remove, configure and launch + The tooltip for a button that takes the user to the external tools section of Dev Diagnostics. + + + Error + The title of an error message dialog when something goes wrong. + + + Failed to launch: {0} + {Locked="{0}"} Text for when there was an error launching an external tool. {0} is the name of an executable(.exe) file. + + + App details + The contents of a text block referring to details about an application. + + + ID + The contents of a text block referring to identity (ID) of an application. + + + Base priority + The contents of a text block referring to base CPU priority of an application. + + + Priority class + The contents of a text block referring to scheduling priority of an application. + + + Main module + This refers to the main module of an application like winword.exe or notepad.exe as an example. + + + CPU architecture + This refers to the CPU architecture of the target process and the host machine. + + + MSIX packaged + This refers to whether the application is using MSIX packaging technology. + + + Loaded modules + The contents of a text block referring to loaded application modules. + + + File Version Info + The contents of a text block referring to version of the module file loaded by an application. + + + Memory Size + The contents of a text block referring to size in memory of the module. + + + Filter... + The contents of a combo box that allows editing to filter out elements. + + + BgTaskHost + {Locked}The contents of a check box that refers to specific process names. + + + ConHost + {Locked}The contents of a check box that refers to specific process names. + + + DllHost + {Locked}The contents of a check box that refers to specific process names. + + + SvcHost + {Locked}The contents of a check box that refers to specific process names. + + + MsEdgeWebView2 + {Locked}The contents of a check box that refers to specific process names. + + + RuntimeBroker + {Locked}The contents of a check box that refers to specific process names. + + + WmiPrvSe + {Locked}The contents of a check box that refers to specific process names. + + + WudfHost + {Locked}The contents of a check box that refers to specific process names. + + + Refresh the process list + The contents of a button tool tip that will refresh the contents of the list. + + + PID + Process identifier. + + + Executable + The name of a process (winword.exe or notepad.exe for example). + + + Resource usage + The contents of a text block referring to process resource usage information. + + + Is responding + Refers to whether the application or process is responsive, or if it is stuck. + + + CPU usage + Refers to how much of the central processing unit (CPU) the process is utilizing. + + + GPU usage + Refers to how much of the graphical processing unit (GPU) the process is utilizing. + + + Memory usage + Refers to how much random access memory (RAM) the process is utilizing. + + + Disk usage + Refers to how much disk storage (hard drive/solid state drive) the process is utilizing. + + + Crash reports + The contents of a WER crash dumps. + + + Time generated + The time at which the WER report was generated. + + + Faulting executable + Refers to the process/application executable which caused the fault which generated the crash report + + + Info about the Windows Error Report + Refers to the WER diagnostic information about a process crash. + + + Windows logs + The contents of a text block referring to Windows logs. + + + Event Tracing for Windows (ETW) logs + Whether to enable Event Trace for Windows (ETW) logs in the log view output. + + + Debug output from the target app + Tooltip for whether to enable debug output (from OutputDebugString API) in the log view output. + + + Entries from the event log for the target app + Tooltip for whether to enable event viewer logs in the log view output. + + + Entries from the event log for the target app + Tooltip for whether the WER report logs are shown in the log view output. + + + Clear the list + Tooltip for a button that will clear the log list. + + + Time Generated + The time at which the log was generated. + + + Category + A header for what category the log entry belongs. + + + Tool + A header for what tool generated the log entry. + + + Message + The contents of a log entry. + + + Could not start OutputDebugString monitor since there is one already running. + An error message indicating that the resource is mutually exclusive due to an instance already running. + + + Tool Name + The name the user can assign to the tool they are adding. + + + Tool path + The name the user can assign to the tool they are adding. + + + Browse + A button to browse the filesystem. + + + Basic arguments + Refers to arguments that can be passed to a process when it is created + + + None + Refers to the type of data being shown + + + Prefix (if any) + Refers to arguments that can be passed to a process when it is created + + + OK + An affirmative value for a button + + + Cancel + Cancels the current operation the user is performing + + + Name + The name of a tool that could be edited. + + + Unregister + Text on a button for unregistering a tool. + + + Settings + The contents of a text block refering to settings. + + + Preferences + The contents of a text block refering to a user's settings preferences. + + + Theme selection + The contents of a text block refering to an application's color theme. + + + Light + Refers to a color theme or scheme + + + Dark + Refers to a color theme or scheme + + + Windows default + Refers to a color theme or scheme + + + Additional tools + Refers to tools the user has added. + + + Add a tool to the bar + Refers to tools a user could add to the bar UI. + + + Edit the configuration for registered tools + Refers to tools a user could edit that are already registered to the bar UI. + + + Monitor CPU usage for the target app + Refers tracing central processing unit (CPU) usage of the app the user has selected. + + + Show Insights on start-up + Refers showing insightful suggestions to the user about the app on startup. + + + Enable Clipboard monitoring + Refers monitoring the user's clipboard for error messages. + + + Processes to exclude when finding the foreground window. Enter the process names here, comma-separated. + Refers application process names for example notepad.exe, winword.exe etc, in a comma-separated list. + + + Save + Saves the data that the user has input. + + + About + A header for an about page. + + + App Info + The contents of a text block refering to the main window title. + + + File error + The contents of a text block refering to the main window title. + + + The Event Log lists several entries where the app has tried to open a file at 'C:\\Temp\\Scratch\\Foo.jpg'. That folder path exists, and you do have permission to access it, but the file specified does not exist in that path. However, I can see that there is a file with that name at a different folder path: 'C:\\Temp\\Foo.jpg' - perhaps this is the one you're looking for. + The contents of a text label. + + + See more + The contents of a text label. + + + Resource usage + The contents of a text label for computer resource usage (CPU/GPU/Disk/Network etc). + + + Over the last 24 hours, this app has exceeded 30% of CPU usage on 247 separate occasions. If the app is doing compute-intensive operations, this might be reasonable, but you should examine your code and your tests to ensure that this is within expected parameters. + The contents of a text label for computer resource usage (CPU/GPU/Disk/Network etc). + + + See more + The contents of a text label. + + + Hex + This refers to a short hand for hexadecimal number notation. + + + Dec + This refers to a short hand for decimal number notation. + + + Code + This refers to a short hand for an error code representation of the contents of the clipboard. + + + Is running as Admin + This refers to whether the application is running as admin + + + Is running as System + This refers to whether the application is running as System + + + Go to the key insights + The tooltip for a button that takes the user to the key insights page + + + Process list + The contents of a text block referring to Process list. + + + {0} (terminated) + {Locked="{0}"} Text indicating that the process has terminated. {0} is the process name. + + + Insights + The contents of a text block referring to Insights. + + + Help + Description of the error code + + + PID: {0} + {Locked="{0}"} Showing a process identifier. {0} is an integer + + + {0:0.0}% CPU usage + {Locked="{0:0.0}"} Showing CPU utilization. {0} is a percentage 0-100 + + + {0:N2} MB Memory used + {Locked="{0:N2}"} Showing RAM utilization. MB stands for megabytes. {0} is a number. + + + {0:N0} MB/s Disk utilization + {Locked="{0:N0}"} Showing disk utilization. MB/s stands for megabytes per second. {0} is a number. + + + cpu: n/a % + Showing CPU utilization which is not available/applicable. + + + memory: n/a MB + Showing RAM utilization which is not available/applicable. MB stands for megabytes. + + + dsk: n/a MB/s + Showing disk utilization which is not available/applicable. MB/s stands for megabytes per second. + + + {0} CPU usage: {1:0.0}% + {Locked="{0},{1:0.0}"} A notification for CPU usage. {0} is the name of a process (notepad.exe for example). {1} is a percentage + + + GOT UNHANDLED EVENT: {0} + {Locked="{0}"} An error message when an unhandled trace event is encountered. {0} is a verbose version of the event + + + Could not start EventViewer + An error message when the program is unable to start the Windows Event Viewer + + + Locked file + Describes a computer file that is locked for exclusive access + + + The app is trying to access the file '{0}', but this is locked by '{1}'. To fix this, close '{1}' + {Locked="{0}", "{1}"} A description to help a user that is dealing with a file locked for exclusive access. {0} is a file name. {1} is the name of an executable(.exe) process. + + + The app is trying to access the file '{0}', but this is locked by an unknown process + {Locked="{0}"} A description to help a user that is dealing with a file locked for exclusive access. {0} is a file name. + + + Could not start WER crash dump monitoring + Refers to being unable to start monitoring the WER error logs. + + + Preferences + Refers to a user's settings preferences. + + + Additional tools + Refers to a additional executable tools the user can add to the product + + + Advanced settings + Refers to a additional more complex settings. + + + About + Refers to additional information about the product. + + + {0:0.0}% + {Locked="{0:0.0}"} Showing CPU utilization. {0} is a percentage 0-100 + + + {0:N0} MB/s + {Locked="{0:N0}"} Showing disk utilization. MB/s stands for megabytes per second. {0} is a number. + + + {0:0.0}% + {Locked="{0:0.0}"} Showing GPU utilization. {0} is a percentage 0-100 + + + {0:N2} MB + {Locked="{0:N2}"} Showing RAM utilization. MB stands for megabytes. {0} is a number. + + + CPU usage of the attached process. + Refers to the amount of CPU a process is using, shown in the bar. + + + Process ID of the attached process. + Refers to the app's PID in the bar + + + {0:0.0}% + {Locked="{0:0.0}"} Showing Disk utilization. {0} is a percentage 0-100 + + + CPU usage of the attached process. + Refers to the amount of CPU a process is using, shown in the bottom bar. + + + Disk usage of the attached process. + Refers to the amount of disk usage a process is using, shown in the bottom bar. + + + Memory usage of the attached process. + Refers to the amount of Memory a process is using, shown in the bottom bar. + + + Process ID of the attached process. + Refers to the app's PID in the bottom bar + + + {0:N2} GB + {Locked="{0:N2}"} Showing RAM utilization. GB stands for gigabytes. {0} is a number. + + + Amount of CPU used by the overall system. + Tooltip for the system CPU usage box in the bar + + + Amount of disk utilization by the overall system. + Tooltip for the system disk usage box in the bar + + + Amount of committed memory used by the overall system. + Tooltip for the system memory usage box in the bar + + + Dev Diagnostics + {Locked}The name of the Dev Diagnostics application + + + Dev Diagnostics + {Locked}The description of the Dev Diagnostics application + + + Hotkey for Dev Diagnostics + The description of the startup task for Dev Diagnostics. This shows up in task manager/Windows Settings > Startup Apps. + + + Is Python + This refers to whether the application is a Python app. + + + Memory violation + Describes an issue related to a memory access violation. + + + This is a Python app that is using the ctypes foreign function library. This provides C-compatible data types, and allows calling functions in DLLs, and using raw pointers. A memory access violation can result if the code misuses pointers. + Describes an issue with a specific Python memory access violation. + + + Security issue + Describes an issue related to security. + + + Failure Bucket ID + Refers to the module which caused the fault which generated the crash report + + + Error {0}: {1} + {Locked="{0}", "{1}"} A description to help a user that is dealing with non-specific error situation. {0} is the error name. {1} is the error description. + + + Frameworks detected + This refers to the set of application frameworks this application uses. + + + Base address + The contents of a text block referring to the base address of a loaded module. + + + Entrypoint address + The contents of a text block referring to the entrypoint address of a loaded module. + + + Pinned + Text to show when the switch is turned on, to pin the tool to the bar. + + + Not pinned + Text to show when the switch is turned off, to not pin the tool to the bar. + + + Unpin + A label for the menuitem to unpin a tool on the bar. + + + Unpin + Should be the same as UnpinMenuItem.Text + + + Unregister + Same as UnregisterMenuItem.Text + + + About + Header for the Settings item for product information and privacy statement. + + + Info, Privacy Statement + Sub-header for the Settings item for product information and privacy statement. + + + Additional tools + Header for the Settings item for configuring additional tools. + + + Add or edit tool configurations + Sub-header for the Settings item for configuring additional tools. + + + Advanced settings + Header for the Settings item for configuring advanced features. + + + Configure advanced features + Sub-header for the Settings item for configuring advanced features. + + + Preferences + Header for the Settings item for user preferences. + + + Themes + Sub-header for the Settings item for user preferences. + + + Settings + The title of the main Settings page. + + + Theme + Title for the theme settings sub-page item. + + + Dark + Refers to a color theme or scheme. + + + Windows default + Refers to a color theme or scheme. + + + Light + Refers to a color theme or scheme. + + + Dev Diagnostics + {Locked} This is the name of the product. + + + © Microsoft. All rights reserved. + This is the copyright notice for the product. + + + Related links + Header for a set of hyperlinks to information about the product. + + + Documentation + Label for the link to the documentation for the product. + + + https://go.microsoft.com/fwlink/?linkid=2275140 + Link to the documentation for the product. + + + Privacy Statement + Label for the link to the standard privacy policy statement. + + + https://go.microsoft.com/fwlink/?linkid=2234882 + Link to the standard privacy policy statement. + + + Source code + Label for the link to the source code for the product. + + + https://go.microsoft.com/fwlink/?linkid=2234396 + Link to the source code for the product. + + + Register an external tool with Dev Diagnostics + Header for the settings item to add a tool to the product. + + + Edit or unregister existing tools + Header for the setting item to edit or unregister tools from the product. + + + The starting priority for threads created within this process + Tooltip for the Base Priority field. + + + The CPU architecture of the target process + Tooltip for the CPU Architecture field. + + + The windowing or application frameworks used in this app + Tooltip for the Framework Types field. + + + The process ID of the target process + Tooltip for the PID field. + + + True if the target process is running under an Administrator account + Tooltip for the Running as Admin field. + + + True if the target process is running as a System process, based on its Session ID + Tooltip for the Running as System field. + + + The executable used to start the process + Tooltip for the Main Module field. + + + True if this process is packaged with MSIX + Tooltip for the MSIX Packaged field. + + + Threads with different priorities in the process run relative to the priority class of the process + Tooltip for the Priority Class field. + + + Close + Text used on the Close button on a message dialog. + + + External tool {0} registered + Message shown to the user when an external tool is registered. + + + Executable + The executable path of an external tool. + + + Invalid tool path or name + Text for the message to show to the user when the supplied path or name is not valid. + + + Select a process to investigate + Describes using a button in Dev Diagnostics' UX to investigate another process running on the system + + + Dev Diagnostics + {Locked} The product name + + + {0} process running on {1} machine + {Locked="{0}", "{1}"} Message text when the process is the specified CPU architecture running on the specified CPU machine. {0} is the process architecture, {1} is the machine architecture. + + + Unknown + Message text when the CPU architecture of the process is unknown. + + + Unknown process type running on {0} + {Locked="{0}"}. Message text when the process is unknown CPU architecture running on the specified CPU machine. {0} is the machine architecture. + + + X64 process running on X64 machine + Message text when the process is x64 CPU architecture running on an X64 CPU machine. + + + Go to Advanced app settings + Content Dialog button text which on click opens the Advanced App settings page in Windows Settings app. + + + Go to Windows Settings > Apps > Advanced app settings > App execution alias > Dev Diagnostics > Enable the toggle and try to launch Dev Insights as admin again. + Content Dialog content suggesting users steps to enable app execution alias from Windows Settings app + + + Enable App Execution Alias for Dev Diagnostics and try again + Content Dialog title to enable app execution alias for Dev Diagnostics + + + Detach from the currently targeted process + Used to describe what the DetachAppButton does + + + Detach + Menu Item that allows the user to detach from the current process + + + Dump file + Header text for the link to a WER dump + + + Activation + Header text for a group of radio buttons indicating the activation type + + + Refresh + Text for a button to refresh the list of apps + + + Icon + Column heading for the icon column in a datagrid + + + Name + Column heading for the name column in a datagrid + + + Provide the command-line or protocol arguments here. Use {pid}, {hwnd}, or {crashDumpPath} if you want Dev Diagnostics to substitute the target app's process ID or window handle. For example: + {Locked="{pid}", "{hwnd}", "{crashDumpPath}"} Description text for a section where the user can type in the arguments to be used for the app + + + Arguments + Header text for a section describing the arguments to be used for the app + + + Launch + Text for a radio button for the launch activation option + + + Protocol + Text for a radio button for the protocol option + + + Launch example: /something /process={pid} /another={hwnd} + Example launch activation argument string + + + Protocol example: myprotocol:///args?one=ABC&two={pid}&three={hwnd} + Example protocol argument string + + + The type of activation for this tool + Describes the section where the user can specify the type of tool activation to use. + + + Get a list of installed apps + Describes a button that will get a list of installed apps. + + + Pin this tool to the toolbar, as well as adding it to the menu + Describes a toggle switch for pinning a tool to the toolbar. + + + Launch this tool by its path or package identity + Describes a radio button that specifies how to launch the selected tool. + + + Launch this tool by its registered protocol + Describes a radio button that specifies how to launch the selected tool. + + + Browse the filesystem to find a tool + Describes a button for browsing the filesystem. + + + The name you want to use for this tool in the menu and toolbar + Describes a textbox where the user can enter a name for the tool. + + + Collapse the large content panel + The tooltip for a button which collapses the large content panel. + + + Name of the attached app + Refers to the app's name in the bar + + + Clipboard Monitor + A label for the Clipboard Monitor tool + + + See insights that Dev Diagnostics has identified + Tooltip that tells users what the Insights button will do + + + Insights + A text label for the Insights button + + + Processes + A text label for the Processes button + + + Manage Tools + Label for a button to allow users to manage external tools + + + All Files + Filter string to specify that the file dialog should include all files + + + Batch Files + Filter string to specify that the file dialog should include batch files + + + Command Files + Filter string to specify that the file dialog should include command files + + + Executables + Filter string to specify that the file dialog should include executable files + + + Management Console Files + Filter string to specify that the file dialog should include Management Console files + + + PowerShell Scripts + Filter string to specify that the file dialog should include PowerShell files + + + Local WER crash dump collection for app + Label for Windows Error reporting toggle switch + + + Toggle settings to allow capture of Windows Error Reporting dumps for offline analysis + Tooltip for Windows Error reporting toggle switch + + + More + Label for a link that navigates the user to a location to learn more about WER local dumps + + + Change + The contents of a button to allow the user to trigger elevation to change WER settings + + + Dev Diagnostics needs to run as Admin in order to modify WER crash dump collection for an app. + Tooltip for a button that relaunches Dev Diagnostics as admin to change WER settings + + + Get Information + The contents of a button to allow the user to trigger elevation to get more information + + + Dev Diagnostics needs to run as Admin in order to get more data for an app. + Tooltip for a button that relaunches Dev Diagnostics as admin to get more data + + + Dump Info + Selector Pivot that shows information about a Dump File + + + Filter Data to Target App + Label on a toggle button that controls whether presented data is filtered to the selected app + + + Controls whether data presented is for the entire system or filtered to the selected app + Tooltip for the FilterDataToTargetApp toggle + + + Activation arguments + Label for the arguments passed in when activating the target app. + + + Any arguments provided to the app when it was activated + Tooltip for the arguments passed in when activating the target app. + + + Full name + Textblock showing the full name of the MSIX package for this app. + + + Package full name + Tooltip for the full name of the MSIX package for this app. + + + Version + Textblock showing the version of the MSIX package for this app. + + + Package version + Tooltip for the version of the MSIX package for this app. + + + Display name + Textblock showing the display name of the MSIX package for this app. + + + Display name for this package + Tooltip for the display name of the MSIX package for this app. + + + Installed date + Textblock showing the installed date of the MSIX package for this app. + + + Date this package was installed + Tooltip for the installed date of the MSIX package for this app. + + + Installed path + Textblock showing the installed path of the MSIX package for this app. + + + Filesystem path where this package is installed + Tooltip for the installed path of the MSIX package for this app. + + + Publisher + Textblock showing the publisher name of the MSIX package for this app. + + + Name of the package publisher + Tooltip for the full publisher of the MSIX package for this app. + + + Development mode + Textblock showing whether the MSIX package for this app was installed in development mode. + + + Was this package sideloaded in development mode + Tooltip for whether the MSIX package for this app was installed in development mode. + + + Signature kind + Textblock showing the signature kind of the MSIX package for this app. + + + The kind of signature used to sign this package, if any + Tooltip for the signature kind of the MSIX package for this app. + + + Status + Textblock showing the status of the MSIX package for this app. + + + Deployment status of this package + Tooltip for the status of the MSIX package for this app. + + + Dependencies + Textblock showing the list of dependencies for the MSIX package for this app. + + + Additional packages this app depends on + Tooltip for the list of dependencies for the MSIX package for this app. + + + (unknown) + Text used in messages to indicate that the value of this item is unknown. + + + No issues + A message indicating that there are no issues with the given item. + + + Tool Type + Button text allowing the user to select the type of tool + + + Set the type of the tool being added. + Tooltip for the button text allowing the user to select the type of tool + + + WER crash dump analyzer + Describes type of tool used to analyze WER dumps + + + Tool that will be used to analyze WER crash dumps generated on the system + Tooltip that describes what a WER Dump analyzer does + + + Dev Diagnostics Clipboard Monitor + Window title for the clipboard monitor tool + + + Analysis unavailable. + Message shown when there isn't crash analysis available. + + + Dump File Size: {0} bytes +Dump File creation time: {1} + {Locked="{0}", "{1}"} Created string that contains basic information about a crash dump + + + Use this tool for WER crash dump bucketing + Context menu button used to select a tool that is using to bucket WER reports + + + Use this tool for WER crash dump bucketing + Context menu button used to select a tool that is using to bucket WER reports + + + Regular Expression for WER crash dump bucket + Label for a textbox that will contain the regular expression a tool uses to determine the bucketing string of a cab. + + + Process list + Name of the button that brings up the process list page + + + Insights + Name of the button that brings up the Insights page + + + Expand or Collapse + Name of the button expands or collapses the UI. + + + Page Navigation + Name of the nav list. + + + Detach from the currently targeted process + Description of the detach app button for narrator to read. + + + Run as administrator + Description of the button to run as administrator. + + + Resize navigation pane + Description of the control to change the size of the navigation pane + + + Refresh the process list + Narrator description for the button that refreshes the process list + + + Process list filter + Narrator description for the combobox that filters the process list + + + Modules + Narrator description for the Modules List ListView + + + Resize modules pane + Description of the control to change the size of the navigation pane + + + Run as administrator + Description of the button to run Dev Diagnostics as administrator + + + Run as administrator + Description of the control button to run Dev Diagnostics as administrator + + + Clear the list + Description of the button to clear the log output of the WinLogs page + + + Filter the list + Description of the button to filter the log output list + + + A list of all running processes. You can select an item from the list to target. You can also type a name in the search box to find that process. The drop-down contains a list of all items that are filtered out by default - you can select any of these to include them in the main list. Another way to select your target process is to bring its window to the foreground and then use the hotkey Windows+F12. + {Locked="Windows+F12"} Description of the Process list page. + + + Recent crash reports available on this machine. By default, this is filtered to your target app (if any). You can select any dump file in the list to open it in a dump analyzer tool of your choice. If you want to change your choice of dump analyzer tool, go to Windows Settings > Apps > Default apps > Set default for ".dmp" file type. + {Locked=".dmp"} Description of the Crash reports page. + + + As Dev Diagnostics gathers context data for your target app, it can analyze the data, and in some cases it can provide insights into the nature of the problem. If Dev Insights does identify insights, they will be listed here. (Note that this is a work in progress, and initially there are very few cases where Dev Insights can provide definitive analysis.) + Description of the Insights page. + + + A list of a wide range of resource usage and sensor items for both your target app (if any), and for the system as a whole. + Description of the Resource usage page. + + + All the modules (DLLs, etc) that have been loaded by your target process. + Description of the Loaded modules page. + + + As you exercise the features of your target app, this will generate log outputs in various forms. By default, this page tracks Event Tracing for Windows (ETW) logs, the system Event log, and Windows Error Reporting (WER) logs. You can also enable Debug Output tracking, althought this can produce a large amount of output, depending on the app. Dev Diagnostics analyzes log output and in some cases can generate insights. + Description of the Windows logs page. + + + Information about the current target app. + Description of the App details page. + + + (No insights found) + Placeholder text on the Insights page when the insights list is empty. + \ No newline at end of file diff --git a/tools/DevInsights/DevHome.DevInsights/Styles/CommandBarStyle.xaml b/tools/DevDiagnostics/DevHome.DevDiagnostics/Styles/CommandBarStyle.xaml similarity index 99% rename from tools/DevInsights/DevHome.DevInsights/Styles/CommandBarStyle.xaml rename to tools/DevDiagnostics/DevHome.DevDiagnostics/Styles/CommandBarStyle.xaml index 5287b9d987..739bbfd9d8 100644 --- a/tools/DevInsights/DevHome.DevInsights/Styles/CommandBarStyle.xaml +++ b/tools/DevDiagnostics/DevHome.DevDiagnostics/Styles/CommandBarStyle.xaml @@ -2,10 +2,10 @@ + xmlns:local="using:DevHome.DevDiagnostics.Styles"> + You can search for CHANGES HERE FOR Dev Diagnostics for the change, #767 -->