updated formatting of common.cpp

This commit is contained in:
Alekhya Kommuru 2020-01-17 14:32:02 -08:00
parent 197286c21e
commit 8132bbac2e

View File

@ -7,115 +7,87 @@
#include <sddl.h>
#include "version.h"
std::optional<RECT> get_button_pos(HWND hwnd)
{
std::optional<RECT> get_button_pos(HWND hwnd) {
RECT button;
if (DwmGetWindowAttribute(hwnd, DWMWA_CAPTION_BUTTON_BOUNDS, &button, sizeof(RECT)) == S_OK)
{
if (DwmGetWindowAttribute(hwnd, DWMWA_CAPTION_BUTTON_BOUNDS, &button, sizeof(RECT)) == S_OK) {
return button;
}
else
{
} else {
return {};
}
}
std::optional<RECT> get_window_pos(HWND hwnd)
{
std::optional<RECT> get_window_pos(HWND hwnd) {
RECT window;
if (DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &window, sizeof(window)) == S_OK)
{
if (DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, &window, sizeof(window)) == S_OK) {
return window;
}
else
{
} else {
return {};
}
}
std::optional<POINT> get_mouse_pos()
{
std::optional<POINT> get_mouse_pos() {
POINT point;
if (GetCursorPos(&point) == 0)
{
if (GetCursorPos(&point) == 0) {
return {};
}
else
{
} else {
return point;
}
}
WindowAndProcPath get_filtered_base_window_and_path(HWND window)
{
WindowAndProcPath get_filtered_base_window_and_path(HWND window) {
return hwnd_cache.get_window_and_path(window);
}
HWND get_filtered_active_window()
{
HWND get_filtered_active_window() {
return hwnd_cache.get_window(GetForegroundWindow());
}
int width(const RECT& rect)
{
int width(const RECT& rect) {
return rect.right - rect.left;
}
int height(const RECT& rect)
{
int height(const RECT& rect) {
return rect.bottom - rect.top;
}
bool operator<(const RECT& lhs, const RECT& rhs)
{
bool operator<(const RECT& lhs, const RECT& rhs) {
auto lhs_tuple = std::make_tuple(lhs.left, lhs.right, lhs.top, lhs.bottom);
auto rhs_tuple = std::make_tuple(rhs.left, rhs.right, rhs.top, rhs.bottom);
return lhs_tuple < rhs_tuple;
}
RECT keep_rect_inside_rect(const RECT& small_rect, const RECT& big_rect)
{
RECT keep_rect_inside_rect(const RECT& small_rect, const RECT& big_rect) {
RECT result = small_rect;
if ((result.right - result.left) > (big_rect.right - big_rect.left))
{
if ((result.right - result.left) > (big_rect.right - big_rect.left)) {
// small_rect is too big horizontally. resize it.
result.right = big_rect.right;
result.left = big_rect.left;
}
else
{
if (result.right > big_rect.right)
{
} else {
if (result.right > big_rect.right) {
// move the rect left.
result.left -= result.right-big_rect.right;
result.right -= result.right-big_rect.right;
}
if (result.left < big_rect.left)
{
if (result.left < big_rect.left) {
// move the rect right.
result.right += big_rect.left-result.left;
result.left += big_rect.left-result.left;
}
}
if ((result.bottom - result.top) > (big_rect.bottom - big_rect.top))
{
if ((result.bottom - result.top) > (big_rect.bottom - big_rect.top)) {
// small_rect is too big vertically. resize it.
result.bottom = big_rect.bottom;
result.top = big_rect.top;
}
else
{
if (result.bottom > big_rect.bottom)
{
} else {
if (result.bottom > big_rect.bottom) {
// move the rect up.
result.top -= result.bottom-big_rect.bottom;
result.bottom -= result.bottom-big_rect.bottom;
}
if (result.top < big_rect.top)
{
if (result.top < big_rect.top) {
// move the rect down.
result.bottom += big_rect.top-result.top;
result.top += big_rect.top-result.top;
@ -124,19 +96,16 @@ RECT keep_rect_inside_rect(const RECT& small_rect, const RECT& big_rect)
return result;
}
int run_message_loop()
{
int run_message_loop() {
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
void show_last_error_message(LPCWSTR lpszFunction, DWORD dw)
{
void show_last_error_message(LPCWSTR lpszFunction, DWORD dw) {
// Retrieve the system error message for the error code
LPWSTR lpMsgBuf = NULL;
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
@ -146,19 +115,14 @@ void show_last_error_message(LPCWSTR lpszFunction, DWORD dw)
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
lpMsgBuf,
0,
NULL) > 0)
{
0, NULL) > 0) {
// Display the error message and exit the process
LPWSTR lpDisplayBuf = (LPWSTR)LocalAlloc(LMEM_ZEROINIT, (lstrlenW(lpMsgBuf) + lstrlenW(lpszFunction) + 40) * sizeof(WCHAR));
if (lpDisplayBuf != NULL)
{
if (lpDisplayBuf != NULL) {
StringCchPrintfW(lpDisplayBuf,
LocalSize(lpDisplayBuf) / sizeof(WCHAR),
L"%s failed with error %d: %s",
lpszFunction,
dw,
lpMsgBuf);
lpszFunction, dw, lpMsgBuf);
MessageBoxW(NULL, (LPCTSTR)lpDisplayBuf, L"Error", MB_OK);
LocalFree(lpDisplayBuf);
}
@ -166,29 +130,24 @@ void show_last_error_message(LPCWSTR lpszFunction, DWORD dw)
}
}
WindowState get_window_state(HWND hwnd)
{
WindowState get_window_state(HWND hwnd) {
WINDOWPLACEMENT placement;
placement.length = sizeof(WINDOWPLACEMENT);
if (GetWindowPlacement(hwnd, &placement) == 0)
{
if (GetWindowPlacement(hwnd, &placement) == 0) {
return UNKNONW;
}
if (placement.showCmd == SW_MINIMIZE || placement.showCmd == SW_SHOWMINIMIZED || IsIconic(hwnd))
{
if (placement.showCmd == SW_MINIMIZE || placement.showCmd == SW_SHOWMINIMIZED || IsIconic(hwnd)) {
return MINIMIZED;
}
if (placement.showCmd == SW_MAXIMIZE || placement.showCmd == SW_SHOWMAXIMIZED)
{
if (placement.showCmd == SW_MAXIMIZE || placement.showCmd == SW_SHOWMAXIMIZED) {
return MAXIMIZED;
}
auto rectp = get_window_pos(hwnd);
if (!rectp)
{
if (!rectp) {
return UNKNONW;
}
@ -202,57 +161,44 @@ WindowState get_window_state(HWND hwnd)
bool top_right = monitor.rcWork.top == rect.top && monitor.rcWork.right == rect.right;
bool bottom_right = monitor.rcWork.bottom == rect.bottom && monitor.rcWork.right == rect.right;
if (top_left && bottom_left)
return SNAPED_LEFT;
if (top_left)
return SNAPED_TOP_LEFT;
if (bottom_left)
return SNAPED_BOTTOM_LEFT;
if (top_right && bottom_right)
return SNAPED_RIGHT;
if (top_right)
return SNAPED_TOP_RIGHT;
if (bottom_right)
return SNAPED_BOTTOM_RIGHT;
if (top_left && bottom_left) return SNAPED_LEFT;
if (top_left) return SNAPED_TOP_LEFT;
if (bottom_left) return SNAPED_BOTTOM_LEFT;
if (top_right && bottom_right) return SNAPED_RIGHT;
if (top_right) return SNAPED_TOP_RIGHT;
if (bottom_right) return SNAPED_BOTTOM_RIGHT;
return RESTORED;
}
bool is_process_elevated()
{
bool is_process_elevated() {
HANDLE token = nullptr;
bool elevated = false;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
{
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
TOKEN_ELEVATION elevation;
DWORD size;
if (GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &size))
{
if (GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &size)) {
elevated = (elevation.TokenIsElevated != 0);
}
}
if (token)
{
if (token) {
CloseHandle(token);
}
return elevated;
}
bool drop_elevated_privileges()
{
bool drop_elevated_privileges() {
HANDLE token = nullptr;
LPCTSTR lpszPrivilege = SE_SECURITY_NAME;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_DEFAULT | WRITE_OWNER, &token))
{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_DEFAULT | WRITE_OWNER, &token)) {
return false;
}
PSID medium_sid = NULL;
if (!::ConvertStringSidToSid(SDDL_ML_MEDIUM, &medium_sid))
{
if (!::ConvertStringSidToSid(SDDL_ML_MEDIUM, &medium_sid)) {
return false;
}
@ -268,16 +214,13 @@ bool drop_elevated_privileges()
return result;
}
std::wstring get_process_path(DWORD pid) noexcept
{
std::wstring get_process_path(DWORD pid) noexcept {
auto process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, pid);
std::wstring name;
if (process != INVALID_HANDLE_VALUE)
{
if (process != INVALID_HANDLE_VALUE) {
name.resize(MAX_PATH);
DWORD name_length = static_cast<DWORD>(name.length());
if (QueryFullProcessImageNameW(process, 0, (LPWSTR)name.data(), &name_length) == 0)
{
if (QueryFullProcessImageNameW(process, 0, (LPWSTR)name.data(), &name_length) == 0) {
name_length = 0;
}
name.resize(name_length);
@ -286,8 +229,7 @@ std::wstring get_process_path(DWORD pid) noexcept
return name;
}
bool run_elevated(const std::wstring& file, const std::wstring& params)
{
bool run_elevated(const std::wstring& file, const std::wstring& params) {
SHELLEXECUTEINFOW exec_info = { 0 };
exec_info.cbSize = sizeof(SHELLEXECUTEINFOW);
exec_info.lpVerb = L"runas";
@ -298,35 +240,28 @@ bool run_elevated(const std::wstring& file, const std::wstring& params)
exec_info.lpDirectory = 0;
exec_info.hInstApp = 0;
if (ShellExecuteExW(&exec_info))
{
if (ShellExecuteExW(&exec_info)) {
return exec_info.hProcess != nullptr;
}
else
{
} else {
return false;
}
}
bool run_non_elevated(const std::wstring& file, const std::wstring& params)
{
bool run_non_elevated(const std::wstring& file, const std::wstring& params) {
auto executable_args = file;
if (!params.empty())
{
if (!params.empty()) {
executable_args += L" " + params;
}
HWND hwnd = GetShellWindow();
if (!hwnd)
{
if (!hwnd) {
return false;
}
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
winrt::handle process{ OpenProcess(PROCESS_CREATE_PROCESS, FALSE, pid) };
if (!process)
{
if (!process) {
return false;
}
@ -336,8 +271,7 @@ bool run_non_elevated(const std::wstring& file, const std::wstring& params)
auto pproc_buffer = std::make_unique<char[]>(size);
auto pptal = reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(pproc_buffer.get());
if (!InitializeProcThreadAttributeList(pptal, 1, 0, &size))
{
if (!InitializeProcThreadAttributeList(pptal, 1, 0, &size)) {
return false;
}
@ -348,8 +282,7 @@ bool run_non_elevated(const std::wstring& file, const std::wstring& params)
&process_handle,
sizeof(process_handle),
nullptr,
nullptr))
{
nullptr)) {
return false;
}
@ -368,22 +301,18 @@ bool run_non_elevated(const std::wstring& file, const std::wstring& params)
nullptr,
&siex.StartupInfo,
&process_info);
if (process_info.hProcess)
{
if (process_info.hProcess) {
CloseHandle(process_info.hProcess);
}
if (process_info.hThread)
{
if (process_info.hThread) {
CloseHandle(process_info.hThread);
}
return succedded;
}
bool run_same_elevation(const std::wstring& file, const std::wstring& params)
{
bool run_same_elevation(const std::wstring& file, const std::wstring& params) {
auto executable_args = file;
if (!params.empty())
{
if (!params.empty()) {
executable_args += L" " + params;
}
STARTUPINFO si = { 0 };
@ -398,56 +327,46 @@ bool run_same_elevation(const std::wstring& file, const std::wstring& params)
nullptr,
&si,
&pi);
if (pi.hProcess)
{
if (pi.hProcess) {
CloseHandle(pi.hProcess);
}
if (pi.hThread)
{
if (pi.hThread) {
CloseHandle(pi.hThread);
}
return succedded;
}
std::wstring get_process_path(HWND window) noexcept
{
std::wstring get_process_path(HWND window) noexcept {
const static std::wstring app_frame_host = L"ApplicationFrameHost.exe";
DWORD pid{};
GetWindowThreadProcessId(window, &pid);
auto name = get_process_path(pid);
if (name.length() >= app_frame_host.length() &&
name.compare(name.length() - app_frame_host.length(), app_frame_host.length(), app_frame_host) == 0)
{
name.compare(name.length() - app_frame_host.length(), app_frame_host.length(), app_frame_host) == 0) {
// It is a UWP app. We will enumarate the windows and look for one created
// by something with a different PID
DWORD new_pid = pid;
EnumChildWindows(
window, [](HWND hwnd, LPARAM param) -> BOOL {
EnumChildWindows(window, [](HWND hwnd, LPARAM param) -> BOOL {
auto new_pid_ptr = reinterpret_cast<DWORD*>(param);
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
if (pid != *new_pid_ptr)
{
if (pid != *new_pid_ptr) {
*new_pid_ptr = pid;
return FALSE;
}
else
{
} else {
return TRUE;
}
},
reinterpret_cast<LPARAM>(&new_pid));
}, reinterpret_cast<LPARAM>(&new_pid));
// If we have a new pid, get the new name.
if (new_pid != pid)
{
if (new_pid != pid) {
return get_process_path(new_pid);
}
}
return name;
}
std::wstring get_product_version()
{
std::wstring get_product_version() {
static std::wstring version = std::to_wstring(VERSION_MAJOR) +
L"." + std::to_wstring(VERSION_MINOR) +
L"." + std::to_wstring(VERSION_REVISION) +
@ -456,16 +375,12 @@ std::wstring get_product_version()
return version;
}
std::wstring get_resource_string(UINT resource_id, HINSTANCE instance, const wchar_t* fallback)
{
std::wstring get_resource_string(UINT resource_id, HINSTANCE instance, const wchar_t* fallback) {
wchar_t* text_ptr;
auto length = LoadStringW(instance, resource_id, reinterpret_cast<wchar_t*>(&text_ptr), 0);
if (length == 0)
{
if (length == 0) {
return fallback;
}
else
{
} else {
return { text_ptr, static_cast<std::size_t>(length) };
}
}