mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2024-11-27 17:00:59 +01:00
Start10: Revised the method of fixing Pin to Start/Unpin from Start
This commit is contained in:
parent
dca4057654
commit
29fda7935d
@ -155,6 +155,53 @@ extern "C" BOOL NeedsRo_SyncSettingsFromRegToCDS()
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace ABI::WindowsUdk::ApplicationModel::AppExtensions
|
||||||
|
{
|
||||||
|
enum AppExtensionOptions {};
|
||||||
|
|
||||||
|
MIDL_INTERFACE("836da1ed-5be8-5365-8452-6af327aa427b")
|
||||||
|
IExtensionFactoryStatics : public IInspectable
|
||||||
|
{
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE IsExtensionAvailable(HSTRING, HSTRING, bool*) = 0;
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE IsExtensionAvailableWithOptions(HSTRING, HSTRING, AppExtensionOptions, bool*) = 0;
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetInstance(HSTRING, HSTRING, IInspectable**) = 0;
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetInstanceWithOptions(HSTRING, HSTRING, AppExtensionOptions, IInspectable**) = 0;
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetFactory(HSTRING, HSTRING, IInspectable**) = 0;
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE GetFactoryWithOptions(HSTRING, HSTRING, AppExtensionOptions, IInspectable**) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class DummyExtensionFactory : ABI::WindowsUdk::ApplicationModel::AppExtensions::IExtensionFactoryStatics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HRESULT QueryInterface(REFIID riid, void** ppvObject) override { return E_NOINTERFACE; }
|
||||||
|
ULONG AddRef() override { return 1; }
|
||||||
|
ULONG Release() override { return 1; }
|
||||||
|
HRESULT GetIids(ULONG* iidCount, IID** iids) override { return E_NOTIMPL; }
|
||||||
|
HRESULT GetRuntimeClassName(HSTRING* className) override { return E_NOTIMPL; }
|
||||||
|
HRESULT GetTrustLevel(TrustLevel* trustLevel) override { return E_NOTIMPL; }
|
||||||
|
|
||||||
|
// Keep the value of result as zero (set by the caller) and return S_OK to make the Windows 10 code run
|
||||||
|
HRESULT IsExtensionAvailable(HSTRING, HSTRING, bool*) override { return S_OK; }
|
||||||
|
HRESULT IsExtensionAvailableWithOptions(HSTRING, HSTRING, ABI::WindowsUdk::ApplicationModel::AppExtensions::AppExtensionOptions, bool*) override { return S_OK; }
|
||||||
|
HRESULT GetInstance(HSTRING, HSTRING, IInspectable**) override { return S_OK; }
|
||||||
|
HRESULT GetInstanceWithOptions(HSTRING, HSTRING, ABI::WindowsUdk::ApplicationModel::AppExtensions::AppExtensionOptions, IInspectable**) override { return S_OK; }
|
||||||
|
HRESULT GetFactory(HSTRING, HSTRING, IInspectable**) override { return S_OK; }
|
||||||
|
HRESULT GetFactoryWithOptions(HSTRING, HSTRING, ABI::WindowsUdk::ApplicationModel::AppExtensions::AppExtensionOptions, IInspectable**) override { return S_OK; }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DummyExtensionFactory instanceof_WindowsUdk_ApplicationModel_AppExtensions_IExtensionFactoryStatics;
|
||||||
|
|
||||||
|
extern "C" HRESULT AppResolver_StartTileData_RoGetActivationFactory(HSTRING activatableClassId, REFIID iid, void** factory)
|
||||||
|
{
|
||||||
|
if (IsEqualGUID(iid, __uuidof(ABI::WindowsUdk::ApplicationModel::AppExtensions::IExtensionFactoryStatics)))
|
||||||
|
{
|
||||||
|
*factory = const_cast<DummyExtensionFactory*>(&instanceof_WindowsUdk_ApplicationModel_AppExtensions_IExtensionFactoryStatics);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
return RoGetActivationFactory(activatableClassId, iid, factory);
|
||||||
|
}
|
||||||
|
|
||||||
namespace ABI::WindowsInternal::Shell::UnifiedTile
|
namespace ABI::WindowsInternal::Shell::UnifiedTile
|
||||||
{
|
{
|
||||||
MIDL_INTERFACE("d3653510-4fff-4bfa-905b-ea038b142fa5")
|
MIDL_INTERFACE("d3653510-4fff-4bfa-905b-ea038b142fa5")
|
||||||
@ -284,18 +331,17 @@ namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections
|
|||||||
|
|
||||||
struct CCacheShortcut
|
struct CCacheShortcut
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
const wchar_t* GetAppID(const void* a2) const
|
const wchar_t* GetAppID(const void* a2) const
|
||||||
{
|
{
|
||||||
DWORD dwOffset = *((DWORD*)this + 11); // Same offset in Windows 10 and 11
|
DWORD dwOffset = *(DWORD*)((PBYTE)this + 44); // Same offset in Windows 10 and 11
|
||||||
return dwOffset != -1 ? (wchar_t*)((char*)a2 + dwOffset) : nullptr;
|
return dwOffset != -1 ? (wchar_t*)((char*)a2 + dwOffset) : nullptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(const CCacheShortcut* a2, const void* a3);
|
HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(void* _this, const CCacheShortcut* a2, const void* a3);
|
||||||
HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const CCacheShortcut* a2, const void* a3)
|
HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(void* _this, const CCacheShortcut* a2, const void* a3)
|
||||||
{
|
{
|
||||||
using namespace ABI::WindowsInternal::Shell::UnifiedTile;
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile;
|
||||||
using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private;
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private;
|
||||||
@ -303,7 +349,7 @@ HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const
|
|||||||
|
|
||||||
if (!dwStartShowClassicMode)
|
if (!dwStartShowClassicMode)
|
||||||
{
|
{
|
||||||
return AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc(a2, a3);
|
return AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc(_this, a2, a3);
|
||||||
}
|
}
|
||||||
|
|
||||||
Microsoft::WRL::ComPtr<IWin32UnifiedTileIdentifierFactory> pTileIdentifierFactory;
|
Microsoft::WRL::ComPtr<IWin32UnifiedTileIdentifierFactory> pTileIdentifierFactory;
|
||||||
|
@ -10602,37 +10602,11 @@ cleanup:
|
|||||||
|
|
||||||
#pragma region "Fix Pin to Start from Explorer not working when using Windows 10 start menu"
|
#pragma region "Fix Pin to Start from Explorer not working when using Windows 10 start menu"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
HRESULT(*AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc)(void** out);
|
extern HRESULT AppResolver_StartTileData_RoGetActivationFactory(HSTRING activatableClassId, REFIID iid, void** factory);
|
||||||
HRESULT(*StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc)(void** out);
|
|
||||||
HRESULT StartDocked_GetStartScreenManagerExtensionStaticsHook(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;
|
typedef struct CCacheShortcut CCacheShortcut;
|
||||||
extern HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(const CCacheShortcut* a2, const void* a3);
|
extern HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(void* _this, const CCacheShortcut* a2, const void* a3);
|
||||||
extern HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(const CCacheShortcut* a2, const void* a3);
|
extern HRESULT AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStart(void* _this, const CCacheShortcut* a2, const void* a3);
|
||||||
|
|
||||||
static void FindGetStartScreenManagerExtensionStatics(const MODULEINFO* pModuleInfo, HRESULT(**ppfnOut)(void**))
|
|
||||||
{
|
|
||||||
// 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(
|
|
||||||
pModuleInfo->lpBaseOfDll,
|
|
||||||
pModuleInfo->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"
|
|
||||||
);
|
|
||||||
if (match)
|
|
||||||
{
|
|
||||||
*ppfnOut = match;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PatchAppResolver()
|
static void PatchAppResolver()
|
||||||
{
|
{
|
||||||
@ -10640,11 +10614,7 @@ static void PatchAppResolver()
|
|||||||
MODULEINFO miAppResolver;
|
MODULEINFO miAppResolver;
|
||||||
GetModuleInformation(GetCurrentProcess(), hAppResolver, &miAppResolver, sizeof(MODULEINFO));
|
GetModuleInformation(GetCurrentProcess(), hAppResolver, &miAppResolver, sizeof(MODULEINFO));
|
||||||
|
|
||||||
FindGetStartScreenManagerExtensionStatics(&miAppResolver, &AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc);
|
VnPatchDelayIAT(hAppResolver, "api-ms-win-core-winrt-l1-1-0.dll", "RoGetActivationFactory", AppResolver_StartTileData_RoGetActivationFactory);
|
||||||
if (AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc)
|
|
||||||
{
|
|
||||||
printf("AppResolver.dll!StartDocked::GetStartScreenManagerExtensionStatics() = %llX\n", (PBYTE)AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc - (PBYTE)hAppResolver);
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart()
|
// CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart()
|
||||||
// 8B ? 48 8B D3 E8 ? ? ? ? 48 8B 8D
|
// 8B ? 48 8B D3 E8 ? ? ? ? 48 8B 8D
|
||||||
@ -10675,49 +10645,14 @@ static void PatchAppResolver()
|
|||||||
if (rv != 0)
|
if (rv != 0)
|
||||||
{
|
{
|
||||||
printf("Failed to hook CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart(). rv = %d\n", rv);
|
printf("Failed to hook CAppResolverCacheBuilder::_AddUserPinnedShortcutToStart(). rv = %d\n", rv);
|
||||||
return; // Must be hooked properly otherwise our GetStartScreenManagerExtensionStatics hook will make it crash
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = -1;
|
|
||||||
if (AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc)
|
|
||||||
{
|
|
||||||
rv = funchook_prepare(
|
|
||||||
funchook,
|
|
||||||
(void**)&AppResolver_StartDocked_GetStartScreenManagerExtensionStaticsFunc,
|
|
||||||
StartDocked_GetStartScreenManagerExtensionStaticsHook
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (rv != 0)
|
|
||||||
{
|
|
||||||
printf("Failed to hook AppResolver.dll!StartDocked::GetStartScreenManagerExtensionStatics(). rv = %d\n", rv);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PatchStartTileData()
|
static void PatchStartTileData()
|
||||||
{
|
{
|
||||||
HANDLE hStartTileData = LoadLibraryW(L"StartTileData.dll");
|
HANDLE hStartTileData = LoadLibraryW(L"StartTileData.dll");
|
||||||
MODULEINFO miStartTileData;
|
|
||||||
GetModuleInformation(GetCurrentProcess(), hStartTileData, &miStartTileData, sizeof(MODULEINFO));
|
|
||||||
|
|
||||||
FindGetStartScreenManagerExtensionStatics(&miStartTileData, &StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc);
|
VnPatchIAT(hStartTileData, "api-ms-win-core-winrt-l1-1-0.dll", "RoGetActivationFactory", AppResolver_StartTileData_RoGetActivationFactory);
|
||||||
if (StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc)
|
|
||||||
{
|
|
||||||
printf("StartTileData.dll!StartDocked::GetStartScreenManagerExtensionStatics() = %llX\n", (PBYTE)StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc - (PBYTE)hStartTileData);
|
|
||||||
}
|
|
||||||
|
|
||||||
int rv = -1;
|
|
||||||
if (StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc)
|
|
||||||
{
|
|
||||||
rv = funchook_prepare(
|
|
||||||
funchook,
|
|
||||||
(void**)&StartTileData_StartDocked_GetStartScreenManagerExtensionStaticsFunc,
|
|
||||||
StartDocked_GetStartScreenManagerExtensionStaticsHook
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (rv != 0)
|
|
||||||
{
|
|
||||||
printf("Failed to hook StartTileData.dll!StartDocked::GetStartScreenManagerExtensionStatics(). rv = %d\n", rv);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
Loading…
Reference in New Issue
Block a user