mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-19 01:04:08 +01:00
Restoring default settings only asks for elevation if required
This commit is contained in:
parent
98fb6c4ea5
commit
1971ba88d8
@ -46,6 +46,7 @@ Tested on OS build 22000.376.
|
|||||||
* The clock flyouts now display correctly when using this taskbar
|
* 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)
|
* 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
|
* 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
|
#### Simple Window Switcher
|
||||||
|
@ -8,6 +8,36 @@ static void(*RefreshImmersiveColorPolicyState)() = NULL;
|
|||||||
static BOOL(*ShouldAppsUseDarkMode)() = NULL;
|
static BOOL(*ShouldAppsUseDarkMode)() = NULL;
|
||||||
DWORD dwTaskbarPosition = 3;
|
DWORD dwTaskbarPosition = 3;
|
||||||
BOOL gui_bOldTaskbar = TRUE;
|
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()
|
BOOL IsHighContrast()
|
||||||
{
|
{
|
||||||
HIGHCONTRASTW highContrast;
|
HIGHCONTRASTW highContrast;
|
||||||
@ -1006,10 +1036,40 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
);
|
);
|
||||||
if (hFile)
|
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;
|
DWORD dwNumberOfBytesWritten = 0;
|
||||||
if (WriteFile(
|
if (WriteFile(
|
||||||
hFile,
|
hFile,
|
||||||
pRscr,
|
buffer,
|
||||||
cbRscr,
|
cbRscr,
|
||||||
&dwNumberOfBytesWritten,
|
&dwNumberOfBytesWritten,
|
||||||
NULL
|
NULL
|
||||||
@ -1017,25 +1077,102 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
{
|
{
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
|
|
||||||
SHELLEXECUTEINFO ShExecInfo = { 0 };
|
DWORD dwError = 1;
|
||||||
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||||
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
|
{
|
||||||
ShExecInfo.hwnd = NULL;
|
dwError = 0;
|
||||||
ShExecInfo.lpVerb = NULL;
|
// https://stackoverflow.com/questions/50298722/win32-launching-a-highestavailable-child-process-as-a-normal-user-process
|
||||||
ShExecInfo.lpFile = wszPath;
|
if (pvRtlQueryElevationFlags = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlQueryElevationFlags"))
|
||||||
ShExecInfo.lpParameters = L"";
|
{
|
||||||
ShExecInfo.lpDirectory = NULL;
|
PVOID pv;
|
||||||
ShExecInfo.nShow = SW_SHOW;
|
if (pv = AddVectoredExceptionHandler(TRUE, OnVex))
|
||||||
ShExecInfo.hInstApp = NULL;
|
{
|
||||||
ShellExecuteEx(&ShExecInfo);
|
CONTEXT ctx;
|
||||||
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
|
ZeroMemory(&ctx, sizeof(CONTEXT));
|
||||||
DWORD dwExitCode = 0;
|
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
|
||||||
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
|
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;
|
_this->tabOrder = 0;
|
||||||
InvalidateRect(hwnd, NULL, FALSE);
|
InvalidateRect(hwnd, NULL, FALSE);
|
||||||
CloseHandle(ShExecInfo.hProcess);
|
|
||||||
DeleteFileW(wszPath);
|
DeleteFileW(wszPath);
|
||||||
}
|
}
|
||||||
|
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strncmp(line + 1, "about", 5))
|
else if (!strncmp(line + 1, "about", 5))
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#define VER_MAJOR 22000
|
#define VER_MAJOR 22000
|
||||||
#define VER_MINOR 376
|
#define VER_MINOR 376
|
||||||
#define VER_BUILD_HI 40
|
#define VER_BUILD_HI 40
|
||||||
#define VER_BUILD_LO 17
|
#define VER_BUILD_LO 18
|
||||||
#define VER_FLAGS VS_FF_PRERELEASE
|
#define VER_FLAGS VS_FF_PRERELEASE
|
||||||
|
|
||||||
|
|
||||||
@ -12,5 +12,5 @@
|
|||||||
#define VER_STR(arg) #arg
|
#define VER_STR(arg) #arg
|
||||||
|
|
||||||
// The String form of the version numbers
|
// The String form of the version numbers
|
||||||
#define VER_FILE_STRING VALUE "FileVersion", "22000.376.40.17"
|
#define VER_FILE_STRING VALUE "FileVersion", "22000.376.40.18"
|
||||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.376.40.17"
|
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.376.40.18"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user