diff --git a/ExplorerPatcher/ExplorerPatcher.vcxproj b/ExplorerPatcher/ExplorerPatcher.vcxproj index b2212a3..f602e31 100644 --- a/ExplorerPatcher/ExplorerPatcher.vcxproj +++ b/ExplorerPatcher/ExplorerPatcher.vcxproj @@ -29,26 +29,26 @@ DynamicLibrary true - v142 + v143 Unicode DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true Unicode DynamicLibrary false - v142 + v143 true Unicode @@ -343,10 +343,18 @@ + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/ExplorerPatcher/ExplorerPatcher.vcxproj.filters b/ExplorerPatcher/ExplorerPatcher.vcxproj.filters index d78f2d1..1cb4c14 100644 --- a/ExplorerPatcher/ExplorerPatcher.vcxproj.filters +++ b/ExplorerPatcher/ExplorerPatcher.vcxproj.filters @@ -225,5 +225,6 @@ Settings + - + \ No newline at end of file diff --git a/ExplorerPatcher/StartMenuSettings.cpp b/ExplorerPatcher/StartMenuSettings.cpp index 9f8b569..a95da1e 100644 --- a/ExplorerPatcher/StartMenuSettings.cpp +++ b/ExplorerPatcher/StartMenuSettings.cpp @@ -2,7 +2,24 @@ #include #include #include -#include +#include + +extern "C" extern DWORD dwStartShowClassicMode; + +static void EPWilLogCallback(wil::FailureInfo const &failure) noexcept +{ + wchar_t message[2048]; + HRESULT hr = GetFailureLogString(message, ARRAYSIZE(message), failure); + if (SUCCEEDED(hr)) + { + wprintf(L"%s", message); // message includes newline + } +} + +extern "C" void InitializeWilLogCallback() +{ + SetResultLoggingCallback(EPWilLogCallback); +} static std::vector GlobalStartData_GetPlacesFromRegistry() { @@ -137,3 +154,204 @@ extern "C" BOOL NeedsRo_SyncSettingsFromRegToCDS() return TRUE; } + +namespace ABI::WindowsInternal::Shell::UnifiedTile +{ + MIDL_INTERFACE("d3653510-4fff-4bfa-905b-ea038b142fa5") + IUnifiedTileIdentifier : public IInspectable + { + }; + + MIDL_INTERFACE("0e7735be-a965-44a6-a75f-54b8bcd67bec") + IWin32UnifiedTileIdentifierFactory : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE Create(HSTRING, IUnifiedTileIdentifier**) = 0; + }; +} + +namespace ABI::WindowsInternal::Shell::UnifiedTile::Private +{ + MIDL_INTERFACE("0083831c-82d6-4e8f-bcc2-a8ac2691be49") + IUnifiedTileUserPinHelperStatics : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE CreateUserPinnedShortcutTile(IUnifiedTileIdentifier*) = 0; + }; +} + +namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections +{ + enum class CollectionAttributes {}; + enum class PackageStatusChangeType {}; + enum class StartCollectionCustomizationRestrictionType {}; + enum class TilePinSize {}; + + namespace DataStoreCache::CuratedTileCollectionTransformer + { + class CuratedTile; + } + + MIDL_INTERFACE("ffffffff-ffff-ffff-ffff-ffffffffffff") + ICuratedTileGroup : public IInspectable + { + }; + + MIDL_INTERFACE("ffffffff-ffff-ffff-ffff-ffffffffffff") + ICuratedTile : public IInspectable + { + }; + + MIDL_INTERFACE("51a07090-3a1f-49ef-9932-a971b8154790") + ICuratedTileCollection : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE get_CollectionName(HSTRING*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Attributes(CollectionAttributes*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Attributes(CollectionAttributes) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Version(unsigned int*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Version(unsigned int) = 0; + virtual HRESULT STDMETHODCALLTYPE GetGroups(Windows::Foundation::Collections::IMapView**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetTiles(Windows::Foundation::Collections::IMapView**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetAllTilesInCollection(Windows::Foundation::Collections::IMapView**) = 0; + virtual HRESULT STDMETHODCALLTYPE DoesCollectionContainTile(IUnifiedTileIdentifier*, ICuratedTile**, unsigned char*) = 0; + virtual HRESULT STDMETHODCALLTYPE FindTileAndParentGroup(IUnifiedTileIdentifier*, ICuratedTile**, ICuratedTileGroup**, unsigned char*) = 0; + virtual HRESULT STDMETHODCALLTYPE MoveExistingGroupToNewParent(ICuratedTileGroup*, ICuratedTileGroup*) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateNewGroup(ICuratedTileGroup**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetGroup(GUID, ICuratedTileGroup**) = 0; + virtual HRESULT STDMETHODCALLTYPE DeleteGroup(GUID) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveGroup(GUID) = 0; + virtual HRESULT STDMETHODCALLTYPE MoveExistingTileToNewParent(ICuratedTile*, ICuratedTileGroup*) = 0; + virtual HRESULT STDMETHODCALLTYPE AddTile(IUnifiedTileIdentifier*, ICuratedTile**) = 0; + virtual HRESULT STDMETHODCALLTYPE AddTileWithId(IUnifiedTileIdentifier*, GUID, ICuratedTile**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetTile(GUID, ICuratedTile**) = 0; + virtual HRESULT STDMETHODCALLTYPE DeleteTile(GUID) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveTile(GUID) = 0; + virtual HRESULT STDMETHODCALLTYPE Commit() = 0; + virtual HRESULT STDMETHODCALLTYPE CommitAsync(Windows::Foundation::IAsyncAction**) = 0; + virtual HRESULT STDMETHODCALLTYPE CommitAsyncWithTimerBypass(Windows::Foundation::IAsyncAction**) = 0; + virtual HRESULT STDMETHODCALLTYPE ResetToDefault() = 0; + virtual HRESULT STDMETHODCALLTYPE ResetToDefaultAsync(Windows::Foundation::IAsyncAction**) = 0; + virtual HRESULT STDMETHODCALLTYPE CheckForUpdate() = 0; + virtual HRESULT STDMETHODCALLTYPE GetCustomProperty(const HSTRING, HSTRING*) = 0; + virtual HRESULT STDMETHODCALLTYPE HasCustomProperty(const HSTRING, unsigned char*) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveCustomProperty(const HSTRING) = 0; + virtual HRESULT STDMETHODCALLTYPE SetCustomProperty(const HSTRING, HSTRING) = 0; + virtual HRESULT STDMETHODCALLTYPE EnsureTileRegistration() = 0; + virtual HRESULT STDMETHODCALLTYPE ResurrectTile(std::shared_ptr, const GUID&) = 0; + virtual HRESULT STDMETHODCALLTYPE OnTileAddedWithinCollection(IUnifiedTileIdentifier*) = 0; + virtual HRESULT STDMETHODCALLTYPE OnTileRemovedWithinCollection(IUnifiedTileIdentifier*) = 0; + }; + + MIDL_INTERFACE("adbf8965-6056-4126-ab26-6660af4661ce") + IStartTileCollection : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE PinToStart(IUnifiedTileIdentifier*, TilePinSize); + virtual HRESULT STDMETHODCALLTYPE PinToStartAtLocation(IUnifiedTileIdentifier*, ICuratedTileGroup*, Windows::Foundation::Point, Windows::Foundation::Size); + virtual HRESULT STDMETHODCALLTYPE UnpinFromStart(IUnifiedTileIdentifier*); + virtual HRESULT STDMETHODCALLTYPE ReplaceTinyOrMediumTile(IUnifiedTileIdentifier*, IUnifiedTileIdentifier*); + virtual HRESULT STDMETHODCALLTYPE get_LastGroupId(GUID*); + virtual HRESULT STDMETHODCALLTYPE put_LastGroupId(GUID); + virtual HRESULT STDMETHODCALLTYPE get_CustomizationRestriction(StartCollectionCustomizationRestrictionType*); + virtual HRESULT STDMETHODCALLTYPE put_CustomizationRestriction(StartCollectionCustomizationRestrictionType); + virtual HRESULT STDMETHODCALLTYPE get_GroupCellWidth(unsigned int*); + virtual HRESULT STDMETHODCALLTYPE put_GroupCellWidth(unsigned int); + virtual HRESULT STDMETHODCALLTYPE get_PreferredColumnCount(unsigned int*); + virtual HRESULT STDMETHODCALLTYPE put_PreferredColumnCount(unsigned int); + virtual HRESULT STDMETHODCALLTYPE get_CurrentColumnCount(unsigned int*); + virtual HRESULT STDMETHODCALLTYPE put_CurrentColumnCount(unsigned int); + }; + + MIDL_INTERFACE("ffffffff-ffff-ffff-ffff-ffffffffffff") + ICuratedTileCollectionOptions : public IInspectable + { + }; + + MIDL_INTERFACE("ffffffff-ffff-ffff-ffff-ffffffffffff") + ICuratedTileCollectionManager : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE NotifyPackageStatusChanged(HSTRING, PackageStatusChangeType) = 0; + virtual HRESULT STDMETHODCALLTYPE GetCollection(HSTRING, ICuratedTileCollection**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetCollectionWithOptions(HSTRING, ICuratedTileCollectionOptions*, ICuratedTileCollection**) = 0; + virtual HRESULT STDMETHODCALLTYPE DeleteCollection(HSTRING) = 0; + virtual HRESULT STDMETHODCALLTYPE CollectionExists(HSTRING, unsigned char*) = 0; + virtual HRESULT STDMETHODCALLTYPE InitializeCollection(HSTRING) = 0; + }; + + MIDL_INTERFACE("15f254ac-49b3-4e6e-9c62-806ffaf554f9") + ICuratedTileCollectionManagerStatics : public IInspectable + { + virtual HRESULT STDMETHODCALLTYPE CreateWithUser(Windows::System::IUser*, ICuratedTileCollectionManager**) = 0; + }; +} + +struct CCacheShortcut +{ +public: + const wchar_t* GetAppID(const void* a2) const + { + DWORD dwOffset = *((DWORD*)this + 11); // Same offset in Windows 10 and 11 + return dwOffset != -1 ? (wchar_t*)((char*)a2 + dwOffset) : nullptr; + } +}; + +extern "C" +{ +HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(const CCacheShortcut* a2, const void* a3); +HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const CCacheShortcut* a2, const void* a3) +{ + using namespace ABI::WindowsInternal::Shell::UnifiedTile; + using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private; + using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; + + if (dwStartShowClassicMode) + { + return AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc(a2, a3); + } + + Microsoft::WRL::ComPtr pTileIdentifierFactory; + RETURN_IF_FAILED(Windows::Foundation::GetActivationFactory( + Microsoft::WRL::Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.UnifiedTileIdentifier").Get(), + pTileIdentifierFactory.GetAddressOf() + )); + + Microsoft::WRL::ComPtr pTileIdentifier; + const wchar_t* pwszAppId = a2->GetAppID(a3); + RETURN_IF_FAILED(pTileIdentifierFactory->Create( + Microsoft::WRL::Wrappers::HStringReference(pwszAppId).Get(), + pTileIdentifier.GetAddressOf() + )); + + Microsoft::WRL::ComPtr pTileUserPinHelper; + RETURN_IF_FAILED(Windows::Foundation::GetActivationFactory( + Microsoft::WRL::Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.Private.UnifiedTileUserPinHelper").Get(), + pTileUserPinHelper.GetAddressOf() + )); + + RETURN_IF_FAILED(pTileUserPinHelper->CreateUserPinnedShortcutTile( + pTileIdentifier.Get() + )); + + // At this point, on Windows 11 the Windows 10 code doesn't exist anymore, so we'll add them here + Microsoft::WRL::ComPtr pTileCollectionManager; + RETURN_IF_FAILED(RoActivateInstance( + Microsoft::WRL::Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), + (IInspectable**)pTileCollectionManager.GetAddressOf() + )); + + Microsoft::WRL::ComPtr pTileCollection; + RETURN_IF_FAILED(pTileCollectionManager->GetCollection( + Microsoft::WRL::Wrappers::HStringReference(L"Start.TileGrid").Get(), + pTileCollection.GetAddressOf() + )); + + Microsoft::WRL::ComPtr pStartTileCollection; + RETURN_IF_FAILED(pTileCollection.As(&pStartTileCollection)); + + RETURN_IF_FAILED(pStartTileCollection->PinToStart( + pTileIdentifier.Get(), + static_cast(0) + )); + + RETURN_IF_FAILED(pTileCollection->Commit()); + + return S_OK; +} +} diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index ae18d82..81b50a0 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -9811,6 +9811,7 @@ DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) } VnPatchIAT(hExplorerFrame, "API-MS-WIN-CORE-STRING-L1-1-0.DLL", "CompareStringOrdinal", ExplorerFrame_CompareStringOrdinal); VnPatchIAT(hExplorerFrame, "user32.dll", "GetSystemMetricsForDpi", explorerframe_GetSystemMetricsForDpi); + VnPatchIAT(hExplorerFrame, "api-ms-win-core-com-l1-1-0.dll", "CoCreateInstance", ExplorerFrame_CoCreateInstanceHook); } else { @@ -9824,6 +9825,7 @@ DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) } VnPatchIAT(hExplorerFrame, "API-MS-WIN-CORE-STRING-L1-1-0.DLL", "CompareStringOrdinal", CompareStringOrdinal); VnPatchIAT(hExplorerFrame, "user32.dll", "GetSystemMetricsForDpi", GetSystemMetricsForDpi); + VnPatchIAT(hExplorerFrame, "api-ms-win-core-com-l1-1-0.dll", "CoCreateInstance", CoCreateInstance); FreeLibrary(hExplorerFrame); FreeLibrary(hExplorerFrame); } @@ -9904,8 +9906,28 @@ DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) } } } + +#ifdef _WIN64 + // As of writing this function is never invoked with bInstall=TRUE, so we don't handle the case if it's false for now + RtlQueryFeatureConfigurationFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlQueryFeatureConfiguration"); + int rv = -1; + if (RtlQueryFeatureConfigurationFunc) + { + rv = funchook_prepare( + funchook, + (void**)&RtlQueryFeatureConfigurationFunc, + RtlQueryFeatureConfigurationHook + ); + } + if (rv != 0) + { + printf("Failed to hook RtlQueryFeatureConfiguration(). rv = %d\n", rv); + } +#endif } + +#pragma region "Enable old Alt+Tab" INT64(*twinui_pcshell_IsUndockedAssetAvailableFunc)(INT a1, INT64 a2, INT64 a3, const char* a4); INT64 twinui_pcshell_IsUndockedAssetAvailableHook(INT a1, INT64 a2, INT64 a3, const char* a4) { @@ -9936,7 +9958,11 @@ INT64 twinui_pcshell_CMultitaskingViewManager__CreateXamlMTVHostHook(INT64 _this return twinui_pcshell_CMultitaskingViewManager__CreateDCompMTVHostFunc(_this, a2, a3, a4, a5); return twinui_pcshell_CMultitaskingViewManager__CreateXamlMTVHostFunc(_this, a2, a3, a4, a5); } +#pragma endregion + +#pragma region "Fixes related to the removal of STTest feature flag (22621.2134+)" +#ifdef _WIN64 HRESULT(*twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMonitorFunc)(IInspectable* _this, HMONITOR hMonitor, float* outHeight); HRESULT twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMonitorHook(IInspectable* _this, HMONITOR hMonitor, float* outHeight) { @@ -9951,7 +9977,6 @@ HRESULT twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMo return twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMonitorFunc(_this, hMonitor, outHeight); } -#ifdef _WIN64 static struct { int coroInstance_rcOut; // 22621.1992: 0x10 @@ -10426,12 +10451,11 @@ BOOL Moment2PatchHardwareConfirmator(LPMODULEINFO mi) return TRUE; } #endif +#pragma endregion -BOOL IsDebuggerPresentHook() -{ - return FALSE; -} +#pragma region "Enable EP weather on Windows Server SKUs" +#ifdef _WIN64 BOOL PeopleBand_IsOS(DWORD dwOS) { if (dwOS == OS_ANYSERVER) return FALSE; @@ -10461,7 +10485,12 @@ BOOL explorer_IsOS(DWORD dwOS) } return IsOS(dwOS); } +#endif +#pragma endregion + +#pragma region "Find offsets of needed functions when symbols are not available" +#ifdef _WIN64 void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets) { // We read from the file instead of from memory because other tweak software might've modified the functions we're looking for @@ -10634,6 +10663,88 @@ void TryToFindTwinuiPCShellOffsets(DWORD* pOffsets) free(pFile); CloseHandle(hFile); } +#endif +#pragma endregion + + +#pragma region "Fix Pin to Start from Explorer not working when using Windows 10 start menu" +#ifdef _WIN64 +HRESULT(*AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc)(void** out); +HRESULT AppResolver_StartDocked_GetStartScreenManagerExtensionStatics(void** out) +{ + if (dwStartShowClassicMode) + { + // Keep the value of out as NULL and return S_OK to execute the old code + return S_OK; + } + return AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc(out); +} + +typedef struct CCacheShortcut CCacheShortcut; +extern HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(const CCacheShortcut* a2, const void* a3); +extern HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const CCacheShortcut* a2, const void* a3); + +void PatchAppResolver() +{ + HANDLE hAppResolver = LoadLibraryW(L"AppResolver.dll"); + MODULEINFO miAppResolver; + GetModuleInformation(GetCurrentProcess(), hAppResolver, &miAppResolver, sizeof(MODULEINFO)); + + // StartDocked::GetStartScreenManagerExtensionStatics + // 48 89 5C 24 ? 48 89 74 24 ? 55 57 41 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 37 ?? 8B F1 48 83 21 00 + PBYTE match = FindPattern( + hAppResolver, + miAppResolver.SizeOfImage, + "\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x55\x57\x41\x56\x48\x8D\x6C\x24\x00\x48\x81\xEC\x00\x00\x00\x00\x48\x8B\x05\x00\x00\x00\x00\x48\x33\xC4\x48\x89\x45\x37\x00\x8B\xF1\x48\x83\x21\x00", + "xxxx?xxxx?xxxxxxxx?xxx????xxx????xxxxxxx?xxxxxx" + ); + int rv = -1; + if (match) + { + AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc = match; + printf("StartDocked::GetStartScreenManagerExtensionStatics() = %llX\n", match - (PBYTE)hAppResolver); + rv = funchook_prepare( + funchook, + (void**)&AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc, + AppResolver_StartDocked_GetStartScreenManagerExtensionStatics + ); + } + if (rv != 0) + { + printf("Failed to hook StartDocked::GetStartScreenManagerExtensionStatics(). rv = %d\n", rv); + } + + // CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart() + // 8B ? 48 8B D3 E8 ? ? ? ? 48 8B 8D + // ^^^^^^^ + match = FindPattern( + hAppResolver, + miAppResolver.SizeOfImage, + "\x8B\x00\x48\x8B\xD3\xE8\x00\x00\x00\x00\x48\x8B\x8D", + "x?xxxx????xxx" + ); + rv = -1; + if (match) + { + match += 5; + match = match + 5 + *(int*)(match + 1); + AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc = match; + printf("CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart() = %llX\n", match - (PBYTE)hAppResolver); + extern HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const void* a2, const void* a3); + rv = funchook_prepare( + funchook, + (void**)&AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc, + AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart + ); + } + if (rv != 0) + { + printf("Failed to hook CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart(). rv = %d\n", rv); + } +} +#endif +#pragma endregion + DWORD Inject(BOOL bIsExplorer) { @@ -10663,10 +10774,10 @@ DWORD Inject(BOOL bIsExplorer) Explorer_RefreshUI(99); #ifdef _WIN64 - if (bIsExplorer) + // if (bIsExplorer) { funchook = funchook_create(); - printf("funchook create %d\n", funchook != 0); + // printf("funchook create %d\n", funchook != 0); } #endif @@ -10847,10 +10958,19 @@ DWORD Inject(BOOL bIsExplorer) if (!bIsExplorer) { - return; +#ifdef _WIN64 + rv = funchook_install(funchook, 0); + if (rv != 0) + { + printf("Failed to install hooks. rv = %d\n", rv); + } +#endif + return 0; } #ifdef _WIN64 + extern void InitializeWilLogCallback(); + InitializeWilLogCallback(); wprintf(L"Running on Windows %d, OS Build %d.%d.%d.%d.\n", IsWindows11() ? 11 : 10, global_rovi.dwMajorVersion, global_rovi.dwMinorVersion, global_rovi.dwBuildNumber, global_ubr); #endif @@ -10930,21 +11050,6 @@ DWORD Inject(BOOL bIsExplorer) printf("Loaded symbols\n"); } - RtlQueryFeatureConfigurationFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlQueryFeatureConfiguration"); - if (RtlQueryFeatureConfigurationFunc) { - rv = funchook_prepare( - funchook, - (void**)&RtlQueryFeatureConfigurationFunc, - RtlQueryFeatureConfigurationHook - ); - if (rv != 0) - { - FreeLibraryAndExitThread(hModule, rv); - return FALSE; - } - } - printf("Setup ntdll functions done\n"); - HANDLE hUser32 = LoadLibraryW(L"user32.dll"); CreateWindowInBand = GetProcAddress(hUser32, "CreateWindowInBand"); @@ -10985,10 +11090,13 @@ DWORD Inject(BOOL bIsExplorer) VnPatchIAT(hExplorer, "uxtheme.dll", "OpenThemeDataForDpi", explorer_OpenThemeDataForDpi); VnPatchIAT(hExplorer, "uxtheme.dll", "DrawThemeBackground", explorer_DrawThemeBackground); VnPatchIAT(hExplorer, "uxtheme.dll", "CloseThemeData", explorer_CloseThemeData); - // Fix Windows 10 taskbar high DPI button width bug if (IsWindows11()) { + // Fix Windows 10 taskbar high DPI button width bug VnPatchIAT(hExplorer, "api-ms-win-ntuser-sysparams-l1-1-0.dll", "GetSystemMetrics", patched_GetSystemMetrics); + + // Fix Pin to Start/Unpin from Start + PatchAppResolver(); } //VnPatchIAT(hExplorer, "api-ms-win-core-libraryloader-l1-2-0.dll", "LoadStringW", explorer_LoadStringWHook); if (bClassicThemeMitigations) @@ -11270,7 +11378,6 @@ DWORD Inject(BOOL bIsExplorer) #endif VnPatchIAT(hTwinuiPcshell, "API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL", "RegGetValueW", twinuipcshell_RegGetValueW); - //VnPatchIAT(hTwinuiPcshell, "api-ms-win-core-debug-l1-1-0.dll", "IsDebuggerPresent", IsDebuggerPresentHook); printf("Setup twinui.pcshell functions done\n"); @@ -11432,11 +11539,6 @@ DWORD Inject(BOOL bIsExplorer) printf("Setup shell32 functions done\n"); - HANDLE hExplorerFrame = GetModuleHandleW(L"ExplorerFrame.dll"); - VnPatchIAT(hExplorerFrame, "api-ms-win-core-com-l1-1-0.dll", "CoCreateInstance", ExplorerFrame_CoCreateInstanceHook); - printf("Setup explorerframe functions done\n"); - - HANDLE hWindowsStorage = LoadLibraryW(L"windows.storage.dll"); SHELL32_CanDisplayWin8CopyDialogFunc = GetProcAddress(hShell32, "SHELL32_CanDisplayWin8CopyDialog"); if (SHELL32_CanDisplayWin8CopyDialogFunc) VnPatchDelayIAT(hWindowsStorage, "ext-ms-win-shell-exports-internal-l1-1-0.dll", "SHELL32_CanDisplayWin8CopyDialog", SHELL32_CanDisplayWin8CopyDialogHook); @@ -11506,15 +11608,20 @@ DWORD Inject(BOOL bIsExplorer) ResetEvent(hEvent); }*/ - if (IsWindows11()) { - if (bOldTaskbar) { + if (IsWindows11()) + { + if (bOldTaskbar) + { CreateThread(0, 0, PlayStartupSound, 0, 0, 0); printf("Play startup sound thread...\n"); CreateThread(0, 0, SignalShellReady, dwExplorerReadyDelay, 0, 0); printf("Signal shell ready...\n"); - } else { + } + else + { CreateThread(0, 0, FixTaskbarAutohide, 0, 0, 0); - if (!IsWindows11Version22H2Build2361OrHigher()) { + if (IsWindows11Version23H2OrHigher()) + { RegDeleteKeyValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarGlomLevel"); RegDeleteKeyValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"MMTaskbarGlomLevel"); }