1
0
mirror of https://github.com/valinet/ExplorerPatcher.git synced 2024-11-13 18:50:46 +01:00

Restoring default settings only asks for elevation if required

This commit is contained in:
Valentin Radu 2021-12-24 15:43:53 +02:00
parent 98fb6c4ea5
commit 1971ba88d8
3 changed files with 157 additions and 19 deletions

View File

@ -46,6 +46,7 @@ Tested on OS build 22000.376.
* The clock flyouts now display correctly when using this taskbar
* Fixed a bug that displayed wrong window previews when the combine taskbar buttons option was set to never combine (#564) (.17)
* Possibility to set position on screen (top/bottom) from the Properties UI
* Restoring default settings only asks for elevation if required (for the moment, only if you have registered the application as shell extension) (.18)
#### Simple Window Switcher

View File

@ -8,6 +8,36 @@ static void(*RefreshImmersiveColorPolicyState)() = NULL;
static BOOL(*ShouldAppsUseDarkMode)() = NULL;
DWORD dwTaskbarPosition = 3;
BOOL gui_bOldTaskbar = TRUE;
NTSTATUS NTAPI hookRtlQueryElevationFlags(DWORD* pFlags)
{
*pFlags = 0;
return 0;
}
PVOID pvRtlQueryElevationFlags;
LONG NTAPI OnVex(PEXCEPTION_POINTERS ExceptionInfo)
{
if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP &&
ExceptionInfo->ExceptionRecord->ExceptionAddress == pvRtlQueryElevationFlags)
{
ExceptionInfo->ContextRecord->
#if defined(_X86_)
Eip
#elif defined (_AMD64_)
Rip
#else
#error not implemented
#endif
= (ULONG_PTR)hookRtlQueryElevationFlags;
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
BOOL IsHighContrast()
{
HIGHCONTRASTW highContrast;
@ -1006,10 +1036,40 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
);
if (hFile)
{
void* buffer = NULL;
HKEY hKey = NULL;
RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
L"Software\\Classes\\CLSID\\" _T(EP_CLSID) L"\\InprocServer32",
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WOW64_64KEY,
&hKey
);
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
buffer = malloc(cbRscr);
if (buffer)
{
memcpy(buffer, pRscr, cbRscr);
char* p1 = strstr(buffer, "[-HKEY_LOCAL_MACHINE\\Software\\Classes\\CLSID\\" EP_CLSID "\\InprocServer32]");
if (p1) p1[0] = ';';
char* p2 = strstr(buffer, ";d Register as shell extension");
if (p2) memcpy(p2, ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", 70);
}
else
{
RegCloseKey(hKey);
hKey = NULL;
}
}
if (!buffer)
{
buffer = pRscr;
}
DWORD dwNumberOfBytesWritten = 0;
if (WriteFile(
hFile,
pRscr,
buffer,
cbRscr,
&dwNumberOfBytesWritten,
NULL
@ -1017,25 +1077,102 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
{
CloseHandle(hFile);
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = wszPath;
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
DWORD dwError = 1;
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
dwError = 0;
// https://stackoverflow.com/questions/50298722/win32-launching-a-highestavailable-child-process-as-a-normal-user-process
if (pvRtlQueryElevationFlags = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlQueryElevationFlags"))
{
PVOID pv;
if (pv = AddVectoredExceptionHandler(TRUE, OnVex))
{
CONTEXT ctx;
ZeroMemory(&ctx, sizeof(CONTEXT));
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
ctx.Dr7 = 0x404;
ctx.Dr1 = (ULONG_PTR)pvRtlQueryElevationFlags;
if (SetThreadContext(GetCurrentThread(), &ctx))
{
WCHAR wszExec[MAX_PATH * 2];
ZeroMemory(wszExec, MAX_PATH * 2 * sizeof(WCHAR));
wszExec[0] = L'"';
GetWindowsDirectoryW(wszExec + 1, MAX_PATH);
wcscat_s(wszExec, MAX_PATH * 2, L"\\regedit.exe\" \"");
wcscat_s(wszExec, MAX_PATH * 2, wszPath);
wcscat_s(wszExec, MAX_PATH * 2, L"\"");
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
wprintf(L"%s\n", wszExec);
if (CreateProcessW(NULL, wszExec, 0, 0, 0, 0, 0, 0, &si, &pi))
{
CloseHandle(pi.hThread);
//CloseHandle(pi.hProcess);
}
else
{
dwError = GetLastError();
}
ctx.Dr7 = 0x400;
ctx.Dr1 = 0;
SetThreadContext(GetCurrentThread(), &ctx);
if (pi.hProcess)
{
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
}
}
else
{
dwError = GetLastError();
}
RemoveVectoredExceptionHandler(pv);
}
else
{
dwError = GetLastError();
}
}
else
{
dwError = GetLastError();
}
}
if (dwError)
{
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = wszPath;
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteExW(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
CloseHandle(ShExecInfo.hProcess);
}
_this->tabOrder = 0;
InvalidateRect(hwnd, NULL, FALSE);
CloseHandle(ShExecInfo.hProcess);
DeleteFileW(wszPath);
}
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
RegCloseKey(hKey);
free(buffer);
}
}
}
else if (!strncmp(line + 1, "about", 5))

View File

@ -1,7 +1,7 @@
#define VER_MAJOR 22000
#define VER_MINOR 376
#define VER_BUILD_HI 40
#define VER_BUILD_LO 17
#define VER_BUILD_LO 18
#define VER_FLAGS VS_FF_PRERELEASE
@ -12,5 +12,5 @@
#define VER_STR(arg) #arg
// The String form of the version numbers
#define VER_FILE_STRING VALUE "FileVersion", "22000.376.40.17"
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.376.40.17"
#define VER_FILE_STRING VALUE "FileVersion", "22000.376.40.18"
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.376.40.18"