Skip to content

Commit

Permalink
Merge branch 'valinet:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
deep-soft authored Jul 14, 2024
2 parents 993bc29 + 016214a commit 1c8d69a
Show file tree
Hide file tree
Showing 13 changed files with 102 additions and 66 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@ jobs:
- name: Restore NuGet packages
run: |
nuget restore ExplorerPatcher.sln
- name: Download ep_taskbar
uses: robinraju/release-downloader@v1
with:
repository: ExplorerPatcher/ep_taskbar_releases
fileName: ep_taskbar.*.dll
latest: true
out-file-path: build/Release

- name: Build funchook
shell: powershell
Expand Down
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@

This document includes the same release notes as in the [Releases](https://github.com/valinet/ExplorerPatcher/releases) section on GitHub.

## 22621.3810.66

##### 1

Tested on OS builds 19045.4598, 22621.3296, 22621.3810, 26120.961, and 26244.5000. (Note: 22621 and 22631 share the same OS files)

* Taskbar10: Introduced a new taskbar implementation: Windows 10 (ExplorerPatcher). (146070d, 0b86e55)
* You can try this implementation out by changing the "Taskbar style" to "Windows 10 (ExplorerPatcher)".
* For now, this is **only available for builds 22621, 22631, and 22635.** Other builds will not have the option.
* Refer to [this wiki article](https://github.com/valinet/ExplorerPatcher/wiki/ExplorerPatcher's-taskbar-implementation) for more information including important ones.

## 22621.3527.65

Tested on OS builds 22621.3296, 22621.3447, 22621.3527, 22635.3566, 26058.1000, 26120.461, and 26200.5001. (Note: 22621 and 22631 share the same OS files)
Expand All @@ -19,7 +30,7 @@ Tested on OS builds 22621.3296, 22621.3447, 22621.3527, 22635.3566, 26058.1000,

##### 3

* All: Updated some patterns to work with 22635.3430+ (Beta) and recent 24H2 builds. (b51ef38)
* All: Updated some patterns to work with 22635.3430+ (Beta) and recent 24H2 builds. (6d22947)
* This should fix the Windows 10 start menu crashing and Win+X not working on both aforementioned builds when symbols are not yet downloaded.

##### 4
Expand Down
6 changes: 0 additions & 6 deletions ExplorerPatcher/ExplorerPatcher.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
<RootNamespace>CenterTitlebarTextLibrary</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>ExplorerPatcher</ProjectName>
<WithAltTaskbarImpl>0</WithAltTaskbarImpl>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
Expand Down Expand Up @@ -91,11 +90,6 @@
<TargetName>ExplorerPatcher.IA-32</TargetName>
<OutDir>$(SolutionDir)\build\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(WithAltTaskbarImpl)'=='1'">
<ClCompile>
<PreprocessorDefinitions>WITH_ALT_TASKBAR_IMPL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
Expand Down
73 changes: 56 additions & 17 deletions ExplorerPatcher/dllmain.c
Original file line number Diff line number Diff line change
Expand Up @@ -1861,6 +1861,18 @@ void UpdateStartMenuPositioning(LPARAM loIsShouldInitializeArray_hiIsShouldRoIni
}
}
}

__declspec(dllexport) unsigned __int64 FindTaskbarLayoutTokenByHMONITOR(HMONITOR hMonitor)
{
for (DWORD i = 0; i < dwMonitorCount; i++)
{
if (hMonitorList[i].hMonitor == hMonitor)
{
return hMonitorList[i].token;
}
}
return 0;
}
#else
void UpdateStartMenuPositioning(LPARAM loIsShouldInitializeArray_hiIsShouldRoInitialize) {}
#endif
Expand Down Expand Up @@ -11480,10 +11492,16 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}

// ### CStartExperienceManager::Hide()
// ```
// 74 ?? ?? 03 00 00 00 44 88
// ^^ Turn jz into jmp
// ```
// * Pattern 1, mov [rbx+2A3h], r12b:
// ```
// 74 ?? ?? 03 00 00 00 44 88
// ^^ Turn jz into jmp
// ```
// * Pattern 2, mov byte ptr [rbx+2A3h], 1:
// ```
// 74 ?? ?? 03 00 00 00 C6 83
// ^^ Turn jz into jmp
// ```
// Perform on exactly two matches
PBYTE matchHideA = FindPattern(
mi->lpBaseOfDll,
Expand All @@ -11507,6 +11525,31 @@ BOOL FixStartMenuAnimation(LPMODULEINFO mi)
}
}

if (!matchHideA || !matchHideB)
{
matchHideA = FindPattern(
mi->lpBaseOfDll,
mi->SizeOfImage,
"\x74\x00\x00\x03\x00\x00\x00\xC6\x83",
"x??xxxxxx"
);
matchHideB = NULL;
if (matchHideA)
{
printf("[SMA] matchHideA in CStartExperienceManager::Hide() = %llX\n", matchHideA - (PBYTE)mi->lpBaseOfDll);
matchHideB = FindPattern(
matchHideA + 14,
mi->SizeOfImage - (matchHideA + 14 - (PBYTE)mi->lpBaseOfDll),
"\x74\x00\x00\x03\x00\x00\x00\xC6\x83",
"x??xxxxxx"
);
if (matchHideB)
{
printf("[SMA] matchHideB in CStartExperienceManager::Hide() = %llX\n", matchHideB - (PBYTE)mi->lpBaseOfDll);
}
}
}

if (!matchVtable
|| !matchSingleViewShellExperienceFields
|| !matchAnimationHelperFields
Expand Down Expand Up @@ -11825,7 +11868,6 @@ BOOL CrashCounterHandleEntryPoint()

#pragma region "Loader for alternate taskbar implementation"
#ifdef _WIN64
#if WITH_ALT_TASKBAR_IMPL
BOOL CheckExplorerSymbols(symbols_addr* symbols_PTRS)
{
BOOL bAllValid = TRUE;
Expand Down Expand Up @@ -11859,11 +11901,11 @@ const WCHAR* GetTaskbarDllChecked(symbols_addr* symbols_PTRS)
return pszTaskbarDll;
}

void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCHAR* pszTaskbarDll)
HMODULE PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCHAR* pszTaskbarDll)
{
if (!symbols_PTRS || !pszTaskbarDll)
{
return;
return NULL;
}

wchar_t szPath[MAX_PATH];
Expand All @@ -11875,7 +11917,7 @@ void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCH
if (!hMyTaskbar)
{
wprintf(L"[TB] '%s' not found\n", pszTaskbarDll);
return;
return NULL;
}

typedef DWORD (*GetVersion_t)();
Expand All @@ -11884,7 +11926,8 @@ void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCH
if (version != 2)
{
wprintf(L"[TB] '%s' with version %d is not compatible\n", pszTaskbarDll, version);
return;
FreeLibrary(hMyTaskbar);
return NULL;
}

explorer_TrayUI_CreateInstanceFunc = GetProcAddress(hMyTaskbar, "EP_TrayUI_CreateInstance");
Expand All @@ -11908,9 +11951,9 @@ void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCH
}

wprintf(L"[TB] Using '%s'\n", pszTaskbarDll);
return hMyTaskbar;
}
#endif
#endif
#pragma endregion


Expand Down Expand Up @@ -12401,11 +12444,7 @@ DWORD Inject(BOOL bIsExplorer)
#endif
}

#if WITH_ALT_TASKBAR_IMPL
const WCHAR* pszTaskbarDll = GetTaskbarDllChecked(&symbols_PTRS);
#else
const WCHAR* pszTaskbarDll = NULL;
#endif
if (bOldTaskbar >= 2 && !pszTaskbarDll)
{
bOldTaskbar = 1;
Expand Down Expand Up @@ -12763,9 +12802,7 @@ DWORD Inject(BOOL bIsExplorer)
#endif

VnPatchIAT(hTwinuiPcshell, "API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL", "RegGetValueW", twinuipcshell_RegGetValueW);
#if WITH_ALT_TASKBAR_IMPL
PrepareAlternateTaskbarImplementation(&symbols_PTRS, pszTaskbarDll);
#endif
HMODULE hMyTaskbar = PrepareAlternateTaskbarImplementation(&symbols_PTRS, pszTaskbarDll);
printf("Setup twinui.pcshell functions done\n");


Expand Down Expand Up @@ -13151,6 +13188,8 @@ DWORD Inject(BOOL bIsExplorer)


VnPatchDelayIAT(hExplorer, "ext-ms-win-rtcore-ntuser-window-ext-l1-1-0.dll", "GetClientRect", TaskbarCenter_GetClientRectHook);
if (hMyTaskbar)
VnPatchIAT(hMyTaskbar, "USER32.dll", "GetClientRect", TaskbarCenter_GetClientRectHook);
VnPatchIAT(hExplorer, "SHCORE.dll", (LPCSTR)190, TaskbarCenter_SHWindowsPolicy);
printf("Initialized taskbar centering module.\n");

Expand Down
6 changes: 6 additions & 0 deletions ExplorerPatcher/hooking.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,14 @@ extern "C"
#endif

#if HOW_TO_HOOK == HOOK_WITH_FUNCHOOK
#ifdef __cplusplus
inline
#endif
funchook_t* funchook;
#elif HOW_TO_HOOK == HOOK_WITH_DETOURS
#ifdef __cplusplus
inline
#endif
void* funchook;
#endif

Expand Down
24 changes: 15 additions & 9 deletions ExplorerPatcher/symbols.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ const char* explorer_SN[EXPLORER_SB_CNT] = {
EXPLORER_SB_4,
EXPLORER_SB_5
};
const char* explorer_SN_26244[1] = {
EXPLORER_SB_4,
};
const char* twinui_pcshell_SN[TWINUI_PCSHELL_SB_CNT] = {
TWINUI_PCSHELL_SB_0,
TWINUI_PCSHELL_SB_1,
Expand Down Expand Up @@ -113,16 +116,19 @@ static BOOL ProcessExplorerSymbols(const char* pszSettingsPath, DWORD* pOffsets)
}

printf("[Symbols] Reading symbols...\n");
if (VnGetSymbols(
pszSettingsPath,
pOffsets,
explorer_SN,
EXPLORER_SB_CNT
))
if (VnGetSymbols(pszSettingsPath, pOffsets, explorer_SN, ARRAYSIZE(explorer_SN)) != 0)
{
printf("[Symbols] Failure in reading symbols for \"%s\".\n", explorer_sb_dll);
if (hKey) RegCloseKey(hKey);
return FALSE;
DWORD offsets26244[ARRAYSIZE(explorer_SN_26244)];
if (VnGetSymbols(pszSettingsPath, offsets26244, explorer_SN_26244, ARRAYSIZE(explorer_SN_26244)) == 0)
{
pOffsets[4] = offsets26244[0];
}
else
{
printf("[Symbols] Failure in reading symbols for \"%s\".\n", explorer_sb_dll);
if (hKey) RegCloseKey(hKey);
return FALSE;
}
}

RegSetValueExW(hKey, TEXT(EXPLORER_SB_0), 0, REG_DWORD, &pOffsets[0], sizeof(DWORD));
Expand Down
11 changes: 0 additions & 11 deletions ExplorerPatcher/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@
#define WM_MSG_GUI_SECTION WM_USER + 1
#define WM_MSG_GUI_SECTION_GET 1

#ifndef WITH_ALT_TASKBAR_IMPL
#define WITH_ALT_TASKBAR_IMPL 0
#endif

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -695,7 +691,6 @@ inline BOOL IsStockWindows10TaskbarAvailable()
return global_rovi.dwBuildNumber < 26002;
}

#if WITH_ALT_TASKBAR_IMPL
inline const WCHAR* PickTaskbarDll()
{
DWORD b = global_rovi.dwBuildNumber;
Expand Down Expand Up @@ -737,12 +732,6 @@ inline BOOL DoesTaskbarDllExist()
wcscat_s(szPath, MAX_PATH, pszTaskbarDll);
return FileExistsW(szPath);
}
#else
inline BOOL DoesTaskbarDllExist()
{
return FALSE;
}
#endif

inline void AdjustTaskbarStyleValue(DWORD* pdwValue)
{
Expand Down
2 changes: 1 addition & 1 deletion ep_gui/resources/lang/ep_gui.en-US.rc
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ BEGIN
IDS_UPDATES_POLICY_2 "Do not check for updates"
IDS_UPDATES_PREFER_STAGING "Receive pre-release versions, if available (not recommended)"
IDS_UPDATES_DOWNGRADES "Suggest the latest version on the server, even if it's older (not recommended)"
IDS_UPDATES_USELOCAL "Build updates locally before installing"
IDS_UPDATES_UPDATESERVERS "Update servers:"
IDS_UPDATES_RELEASES "Releases"
IDS_UPDATES_RELEASES_PROMPT "Type a URL that serves resources adhering to GitHub's releases API. To learn how to configure your own update server, please consult the wiki."
Expand All @@ -391,7 +392,6 @@ BEGIN
IDS_UPDATES_INSTALL "Update program and restart File Explorer"
IDS_UPDATES_CHANGES "Read about changes in the latest releases"
IDS_UPDATES_LEARN "Learn more"
IDS_UPDATES_USELOCAL "Build updates locally before installing"

IDS_ADV "Advanced"

Expand Down
2 changes: 0 additions & 2 deletions ep_setup/ep_setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,13 +457,11 @@ BOOL DownloadResource(BOOL bInstall, LPCWSTR pwszURL, DWORD dwSize, LPCSTR chash

void ProcessTaskbarDlls(BOOL* bInOutOk, BOOL bInstall, BOOL bExtractMode, HINSTANCE hInstance, WCHAR wszPath[260])
{
#if WITH_ALT_TASKBAR_IMPL
LPCWSTR pwszTaskbarDllName = bExtractMode ? NULL : PickTaskbarDll();
if (*bInOutOk) *bInOutOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.2.dll")), hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll");
if (*bInOutOk) *bInOutOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.3.dll")), hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll");
if (*bInOutOk) *bInOutOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.4.dll")), hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll");
if (*bInOutOk) *bInOutOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.5.dll")), hInstance, IDR_EP_TASKBAR_5, wszPath, L"ep_taskbar.5.dll");
#endif
}

int WINAPI wWinMain(
Expand Down
9 changes: 0 additions & 9 deletions ep_setup/ep_setup.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
<ProjectGuid>{2fd40b09-f224-4e9a-b2fe-a22b50b2debf}</ProjectGuid>
<RootNamespace>epsetup</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<WithAltTaskbarImpl>0</WithAltTaskbarImpl>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
Expand Down Expand Up @@ -87,14 +86,6 @@
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)\build\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(WithAltTaskbarImpl)'=='1'">
<ClCompile>
<PreprocessorDefinitions>WITH_ALT_TASKBAR_IMPL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>WITH_ALT_TASKBAR_IMPL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
Expand Down
6 changes: 0 additions & 6 deletions ep_setup/resources/ep_setup.rc
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,6 @@ IDR_EP_STARTMENU RCDATA "..\\build\\Release\\ep_startmenu.dll

IDR_EP_GUI RCDATA "..\\build\\Release\\ep_gui.dll"

#ifdef WITH_ALT_TASKBAR_IMPL
#if WITH_ALT_TASKBAR_IMPL

#if EP_TASKBAR_2_EXISTS
IDR_EP_TASKBAR_2 RCDATA "..\\build\\Release\\ep_taskbar.2.dll"
#endif
Expand All @@ -125,9 +122,6 @@ IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\ep_taskbar.4.dll
IDR_EP_TASKBAR_5 RCDATA "..\\build\\Release\\ep_taskbar.5.dll"
#endif

#endif
#endif

#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////

Expand Down
6 changes: 3 additions & 3 deletions version.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#define VER_MAJOR 22621
#define VER_MINOR 3527
#define VER_BUILD_HI 65
#define VER_BUILD_LO 5
#define VER_MINOR 3810
#define VER_BUILD_HI 66
#define VER_BUILD_LO 1
#define VER_FLAGS VS_FF_PRERELEASE


Expand Down

0 comments on commit 1c8d69a

Please sign in to comment.