diff --git a/src/settings/main.cpp b/src/settings/main.cpp index 64458d6e4b..d861c72daf 100644 --- a/src/settings/main.cpp +++ b/src/settings/main.cpp @@ -8,6 +8,8 @@ #include #include +#include "trace.h" + #pragma comment(lib, "shlwapi.lib") #pragma comment(lib, "shcore.lib") #pragma comment(lib, "windowsapp") @@ -272,6 +274,7 @@ void initialize_webview(int nShowCmd) else if (status == AsyncStatus::Error) { MessageBox(NULL, L"Failed to create the WebView control.\nPlease report the bug to https://github.com/microsoft/PowerToys/issues", L"PowerToys Settings Error", MB_OK); + Trace::SettingsInitError(Trace::SettingsInitErrorCause::WebViewInitAsyncError); exit(1); } else if (status == AsyncStatus::Started) @@ -286,6 +289,7 @@ void initialize_webview(int nShowCmd) } catch (hresult_error const& e) { + Trace::SettingsInitError(Trace::SettingsInitErrorCause::WebViewInitWinRTException); WCHAR message[1024] = L""; StringCchPrintf(message, ARRAYSIZE(message), L"failed: %ls", e.message().c_str()); MessageBox(g_main_wnd, message, L"Error", MB_OK); @@ -553,6 +557,7 @@ bool initialize_com_security_policy_for_webview() int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { + Trace::RegisterProvider(); CoInitialize(nullptr); const bool should_try_drop_privileges = !initialize_com_security_policy_for_webview() && is_process_elevated(); @@ -562,6 +567,7 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ if (!drop_elevated_privileges()) { MessageBox(NULL, L"Failed to drop admin privileges.\nPlease report the bug to https://github.com/microsoft/PowerToys/issues", L"PowerToys Settings Error", MB_OK); + Trace::SettingsInitError(Trace::SettingsInitErrorCause::FailedToDropPrivileges); exit(1); } } @@ -585,5 +591,6 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ DispatchMessage(&msg); } + Trace::UnregisterProvider(); return (int)msg.wParam; } diff --git a/src/settings/pch.h b/src/settings/pch.h index ddb5596363..517a829af8 100644 --- a/src/settings/pch.h +++ b/src/settings/pch.h @@ -15,3 +15,4 @@ #pragma pop_macro("GetCurrentTime") #include #include +#include diff --git a/src/settings/settings.vcxproj b/src/settings/settings.vcxproj index 1c1eca8fe2..bbc4ebc3a6 100644 --- a/src/settings/settings.vcxproj +++ b/src/settings/settings.vcxproj @@ -59,7 +59,7 @@ Use pch.h MultiThreadedDebug - ..;%(AdditionalIncludeDirectories) + ..;..\common\Telemetry;%(AdditionalIncludeDirectories) /Zm150 %(AdditionalOptions) @@ -88,7 +88,7 @@ Use pch.h MultiThreaded - ..;%(AdditionalIncludeDirectories) + ..;..\common\Telemetry;%(AdditionalIncludeDirectories) /Zm150 %(AdditionalOptions) @@ -113,6 +113,7 @@ + @@ -121,6 +122,7 @@ Create + diff --git a/src/settings/settings.vcxproj.filters b/src/settings/settings.vcxproj.filters index 586b68ec57..40f02e0184 100644 --- a/src/settings/settings.vcxproj.filters +++ b/src/settings/settings.vcxproj.filters @@ -24,6 +24,9 @@ Header Files + + Header Files + @@ -35,6 +38,9 @@ Source Files + + Source Files + diff --git a/src/settings/trace.cpp b/src/settings/trace.cpp new file mode 100644 index 0000000000..1a29620665 --- /dev/null +++ b/src/settings/trace.cpp @@ -0,0 +1,45 @@ +#include "pch.h" +#include "trace.h" + +TRACELOGGING_DEFINE_PROVIDER( + g_hProvider, + "Microsoft.PowerToys", + // {38e8889b-9731-53f5-e901-e8a7c1753074} + (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), + TraceLoggingOptionProjectTelemetry()); + +const char* settingsInitErrorCauseAsString(Trace::SettingsInitErrorCause error_case) +{ + switch (error_case) + { + case Trace::SettingsInitErrorCause::WebViewInitAsyncError: + return "WebViewInitAsyncError"; + case Trace::SettingsInitErrorCause::WebViewInitWinRTException: + return "WebViewInitWinRTException"; + case Trace::SettingsInitErrorCause::FailedToDropPrivileges: + return "FailedToDropPrivileges"; + default: + return "UnknownError"; + }; +} + +void Trace::SettingsInitError(const Trace::SettingsInitErrorCause error_cause) +{ + TraceLoggingWrite( + g_hProvider, + "PowerToysSettings_SettingsInitError", + TraceLoggingString(settingsInitErrorCauseAsString(error_cause), "Cause"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::RegisterProvider() noexcept +{ + TraceLoggingRegister(g_hProvider); +} + +void Trace::UnregisterProvider() noexcept +{ + TraceLoggingUnregister(g_hProvider); +} diff --git a/src/settings/trace.h b/src/settings/trace.h new file mode 100644 index 0000000000..366b3fbda8 --- /dev/null +++ b/src/settings/trace.h @@ -0,0 +1,17 @@ +#pragma once + +class Trace +{ +public: + enum class SettingsInitErrorCause : int32_t + { + WebViewInitAsyncError, + WebViewInitWinRTException, + FailedToDropPrivileges, + }; + + static void SettingsInitError(const SettingsInitErrorCause error_cause); + + static void RegisterProvider() noexcept; + static void UnregisterProvider() noexcept; +};