Skip to content

Commit

Permalink
bootstrapper: handle the unhandled
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyoyuppe committed Sep 9, 2020
1 parent 305a04c commit c2d6f74
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 15 deletions.
47 changes: 40 additions & 7 deletions installer/PowerToysBootstrapper/bootstrapper/bootstrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ std::unordered_set<CmdArgs> parseCmdArgs(const int nCmdArgs, LPWSTR* argList)
}
return result;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

int bootstrapper()
{
using namespace localized_strings;
winrt::init_apartment();
Expand Down Expand Up @@ -215,7 +216,7 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
break;
}
progressParams.progress = min(0.99f, progressParams.progress + 0.001f);
progressParams.progress = std::min(0.99f, progressParams.progress + 0.001f);
notifications::update_progress_bar_toast(TOAST_TAG, progressParams);
}
} }.detach();
Expand Down Expand Up @@ -257,12 +258,20 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
updateProgressBar(.5f, INSTALLING_DOTNET);
}
if (installDotnet &&
!updating::dotnet_is_installed() &&
!updating::install_dotnet(cmdArgs.contains(CmdArgs::silent)) &&
!cmdArgs.contains(CmdArgs::silent))

try
{
if (installDotnet &&
!updating::dotnet_is_installed() &&
!updating::install_dotnet(cmdArgs.contains(CmdArgs::silent)) &&
!cmdArgs.contains(CmdArgs::silent))
{
notifications::show_toast(DOTNET_INSTALL_ERROR, TOAST_TITLE);
}
}
catch (...)
{
notifications::show_toast(DOTNET_INSTALL_ERROR, TOAST_TITLE);
MessageBoxW(nullptr, L".NET Core installation", L"Unknown exception encountered!", MB_OK | MB_ICONERROR);
}

updateProgressBar(.75f, INSTALLING_NEW_VERSION);
Expand Down Expand Up @@ -294,3 +303,27 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
return bootstrapper();
}
catch (const std::exception& ex)
{
MessageBoxA(nullptr, ex.what(), "Unhandled stdexception encountered!", MB_OK | MB_ICONERROR);
}
catch (winrt::hresult_error const& ex)
{
winrt::hstring message = ex.message();
MessageBoxW(nullptr, message.c_str(), L"Unhandled winrt exception encountered!", MB_OK | MB_ICONERROR);
}
catch (...)
{
auto lastErrorMessage = get_last_error_message(GetLastError());
std::wstring message = lastErrorMessage ? std::move(*lastErrorMessage) : L"";
MessageBoxW(nullptr, message.c_str(), L"Unknown exception encountered!", MB_OK | MB_ICONERROR);
}
return 0;
}
1 change: 1 addition & 0 deletions installer/PowerToysBootstrapper/bootstrapper/pch.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <shellapi.h>
Expand Down
9 changes: 7 additions & 2 deletions src/common/notifications.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,13 @@ void notifications::show_toast_with_activations(std::wstring message,
}
}
}

notifier.Show(notification);
try
{
notifier.Show(notification);
}
catch (...)
{
}
}

void notifications::update_progress_bar_toast(std::wstring_view tag, progress_bar_params params)
Expand Down
18 changes: 12 additions & 6 deletions src/common/processApi.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,21 @@ inline std::vector<wil::unique_process_handle> getProcessHandlesByName(const std
handleAccess |= PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ;
for (const DWORD processId : processIds)
{
wil::unique_process_handle hProcess{ OpenProcess(handleAccess, FALSE, processId) };
wchar_t name[MAX_PATH + 1];
if (!hProcess || !GetProcessImageFileNameW(hProcess.get(), name, MAX_PATH))
try
{
continue;
wil::unique_process_handle hProcess{ OpenProcess(handleAccess, FALSE, processId) };
wchar_t name[MAX_PATH + 1];
if (!hProcess || !GetProcessImageFileNameW(hProcess.get(), name, MAX_PATH))
{
continue;
}
if (processName == PathFindFileNameW(name))
{
result.push_back(std::move(hProcess));
}
}
if (processName == PathFindFileNameW(name))
catch (...)
{
result.push_back(std::move(hProcess));
}
}
return result;
Expand Down

0 comments on commit c2d6f74

Please sign in to comment.