mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-31 03:53:44 +01:00
Import/export functionality for program settings
This commit is contained in:
parent
8119c5aa7c
commit
8d74ffbedb
@ -15,6 +15,7 @@ Tested on OS build 22000.434.
|
|||||||
* Simple Window Switcher can switch applications instead of windows (#665) (.5, .6)
|
* Simple Window Switcher can switch applications instead of windows (#665) (.5, .6)
|
||||||
* Option to disable rounded corners for windows (.7)
|
* Option to disable rounded corners for windows (.7)
|
||||||
* Ability to hide the "Properties" item from the taskbar context menu (.9)
|
* Ability to hide the "Properties" item from the taskbar context menu (.9)
|
||||||
|
* Import/export functionality for program settings (.11)
|
||||||
|
|
||||||
#### Feature enhancements
|
#### Feature enhancements
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ DEFINE_GUID(LiveSetting_Property_GUID, 0xc12bcd8e, 0x2a8e, 0x4950, 0x8a, 0xe7, 0
|
|||||||
#include <oleacc.h>
|
#include <oleacc.h>
|
||||||
#include "GUI.h"
|
#include "GUI.h"
|
||||||
|
|
||||||
|
TCHAR GUI_title[260];
|
||||||
|
FILE* AuditFile = NULL;
|
||||||
LANGID locale;
|
LANGID locale;
|
||||||
void* GUI_FileMapping = NULL;
|
void* GUI_FileMapping = NULL;
|
||||||
DWORD GUI_FileSize = 0;
|
DWORD GUI_FileSize = 0;
|
||||||
@ -109,7 +111,7 @@ BOOL IsColorSchemeChangeMessage(LPARAM lParam)
|
|||||||
return is;
|
return is;
|
||||||
}
|
}
|
||||||
|
|
||||||
LSTATUS GUI_RegSetValueExW(
|
LSTATUS GUI_Internal_RegSetValueExW(
|
||||||
HKEY hKey,
|
HKEY hKey,
|
||||||
LPCWSTR lpValueName,
|
LPCWSTR lpValueName,
|
||||||
DWORD Reserved,
|
DWORD Reserved,
|
||||||
@ -302,6 +304,12 @@ LSTATUS GUI_RegSetValueExW(
|
|||||||
}
|
}
|
||||||
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_PeopleBand"))
|
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_PeopleBand"))
|
||||||
{
|
{
|
||||||
|
DWORD dwData = 0, dwSize = sizeof(DWORD);
|
||||||
|
RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\People", L"PeopleBand", RRF_RT_DWORD, NULL, &dwData, &dwSize);
|
||||||
|
if ((dwData && *(DWORD*)lpData) || (!dwData && !*(DWORD*)lpData))
|
||||||
|
{
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 435, 0);
|
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 435, 0);
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -309,7 +317,7 @@ LSTATUS GUI_RegSetValueExW(
|
|||||||
{
|
{
|
||||||
RegSetKeyValueW(
|
RegSetKeyValueW(
|
||||||
HKEY_CURRENT_USER,
|
HKEY_CURRENT_USER,
|
||||||
TEXT(REGPATH),
|
TEXT(REGPATH_OLD),
|
||||||
L"Start_MaximumFrequentApps",
|
L"Start_MaximumFrequentApps",
|
||||||
dwType,
|
dwType,
|
||||||
lpData,
|
lpData,
|
||||||
@ -392,6 +400,10 @@ LSTATUS GUI_RegSetValueExW(
|
|||||||
bAreRoundedCornersDisabled = FALSE;
|
bAreRoundedCornersDisabled = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((bAreRoundedCornersDisabled && *(DWORD*)lpData) || (!bAreRoundedCornersDisabled && !*(DWORD*)lpData))
|
||||||
|
{
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
SHELLEXECUTEINFO ShExecInfo = { 0 };
|
SHELLEXECUTEINFO ShExecInfo = { 0 };
|
||||||
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
||||||
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
|
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
|
||||||
@ -411,9 +423,96 @@ LSTATUS GUI_RegSetValueExW(
|
|||||||
}
|
}
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_RegisterAsShellExtension"))
|
||||||
|
{
|
||||||
|
HKEY hKey2 = NULL;
|
||||||
|
RegOpenKeyExW(
|
||||||
|
HKEY_LOCAL_MACHINE,
|
||||||
|
L"Software\\Classes\\CLSID\\" _T(EP_CLSID) L"\\InprocServer32",
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_READ | KEY_WOW64_64KEY,
|
||||||
|
&hKey2
|
||||||
|
);
|
||||||
|
WCHAR wszArgs[MAX_PATH];
|
||||||
|
if (((hKey2 == NULL || hKey2 == INVALID_HANDLE_VALUE) && !*(DWORD*)lpData) || !(hKey2 == NULL || hKey2 == INVALID_HANDLE_VALUE) && (*(DWORD*)lpData))
|
||||||
|
{
|
||||||
|
RegCloseKey(hKey2);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
if (!(hKey2 == NULL || hKey2 == INVALID_HANDLE_VALUE))
|
||||||
|
{
|
||||||
|
RegCloseKey(hKey2);
|
||||||
|
}
|
||||||
|
if (*(DWORD*)lpData)
|
||||||
|
{
|
||||||
|
wszArgs[0] = L'\"';
|
||||||
|
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszArgs + 1);
|
||||||
|
wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(PRODUCT_NAME) L".amd64.dll\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wszArgs[0] = L'/';
|
||||||
|
wszArgs[1] = L'u';
|
||||||
|
wszArgs[2] = L' ';
|
||||||
|
wszArgs[3] = L'"';
|
||||||
|
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszArgs + 4);
|
||||||
|
wcscat_s(wszArgs, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(PRODUCT_NAME) L".amd64.dll\"");
|
||||||
|
}
|
||||||
|
wprintf(L"%s\n", wszArgs);
|
||||||
|
WCHAR wszApp[MAX_PATH * 2];
|
||||||
|
GetSystemDirectoryW(wszApp, MAX_PATH * 2);
|
||||||
|
wcscat_s(wszApp, MAX_PATH * 2, L"\\regsvr32.exe");
|
||||||
|
wprintf(L"%s\n", wszApp);
|
||||||
|
SHELLEXECUTEINFOW sei;
|
||||||
|
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFOW));
|
||||||
|
sei.cbSize = sizeof(sei);
|
||||||
|
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
|
||||||
|
sei.hwnd = NULL;
|
||||||
|
sei.hInstApp = NULL;
|
||||||
|
sei.lpVerb = L"runas";
|
||||||
|
sei.lpFile = wszApp;
|
||||||
|
sei.lpParameters = wszArgs;
|
||||||
|
sei.hwnd = NULL;
|
||||||
|
sei.nShow = SW_NORMAL;
|
||||||
|
if (ShellExecuteExW(&sei) && sei.hProcess)
|
||||||
|
{
|
||||||
|
WaitForSingleObject(sei.hProcess, INFINITE);
|
||||||
|
DWORD dwExitCode = 0;
|
||||||
|
if (GetExitCodeProcess(sei.hProcess, &dwExitCode) && !dwExitCode)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
CloseHandle(sei.hProcess);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD dwError = GetLastError();
|
||||||
|
if (dwError == ERROR_CANCELLED)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LSTATUS GUI_RegQueryValueExW(
|
LSTATUS GUI_RegSetValueExW(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCWSTR lpValueName,
|
||||||
|
DWORD Reserved,
|
||||||
|
DWORD dwType,
|
||||||
|
const BYTE* lpData,
|
||||||
|
DWORD cbData
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LSTATUS lRes = GUI_Internal_RegSetValueExW(hKey, lpValueName, Reserved, dwType, lpData, cbData);
|
||||||
|
return lRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS GUI_Internal_RegQueryValueExW(
|
||||||
HKEY hKey,
|
HKEY hKey,
|
||||||
LPCWSTR lpValueName,
|
LPCWSTR lpValueName,
|
||||||
LPDWORD lpReserved,
|
LPDWORD lpReserved,
|
||||||
@ -505,7 +604,7 @@ LSTATUS GUI_RegQueryValueExW(
|
|||||||
}
|
}
|
||||||
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_PeopleBand"))
|
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_PeopleBand"))
|
||||||
{
|
{
|
||||||
return RegQueryValueExW(hKey, L"PeopleBand", lpReserved, lpType, lpData, lpcbData);
|
return RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\People", L"PeopleBand", RRF_RT_DWORD, NULL, lpData, lpcbData);
|
||||||
}
|
}
|
||||||
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_Start_MaximumFrequentApps"))
|
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_Start_MaximumFrequentApps"))
|
||||||
{
|
{
|
||||||
@ -539,8 +638,94 @@ LSTATUS GUI_RegQueryValueExW(
|
|||||||
}
|
}
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
else if (!wcscmp(lpValueName, L"Virtualized_" _T(EP_CLSID) L"_RegisterAsShellExtension"))
|
||||||
|
{
|
||||||
|
HKEY hKey2 = NULL;
|
||||||
|
RegOpenKeyExW(
|
||||||
|
HKEY_LOCAL_MACHINE,
|
||||||
|
L"Software\\Classes\\CLSID\\" _T(EP_CLSID) L"\\InprocServer32",
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_READ | KEY_WOW64_64KEY,
|
||||||
|
&hKey2
|
||||||
|
);
|
||||||
|
if (hKey2 == NULL || hKey2 == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
*(DWORD*)lpData = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*(DWORD*)lpData = 1;
|
||||||
|
RegCloseKey(hKey2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LSTATUS GUI_RegCreateKeyExW(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCWSTR lpSubKey,
|
||||||
|
DWORD Reserved,
|
||||||
|
LPWSTR lpClass,
|
||||||
|
DWORD dwOptions,
|
||||||
|
REGSAM samDesired,
|
||||||
|
const LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||||
|
PHKEY phkResult,
|
||||||
|
LPDWORD lpdwDisposition
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LSTATUS lRes = RegCreateKeyExW(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
|
||||||
|
if (AuditFile)
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"[%s\\%s]\n", hKey == HKEY_CURRENT_USER ? L"HKEY_CURRENT_USER" : L"HKEY_LOCAL_MACHINE", lpSubKey);
|
||||||
|
}
|
||||||
|
return lRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS GUI_RegOpenKeyExW(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCWSTR lpSubKey,
|
||||||
|
DWORD ulOptions,
|
||||||
|
REGSAM samDesired,
|
||||||
|
PHKEY phkResult
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LSTATUS lRes = RegOpenKeyExW(hKey, lpSubKey, ulOptions, samDesired, phkResult);
|
||||||
|
if (AuditFile)
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"[%s%s\\%s]\n", (*phkResult == NULL || *phkResult == INVALID_HANDLE_VALUE) ? L"-" : L"", hKey == HKEY_CURRENT_USER ? L"HKEY_CURRENT_USER" : L"HKEY_LOCAL_MACHINE", lpSubKey);
|
||||||
|
WCHAR wszDefVal[MAX_PATH];
|
||||||
|
ZeroMemory(wszDefVal, MAX_PATH);
|
||||||
|
DWORD dwLen = MAX_PATH;
|
||||||
|
RegGetValueW(hKey, lpSubKey, NULL, RRF_RT_REG_SZ, NULL, wszDefVal, &dwLen);
|
||||||
|
if (wszDefVal[0])
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"@=\"%s\"\n", wszDefVal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"@=\"\"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSTATUS GUI_RegQueryValueExW(
|
||||||
|
HKEY hKey,
|
||||||
|
LPCWSTR lpValueName,
|
||||||
|
LPDWORD lpReserved,
|
||||||
|
LPDWORD lpType,
|
||||||
|
LPBYTE lpData,
|
||||||
|
LPDWORD lpcbData
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LSTATUS lRes = GUI_Internal_RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
|
||||||
|
if (AuditFile)
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"%s\"%s\"=dword:%08x\n", (lpValueName && wcsncmp(lpValueName, L"Virtualized_" _T(EP_CLSID), 50)) ? L"" : L";", lpValueName, *(DWORD*)lpData);
|
||||||
|
}
|
||||||
|
return lRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static HRESULT GUI_AboutProc(
|
static HRESULT GUI_AboutProc(
|
||||||
HWND hwnd,
|
HWND hwnd,
|
||||||
UINT uNotification,
|
UINT uNotification,
|
||||||
@ -785,7 +970,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
}
|
}
|
||||||
if (strcmp(line, "Windows Registry Editor Version 5.00\r\n") &&
|
if (strcmp(line, "Windows Registry Editor Version 5.00\r\n") &&
|
||||||
strcmp(line, "\r\n") &&
|
strcmp(line, "\r\n") &&
|
||||||
(currentSection == -1 || currentSection == _this->section || !strncmp(line, ";T ", 3) || !strncmp(line, ";f", 2)) &&
|
(currentSection == -1 || currentSection == _this->section || !strncmp(line, ";T ", 3) || !strncmp(line, ";f", 2) || AuditFile) &&
|
||||||
!(!IsThemeActive() && !strncmp(line, ";M ", 3))
|
!(!IsThemeActive() && !strncmp(line, ";M ", 3))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -1275,27 +1460,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
KEY_READ | KEY_WOW64_64KEY,
|
KEY_READ | KEY_WOW64_64KEY,
|
||||||
&hKey
|
&hKey
|
||||||
);
|
);
|
||||||
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
|
buffer = pRscr;
|
||||||
{
|
|
||||||
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,
|
||||||
@ -1306,161 +1471,132 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
))
|
))
|
||||||
{
|
{
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
|
DWORD dwOldTaskbarOld = 0, dwOldTaskbar = 0, dwSize = sizeof(DWORD);
|
||||||
|
RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", RRF_RT_DWORD, NULL, &dwOldTaskbarOld, &dwSize);
|
||||||
|
RegSetKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", REG_DWORD, &dwOldTaskbar, sizeof(DWORD));
|
||||||
|
|
||||||
BOOL bAreRoundedCornersDisabled = FALSE;
|
DWORD dwError = 0;
|
||||||
HANDLE h_exists = CreateEventW(NULL, FALSE, FALSE, L"Global\\ep_dwm_" _T(EP_CLSID));
|
// https://stackoverflow.com/questions/50298722/win32-launching-a-highestavailable-child-process-as-a-normal-user-process
|
||||||
if (h_exists)
|
if (pvRtlQueryElevationFlags = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlQueryElevationFlags"))
|
||||||
{
|
{
|
||||||
if (GetLastError() == ERROR_ALREADY_EXISTS)
|
PVOID pv;
|
||||||
|
if (pv = AddVectoredExceptionHandler(TRUE, OnVex))
|
||||||
{
|
{
|
||||||
bAreRoundedCornersDisabled = TRUE;
|
CONTEXT ctx;
|
||||||
}
|
ZeroMemory(&ctx, sizeof(CONTEXT));
|
||||||
else
|
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
|
||||||
{
|
ctx.Dr7 = 0x404;
|
||||||
bAreRoundedCornersDisabled = FALSE;
|
ctx.Dr1 = (ULONG_PTR)pvRtlQueryElevationFlags;
|
||||||
}
|
|
||||||
CloseHandle(h_exists);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (GetLastError() == ERROR_ACCESS_DENIED)
|
|
||||||
{
|
|
||||||
bAreRoundedCornersDisabled = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bAreRoundedCornersDisabled = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD dwError = 1;
|
if (SetThreadContext(GetCurrentThread(), &ctx))
|
||||||
if ((hKey == NULL || hKey == INVALID_HANDLE_VALUE) && !bAreRoundedCornersDisabled)
|
|
||||||
{
|
|
||||||
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;
|
WCHAR wszExec[MAX_PATH * 2];
|
||||||
ZeroMemory(&ctx, sizeof(CONTEXT));
|
ZeroMemory(wszExec, MAX_PATH * 2 * sizeof(WCHAR));
|
||||||
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
|
wszExec[0] = L'"';
|
||||||
ctx.Dr7 = 0x404;
|
GetWindowsDirectoryW(wszExec + 1, MAX_PATH);
|
||||||
ctx.Dr1 = (ULONG_PTR)pvRtlQueryElevationFlags;
|
wcscat_s(wszExec, MAX_PATH * 2, L"\\regedit.exe\" \"");
|
||||||
|
wcscat_s(wszExec, MAX_PATH * 2, wszPath);
|
||||||
if (SetThreadContext(GetCurrentThread(), &ctx))
|
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))
|
||||||
{
|
{
|
||||||
WCHAR wszExec[MAX_PATH * 2];
|
CloseHandle(pi.hThread);
|
||||||
ZeroMemory(wszExec, MAX_PATH * 2 * sizeof(WCHAR));
|
//CloseHandle(pi.hProcess);
|
||||||
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
|
else
|
||||||
{
|
{
|
||||||
dwError = GetLastError();
|
dwError = GetLastError();
|
||||||
}
|
}
|
||||||
RemoveVectoredExceptionHandler(pv);
|
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
dwError = GetLastError();
|
dwError = GetLastError();
|
||||||
}
|
}
|
||||||
|
RemoveVectoredExceptionHandler(pv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dwError = GetLastError();
|
dwError = GetLastError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dwError)
|
else
|
||||||
{
|
{
|
||||||
WCHAR wszCMD[MAX_PATH];
|
dwError = GetLastError();
|
||||||
GetSystemDirectoryW(wszCMD, MAX_PATH);
|
|
||||||
wcscat_s(wszCMD, MAX_PATH, L"\\cmd.exe");
|
|
||||||
|
|
||||||
WCHAR wszRegedit[MAX_PATH];
|
|
||||||
GetWindowsDirectoryW(wszRegedit, MAX_PATH);
|
|
||||||
wcscat_s(wszRegedit, MAX_PATH, L"\\regedit.exe");
|
|
||||||
|
|
||||||
WCHAR wszSCPath[MAX_PATH];
|
|
||||||
GetSystemDirectoryW(wszSCPath, MAX_PATH);
|
|
||||||
wcscat_s(wszSCPath, MAX_PATH, L"\\sc.exe");
|
|
||||||
|
|
||||||
WCHAR wszTaskkill[MAX_PATH];
|
|
||||||
GetSystemDirectoryW(wszTaskkill, MAX_PATH);
|
|
||||||
wcscat_s(wszTaskkill, MAX_PATH, L"\\taskkill.exe");
|
|
||||||
|
|
||||||
WCHAR wszArguments[MAX_PATH * 10];
|
|
||||||
swprintf_s(
|
|
||||||
wszArguments,
|
|
||||||
MAX_PATH * 10,
|
|
||||||
L"/c \""
|
|
||||||
L"\"%s\" \"%s\" & "
|
|
||||||
L"\"%s\" stop ep_dwm_" _T(EP_CLSID_LITE) L" & "
|
|
||||||
L"\"%s\" delete ep_dwm_" _T(EP_CLSID_LITE)
|
|
||||||
L"\"",
|
|
||||||
wszRegedit,
|
|
||||||
wszPath,
|
|
||||||
wszSCPath,
|
|
||||||
wszSCPath
|
|
||||||
);
|
|
||||||
wprintf(L"%s\n", wszArguments);
|
|
||||||
|
|
||||||
SHELLEXECUTEINFO ShExecInfo = { 0 };
|
|
||||||
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
||||||
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
|
|
||||||
ShExecInfo.hwnd = NULL;
|
|
||||||
ShExecInfo.lpVerb = L"runas";
|
|
||||||
ShExecInfo.lpFile = wszCMD;
|
|
||||||
ShExecInfo.lpParameters = wszArguments;
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dwSize = sizeof(DWORD);
|
||||||
|
RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", RRF_RT_DWORD, NULL, &dwOldTaskbar, &dwSize);
|
||||||
|
if (dwOldTaskbar == 1)
|
||||||
|
{
|
||||||
|
FILE* vf = NULL;
|
||||||
|
_wfopen_s(&vf, wszPath, L"r");
|
||||||
|
if (vf)
|
||||||
|
{
|
||||||
|
char* line2 = malloc(MAX_LINE_LENGTH * sizeof(char));
|
||||||
|
if (line2)
|
||||||
|
{
|
||||||
|
int numChRd2 = 0;
|
||||||
|
size_t bufsiz2 = MAX_LINE_LENGTH;
|
||||||
|
while ((numChRd2 = getline(&line2, &bufsiz2, vf)) != -1)
|
||||||
|
{
|
||||||
|
if (!strncmp(line2, ";\"Virtualized_" EP_CLSID, 52))
|
||||||
|
{
|
||||||
|
DWORD dwVal = 0;
|
||||||
|
WCHAR wszName[MAX_PATH];
|
||||||
|
ZeroMemory(wszName, MAX_PATH * sizeof(wchar_t));
|
||||||
|
MultiByteToWideChar(
|
||||||
|
CP_UTF8,
|
||||||
|
MB_PRECOMPOSED,
|
||||||
|
line2 + 2,
|
||||||
|
numChRd2 - 2,
|
||||||
|
wszName,
|
||||||
|
MAX_PATH
|
||||||
|
);
|
||||||
|
wchar_t* ddd = wcschr(wszName, L'=');
|
||||||
|
if (ddd) *ddd = 0;
|
||||||
|
wchar_t* ppp = wcschr(wszName, L'"');
|
||||||
|
if (ppp) *ppp = 0;
|
||||||
|
if (!wcsncmp(ddd + 1, L"dword:", 6))
|
||||||
|
{
|
||||||
|
wchar_t* xxx = wcschr(ddd + 1, L':');
|
||||||
|
xxx++;
|
||||||
|
dwVal = wcstol(xxx, NULL, 16);
|
||||||
|
wprintf(L"%s %d\n", wszName, dwVal);
|
||||||
|
GUI_RegSetValueExW(NULL, wszName, 0, RRF_RT_DWORD, &dwVal, sizeof(DWORD));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(line2);
|
||||||
|
}
|
||||||
|
fclose(vf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RegSetKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"OldTaskbar", REG_DWORD, &dwOldTaskbarOld, sizeof(DWORD));
|
||||||
|
}
|
||||||
|
|
||||||
_this->tabOrder = 0;
|
_this->tabOrder = 0;
|
||||||
InvalidateRect(hwnd, NULL, FALSE);
|
InvalidateRect(hwnd, NULL, FALSE);
|
||||||
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))
|
||||||
@ -1535,6 +1671,257 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
else if (!strncmp(line + 1, "export", 6))
|
||||||
|
{
|
||||||
|
WCHAR title[MAX_PATH];
|
||||||
|
WCHAR filter[MAX_PATH];
|
||||||
|
WCHAR wszRegedit[MAX_PATH];
|
||||||
|
GetWindowsDirectoryW(wszRegedit, MAX_PATH);
|
||||||
|
wcscat_s(wszRegedit, MAX_PATH, L"\\regedit.exe");
|
||||||
|
HMODULE hRegedit = LoadLibraryExW(wszRegedit, NULL, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
|
if (hRegedit)
|
||||||
|
{
|
||||||
|
LoadStringW(hRegedit, 301, title, MAX_PATH);
|
||||||
|
LoadStringW(hRegedit, 302, filter, MAX_PATH);
|
||||||
|
unsigned int j = 0;
|
||||||
|
for (unsigned int i = 0; i < MAX_PATH; ++i)
|
||||||
|
{
|
||||||
|
if (filter[i] == L'#')
|
||||||
|
{
|
||||||
|
filter[i] = L'\0';
|
||||||
|
j++;
|
||||||
|
if (j == 2)
|
||||||
|
{
|
||||||
|
filter[i + 1] = L'\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FreeLibrary(hRegedit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wcscpy_s(title, MAX_PATH, L"Export settings");
|
||||||
|
wcscpy_s(filter, MAX_PATH, L"Registration Files (*.reg)\0*.reg\0\0");
|
||||||
|
}
|
||||||
|
WCHAR wszPath[MAX_PATH];
|
||||||
|
ZeroMemory(wszPath, MAX_PATH * sizeof(WCHAR));
|
||||||
|
OPENFILENAMEW ofn;
|
||||||
|
ZeroMemory(&ofn, sizeof(OPENFILENAMEW));
|
||||||
|
ofn.lStructSize = sizeof(OPENFILENAMEW);
|
||||||
|
ofn.hwndOwner = hwnd;
|
||||||
|
ofn.hInstance = GetModuleHandleW(NULL);
|
||||||
|
ofn.lpstrFilter = filter;
|
||||||
|
ofn.lpstrCustomFilter = NULL;
|
||||||
|
ofn.nMaxCustFilter = 0;
|
||||||
|
ofn.nFilterIndex = 1;
|
||||||
|
ofn.lpstrFile = wszPath;
|
||||||
|
ofn.nMaxFile = MAX_PATH;
|
||||||
|
ofn.lpstrFileTitle = NULL;
|
||||||
|
ofn.nMaxFileTitle = 0;
|
||||||
|
ofn.lpstrInitialDir = NULL;
|
||||||
|
ofn.lpstrTitle = title;
|
||||||
|
ofn.Flags = OFN_DONTADDTORECENT | OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
|
||||||
|
ofn.nFileOffset = 0;
|
||||||
|
ofn.nFileExtension = 0;
|
||||||
|
ofn.lpstrDefExt = L"reg";
|
||||||
|
ofn.lCustData = NULL;
|
||||||
|
ofn.lpfnHook = NULL;
|
||||||
|
ofn.lpTemplateName = NULL;
|
||||||
|
if (GetSaveFileNameW(&ofn))
|
||||||
|
{
|
||||||
|
_wfopen_s(&AuditFile, wszPath, L"w");
|
||||||
|
if (AuditFile)
|
||||||
|
{
|
||||||
|
fwprintf(AuditFile, L"Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\ExplorerPatcher]\n\"ImportOK\"=dword:00000001\n");
|
||||||
|
POINT pt;
|
||||||
|
pt.x = 0;
|
||||||
|
pt.y = 0;
|
||||||
|
GUI_Build(0, hwnd, pt);
|
||||||
|
fclose(AuditFile);
|
||||||
|
AuditFile = NULL;
|
||||||
|
MessageBoxW(hwnd, L"Settings have been exported successfully.", GUI_title, MB_ICONINFORMATION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(line + 1, "import", 6))
|
||||||
|
{
|
||||||
|
WCHAR title[MAX_PATH];
|
||||||
|
WCHAR filter[MAX_PATH];
|
||||||
|
WCHAR wszRegedit[MAX_PATH];
|
||||||
|
GetWindowsDirectoryW(wszRegedit, MAX_PATH);
|
||||||
|
wcscat_s(wszRegedit, MAX_PATH, L"\\regedit.exe");
|
||||||
|
HMODULE hRegedit = LoadLibraryExW(wszRegedit, NULL, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
|
if (hRegedit)
|
||||||
|
{
|
||||||
|
LoadStringW(hRegedit, 300, title, MAX_PATH);
|
||||||
|
LoadStringW(hRegedit, 302, filter, MAX_PATH);
|
||||||
|
unsigned j = 0;
|
||||||
|
for (unsigned int i = 0; i < MAX_PATH; ++i)
|
||||||
|
{
|
||||||
|
if (filter[i] == L'#')
|
||||||
|
{
|
||||||
|
filter[i] = L'\0';
|
||||||
|
j++;
|
||||||
|
if (j == 2)
|
||||||
|
{
|
||||||
|
filter[i + 1] = L'\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FreeLibrary(hRegedit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wcscpy_s(title, MAX_PATH, L"Import settings");
|
||||||
|
wcscpy_s(filter, MAX_PATH, L"Registration Files (*.reg)\0*.reg\0\0");
|
||||||
|
}
|
||||||
|
WCHAR wszPath[MAX_PATH];
|
||||||
|
ZeroMemory(wszPath, MAX_PATH * sizeof(WCHAR));
|
||||||
|
OPENFILENAMEW ofn;
|
||||||
|
ZeroMemory(&ofn, sizeof(OPENFILENAMEW));
|
||||||
|
ofn.lStructSize = sizeof(OPENFILENAMEW);
|
||||||
|
ofn.hwndOwner = hwnd;
|
||||||
|
ofn.hInstance = GetModuleHandleW(NULL);
|
||||||
|
ofn.lpstrFilter = filter;
|
||||||
|
ofn.lpstrCustomFilter = NULL;
|
||||||
|
ofn.nMaxCustFilter = 0;
|
||||||
|
ofn.nFilterIndex = 1;
|
||||||
|
ofn.lpstrFile = wszPath;
|
||||||
|
ofn.nMaxFile = MAX_PATH;
|
||||||
|
ofn.lpstrFileTitle = NULL;
|
||||||
|
ofn.nMaxFileTitle = 0;
|
||||||
|
ofn.lpstrInitialDir = NULL;
|
||||||
|
ofn.lpstrTitle = title;
|
||||||
|
ofn.Flags = OFN_DONTADDTORECENT | OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST;
|
||||||
|
ofn.nFileOffset = 0;
|
||||||
|
ofn.nFileExtension = 0;
|
||||||
|
ofn.lpstrDefExt = L"reg";
|
||||||
|
ofn.lCustData = NULL;
|
||||||
|
ofn.lpfnHook = NULL;
|
||||||
|
ofn.lpTemplateName = NULL;
|
||||||
|
if (GetOpenFileNameW(&ofn))
|
||||||
|
{
|
||||||
|
RegDeleteKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"ImportOK");
|
||||||
|
|
||||||
|
DWORD 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD dwData = 0, dwSize = sizeof(DWORD);
|
||||||
|
RegGetValueW(HKEY_CURRENT_USER, _T(REGPATH), L"ImportOK", RRF_RT_DWORD, NULL, &dwData, &dwSize);
|
||||||
|
if (dwData)
|
||||||
|
{
|
||||||
|
RegDeleteKeyValueW(HKEY_CURRENT_USER, _T(REGPATH), L"ImportOK");
|
||||||
|
|
||||||
|
FILE* vf = NULL;
|
||||||
|
_wfopen_s(&vf, wszPath, L"r");
|
||||||
|
if (vf)
|
||||||
|
{
|
||||||
|
char* line2 = malloc(MAX_LINE_LENGTH * sizeof(char));
|
||||||
|
if (line2)
|
||||||
|
{
|
||||||
|
int numChRd2 = 0;
|
||||||
|
size_t bufsiz2 = MAX_LINE_LENGTH;
|
||||||
|
while ((numChRd2 = getline(&line2, &bufsiz2, vf)) != -1)
|
||||||
|
{
|
||||||
|
if (!strncmp(line2, ";\"Virtualized_" EP_CLSID, 52))
|
||||||
|
{
|
||||||
|
DWORD dwVal = 0;
|
||||||
|
WCHAR wszName[MAX_PATH];
|
||||||
|
ZeroMemory(wszName, MAX_PATH * sizeof(wchar_t));
|
||||||
|
MultiByteToWideChar(
|
||||||
|
CP_UTF8,
|
||||||
|
MB_PRECOMPOSED,
|
||||||
|
line2 + 2,
|
||||||
|
numChRd2 - 2,
|
||||||
|
wszName,
|
||||||
|
MAX_PATH
|
||||||
|
);
|
||||||
|
wchar_t* ddd = wcschr(wszName, L'=');
|
||||||
|
if (ddd) *ddd = 0;
|
||||||
|
wchar_t* ppp = wcschr(wszName, L'"');
|
||||||
|
if (ppp) *ppp = 0;
|
||||||
|
if (!wcsncmp(ddd + 1, L"dword:", 6))
|
||||||
|
{
|
||||||
|
wchar_t* xxx = wcschr(ddd + 1, L':');
|
||||||
|
xxx++;
|
||||||
|
dwVal = wcstol(xxx, NULL, 16);
|
||||||
|
wprintf(L"%s %d\n", wszName, dwVal);
|
||||||
|
GUI_RegSetValueExW(NULL, wszName, 0, RRF_RT_DWORD, &dwVal, sizeof(DWORD));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(line2);
|
||||||
|
}
|
||||||
|
fclose(vf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dwMaxHeight += dwLineHeight * dy;
|
dwMaxHeight += dwLineHeight * dy;
|
||||||
@ -1626,6 +2013,22 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
numChRd = getline(&line, &bufsiz, f);
|
numChRd = getline(&line, &bufsiz, f);
|
||||||
|
if (!strncmp(line, ";\"Virtualized_" EP_CLSID, 52))
|
||||||
|
{
|
||||||
|
for (unsigned int kkkk = 1; kkkk < MAX_LINE_LENGTH; ++kkkk)
|
||||||
|
{
|
||||||
|
if (line[kkkk])
|
||||||
|
{
|
||||||
|
line[kkkk - 1] = line[kkkk];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line[kkkk - 1] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////////printf("%s\n", line);
|
||||||
|
}
|
||||||
ZeroMemory(name, MAX_LINE_LENGTH * sizeof(wchar_t));
|
ZeroMemory(name, MAX_LINE_LENGTH * sizeof(wchar_t));
|
||||||
MultiByteToWideChar(
|
MultiByteToWideChar(
|
||||||
CP_UTF8,
|
CP_UTF8,
|
||||||
@ -1699,7 +2102,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
|
|
||||||
if (!bJustCheck)
|
if (!bJustCheck)
|
||||||
{
|
{
|
||||||
RegCreateKeyExW(
|
GUI_RegCreateKeyExW(
|
||||||
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
||||||
wcschr(section, L'\\') + 1,
|
wcschr(section, L'\\') + 1,
|
||||||
0,
|
0,
|
||||||
@ -1733,7 +2136,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RegOpenKeyExW(
|
GUI_RegOpenKeyExW(
|
||||||
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
||||||
wcschr(section, L'\\') + 1,
|
wcschr(section, L'\\') + 1,
|
||||||
REG_OPTION_NON_VOLATILE,
|
REG_OPTION_NON_VOLATILE,
|
||||||
@ -1899,7 +2302,7 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RegCreateKeyExW(
|
GUI_RegCreateKeyExW(
|
||||||
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
bIsHKLM ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
||||||
wcschr(section, L'\\') + 1,
|
wcschr(section, L'\\') + 1,
|
||||||
0,
|
0,
|
||||||
@ -3012,12 +3415,11 @@ __declspec(dllexport) int ZZGUI(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLin
|
|||||||
}
|
}
|
||||||
RegisterClassW(&wc);
|
RegisterClassW(&wc);
|
||||||
|
|
||||||
TCHAR title[260];
|
|
||||||
_this.hExplorerFrame = LoadLibraryExW(L"ExplorerFrame.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
|
_this.hExplorerFrame = LoadLibraryExW(L"ExplorerFrame.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
if (_this.hExplorerFrame)
|
if (_this.hExplorerFrame)
|
||||||
{
|
{
|
||||||
LoadStringW(_this.hExplorerFrame, 50222, title, 260); // 726 = File Explorer
|
LoadStringW(_this.hExplorerFrame, 50222, GUI_title, 260); // 726 = File Explorer
|
||||||
wchar_t* p = wcschr(title, L'(');
|
wchar_t* p = wcschr(GUI_title, L'(');
|
||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
p--;
|
p--;
|
||||||
@ -3031,14 +3433,14 @@ __declspec(dllexport) int ZZGUI(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLin
|
|||||||
*p = 0;
|
*p = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (title[0] == 0)
|
if (GUI_title[0] == 0)
|
||||||
{
|
{
|
||||||
LoadStringW(hModule, IDS_PRODUCTNAME, title, 260);
|
LoadStringW(hModule, IDS_PRODUCTNAME, GUI_title, 260);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LoadStringW(hModule, IDS_PRODUCTNAME, title, 260);
|
LoadStringW(hModule, IDS_PRODUCTNAME, GUI_title, 260);
|
||||||
}
|
}
|
||||||
HANDLE hUxtheme = NULL;
|
HANDLE hUxtheme = NULL;
|
||||||
BOOL bHasLoadedUxtheme = FALSE;
|
BOOL bHasLoadedUxtheme = FALSE;
|
||||||
@ -3070,7 +3472,7 @@ __declspec(dllexport) int ZZGUI(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLin
|
|||||||
HWND hwnd = CreateWindowEx(
|
HWND hwnd = CreateWindowEx(
|
||||||
NULL,
|
NULL,
|
||||||
L"ExplorerPatcher_GUI_" _T(EP_CLSID),
|
L"ExplorerPatcher_GUI_" _T(EP_CLSID),
|
||||||
title,
|
GUI_title,
|
||||||
WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
|
WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -22,13 +22,13 @@
|
|||||||
;x 1 Top
|
;x 1 Top
|
||||||
;x 0 Left
|
;x 0 Left
|
||||||
;x 2 Right
|
;x 2 Right
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_TaskbarPosition"=dword:00000003
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_TaskbarPosition"=dword:00000003
|
||||||
;c 4 Secondary taskbar(s) location on screen
|
;c 4 Secondary taskbar(s) location on screen
|
||||||
;x 3 Bottom (default)
|
;x 3 Bottom (default)
|
||||||
;x 1 Top
|
;x 1 Top
|
||||||
;x 0 Left
|
;x 0 Left
|
||||||
;x 2 Right
|
;x 2 Right
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_MMTaskbarPosition"=dword:00000003
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_MMTaskbarPosition"=dword:00000003
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
||||||
;c 3 Extra button should be
|
;c 3 Extra button should be
|
||||||
;x 0 Hidden (default)
|
;x 0 Hidden (default)
|
||||||
@ -46,7 +46,7 @@
|
|||||||
"TaskbarSD"=dword:00000001
|
"TaskbarSD"=dword:00000001
|
||||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;b Automatically hide the taskbar
|
;b Automatically hide the taskbar
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_AutoHideTaskbar"=dword:00000000
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_AutoHideTaskbar"=dword:00000000
|
||||||
;t The following settings only apply to the Windows 10 taskbar:
|
;t The following settings only apply to the Windows 10 taskbar:
|
||||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;c 2 Start button style
|
;c 2 Start button style
|
||||||
@ -68,9 +68,9 @@
|
|||||||
;x 1 Small
|
;x 1 Small
|
||||||
;x 0 Large (default)
|
;x 0 Large (default)
|
||||||
"TaskbarSmallIcons"=dword:00000000
|
"TaskbarSmallIcons"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;b Show People on the taskbar
|
;b Show People on the taskbar
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_PeopleBand"=dword:00000000
|
||||||
|
|
||||||
|
|
||||||
;T System tray
|
;T System tray
|
||||||
@ -164,9 +164,9 @@
|
|||||||
;p 2
|
;p 2
|
||||||
;b Mica effect on title bar
|
;b Mica effect on title bar
|
||||||
"MicaEffectOnTitlebar"=dword:00000000
|
"MicaEffectOnTitlebar"=dword:00000000
|
||||||
[-HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}\InprocServer32]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;d Register as shell extension
|
;b Register as shell extension
|
||||||
@="{64bc32b5-4eec-4de7-972d-bd8bd0324537}"
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_RegisterAsShellExtension"=dword:00000000
|
||||||
|
|
||||||
|
|
||||||
;T Start menu
|
;T Start menu
|
||||||
@ -177,7 +177,7 @@
|
|||||||
"OpenAtLogon"=dword:00000000
|
"OpenAtLogon"=dword:00000000
|
||||||
;b Open Start in All apps by default
|
;b Open Start in All apps by default
|
||||||
"MakeAllAppsDefault"=dword:00000000
|
"MakeAllAppsDefault"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;c 22 Maximum number of frequent apps to show
|
;c 22 Maximum number of frequent apps to show
|
||||||
;x 0 None
|
;x 0 None
|
||||||
;x 1 1
|
;x 1 1
|
||||||
@ -201,7 +201,7 @@
|
|||||||
;x 19 19
|
;x 19 19
|
||||||
;x 20 20
|
;x 20 20
|
||||||
;x 99999 Unlimited
|
;x 99999 Unlimited
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_Start_MaximumFrequentApps"=dword:00000006
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_Start_MaximumFrequentApps"=dword:00000006
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
||||||
;c 2 Position on screen
|
;c 2 Position on screen
|
||||||
;x 0 Left
|
;x 0 Left
|
||||||
@ -365,7 +365,7 @@
|
|||||||
;b Disable Office hotkeys (Ctrl+Alt+Shift+Windows key combinations) *
|
;b Disable Office hotkeys (Ctrl+Alt+Shift+Windows key combinations) *
|
||||||
"DisableOfficeHotkeys"=dword:00000000
|
"DisableOfficeHotkeys"=dword:00000000
|
||||||
;b Disable rounded corners for application windows
|
;b Disable rounded corners for application windows
|
||||||
"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_DisableRoundedCorners"=dword:00000000
|
;"Virtualized_{D17F1E1A-5919-4427-8F89-A1A8503CA3EB}_DisableRoundedCorners"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
||||||
;c 6 Default action in the Alt+F4 dialog on the desktop
|
;c 6 Default action in the Alt+F4 dialog on the desktop
|
||||||
;x 256 Switch user
|
;x 256 Switch user
|
||||||
@ -425,7 +425,7 @@
|
|||||||
"TaskbarAutohideOnDoubleClick"=dword:00000000
|
"TaskbarAutohideOnDoubleClick"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Control Panel\Desktop]
|
[HKEY_CURRENT_USER\Control Panel\Desktop]
|
||||||
;b Show Windows build info on the desktop *
|
;b Show Windows build info on the desktop *
|
||||||
"PaintDesktopversion"=dword:00000000
|
"PaintDesktopVersion"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\ExplorerPatcher]
|
||||||
;b Enable advanced mitigations for correct rendering using classic theme *
|
;b Enable advanced mitigations for correct rendering using classic theme *
|
||||||
"ClassicThemeMitigations"=dword:00000000
|
"ClassicThemeMitigations"=dword:00000000
|
||||||
@ -473,6 +473,12 @@
|
|||||||
;https://www.paypal.com/donate?business=valentingabrielradu%40gmail.com&no_recurring=0&item_name=ExplorerPatcher¤cy_code=EUR
|
;https://www.paypal.com/donate?business=valentingabrielradu%40gmail.com&no_recurring=0&item_name=ExplorerPatcher¤cy_code=EUR
|
||||||
;y Frequently Asked Questions 🡕
|
;y Frequently Asked Questions 🡕
|
||||||
;https://github.com/valinet/ExplorerPatcher/wiki/Frequently-asked-questions
|
;https://github.com/valinet/ExplorerPatcher/wiki/Frequently-asked-questions
|
||||||
|
;y Learn more managing these settings 🡕
|
||||||
|
;https://github.com/valinet/ExplorerPatcher/wiki/Settings-management
|
||||||
|
;u Import settings
|
||||||
|
;import
|
||||||
|
;u Export current settings
|
||||||
|
;export
|
||||||
;u Restore default settings
|
;u Restore default settings
|
||||||
;reset
|
;reset
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#define VER_MAJOR 22000
|
#define VER_MAJOR 22000
|
||||||
#define VER_MINOR 434
|
#define VER_MINOR 434
|
||||||
#define VER_BUILD_HI 41
|
#define VER_BUILD_HI 41
|
||||||
#define VER_BUILD_LO 10
|
#define VER_BUILD_LO 11
|
||||||
#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.434.41.10"
|
#define VER_FILE_STRING VALUE "FileVersion", "22000.434.41.11"
|
||||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.434.41.10"
|
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.434.41.11"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user