You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1305 lines
58 KiB
1305 lines
58 KiB
#include "utility.h" |
|
#include "hooking.h" |
|
|
|
#include <windows.h> |
|
#include <windows.system.h> |
|
#include <windows.ui.shell.h> |
|
#include <winrt/windows.foundation.collections.h> |
|
#include <winrt/windows.system.h> |
|
#include <wil/winrt.h> |
|
#pragma comment(lib, "Psapi.lib") |
|
|
|
using namespace Microsoft::WRL; |
|
|
|
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<winrt::guid> GlobalStartData_GetPlacesFromRegistry() |
|
{ |
|
std::vector<winrt::guid> places; |
|
|
|
DWORD dwSize; |
|
LSTATUS lRes = RegGetValueW( |
|
HKEY_CURRENT_USER, |
|
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Start", |
|
L"VisiblePlaces", |
|
RRF_RT_REG_BINARY, |
|
nullptr, |
|
nullptr, |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS || dwSize == 0) |
|
return places; |
|
|
|
places.resize(dwSize / sizeof(winrt::guid)); |
|
lRes = RegGetValueW( |
|
HKEY_CURRENT_USER, |
|
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Start", |
|
L"VisiblePlaces", |
|
RRF_RT_REG_BINARY, |
|
nullptr, |
|
places.data(), |
|
&dwSize |
|
); |
|
if (lRes != ERROR_SUCCESS) |
|
places.clear(); |
|
|
|
return places; |
|
} |
|
|
|
namespace ABI::WindowsInternal::Shell::CDSProperties |
|
{ |
|
interface IStartGlobalProperties; |
|
|
|
MIDL_INTERFACE("2c670963-f8a9-4bbb-9adf-683a3a89537e") |
|
IStartGlobalPropertiesFactory : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE Create(Windows::System::IUser* user, IStartGlobalProperties** result) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("ee807266-a2db-4c9a-a1b4-970d33f99c91") |
|
IStartGlobalProperties : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_FullScreenMode(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_FullScreenMode(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_HideAppList(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_HideAppList(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_HideRecentList(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_HideRecentList(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_HideFrequentList(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_HideFrequentList(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_StartMenuRelativeHeightPixels(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_StartMenuRelativeHeightPixels(UINT) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_PlacesInitialized(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_PlacesInitialized(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_PlacesInitializedVersion(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_PlacesInitializedVersion(UINT) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetVisiblePlaces(Windows::Foundation::Collections::IVectorView<GUID>**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE SetVisiblePlaces(Windows::Foundation::Collections::IVectorView<GUID>*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_StartViewRestoring(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_StartViewRestoring(BOOLEAN) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE add_PropertiesChanged( |
|
/*Windows::Foundation::ITypedEventHandler< |
|
StartGlobalProperties*, |
|
StartGlobalPropertiesChangedArgs* |
|
>*, |
|
EventRegistrationToken**/ |
|
) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE remove_PropertiesChanged(EventRegistrationToken) = 0; |
|
}; |
|
|
|
enum ExtendedReconciliationRequirements |
|
{ |
|
}; |
|
} |
|
|
|
extern "C" BOOL NeedsRo_SyncSettingsFromRegToCDS() |
|
{ |
|
winrt::com_ptr<ABI::WindowsInternal::Shell::CDSProperties::IStartGlobalPropertiesFactory> global_properties_factory; |
|
winrt::param::hstring hstr = L"WindowsInternal.Shell.CDSProperties.StartGlobalProperties"; |
|
HRESULT hr = RoGetActivationFactory( |
|
*(HSTRING*)&hstr, |
|
__uuidof(ABI::WindowsInternal::Shell::CDSProperties::IStartGlobalPropertiesFactory), |
|
global_properties_factory.put_void() |
|
); |
|
if (FAILED(hr)) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
winrt::Windows::System::User user = winrt::Windows::System::User::FindAllAsync().get().GetAt(0); |
|
winrt::com_ptr<ABI::WindowsInternal::Shell::CDSProperties::IStartGlobalProperties> start_global_properties; |
|
hr = global_properties_factory->Create(user.as<ABI::Windows::System::IUser>().get(), start_global_properties.put()); |
|
if (FAILED(hr)) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
DWORD dwValue, dwSize; |
|
|
|
// ShowFrequentList |
|
dwValue = 0; // Default off |
|
dwSize = sizeof(DWORD); |
|
RegGetValueW( |
|
HKEY_CURRENT_USER, |
|
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Start", |
|
L"ShowFrequentList", |
|
RRF_RT_REG_DWORD, |
|
nullptr, |
|
&dwValue, |
|
&dwSize |
|
); |
|
start_global_properties->put_HideFrequentList(!dwValue); |
|
|
|
// ShowRecentList |
|
dwValue = 1; // Default on |
|
dwSize = sizeof(DWORD); |
|
RegGetValueW( |
|
HKEY_CURRENT_USER, |
|
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Start", |
|
L"ShowRecentList", |
|
RRF_RT_REG_DWORD, |
|
nullptr, |
|
&dwValue, |
|
&dwSize |
|
); |
|
start_global_properties->put_HideRecentList(!dwValue); |
|
|
|
// VisiblePlaces |
|
auto places_view = single_threaded_vector<winrt::guid>(GlobalStartData_GetPlacesFromRegistry()).GetView(); |
|
start_global_properties->SetVisiblePlaces(places_view.as<ABI::Windows::Foundation::Collections::IVectorView<GUID>>().get()); |
|
|
|
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 (dwStartShowClassicMode && 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::Windows::Internal::ApplicationModel |
|
{ |
|
namespace WindowManagement |
|
{ |
|
struct WindowId |
|
{ |
|
UINT Value; |
|
}; |
|
} |
|
|
|
MIDL_INTERFACE("1223aea2-547b-4d03-9e6c-388a4307a07e") |
|
IPinnableSurface : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE CanPinTile(HSTRING, ABI::Windows::UI::StartScreen::ISecondaryTile*, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE RequestPinTile(HSTRING, HSTRING, Windows::UI::StartScreen::ISecondaryTile*, ABI::Windows::Internal::ApplicationModel::WindowManagement::WindowId, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE PinTile(HSTRING, ABI::Windows::UI::StartScreen::ISecondaryTile*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE IsTilePinned(HSTRING, HSTRING, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE CanUnpinTile(HSTRING, HSTRING, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE UnpinTile(HSTRING, HSTRING) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("f27684e4-e634-4807-be9a-4838381fcbfc") |
|
IPinnableSurfaceFactory : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE GetCurrent(IPinnableSurface**); |
|
}; |
|
} |
|
|
|
namespace ABI::Windows::Internal::UI::StartScreen |
|
{ |
|
enum SecondaryTileCreationBehaviors |
|
{ |
|
SecondaryTileCreationBehaviors_None = 0x0, |
|
SecondaryTileCreationBehaviors_SuppressPinToStart = 0x1, |
|
SecondaryTileCreationBehaviors_SuppressBackgroundPolicyCheck = 0x2, |
|
SecondaryTileCreationBehaviors_SuppressPinRequest = 0x4, |
|
}; |
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(SecondaryTileCreationBehaviors); |
|
|
|
MIDL_INTERFACE("2d7f0d3b-ec36-463b-9f69-d7238d77c122") |
|
ISecondaryTilePrivate : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE PopulateIdentity(HSTRING) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE SetTileCreationBehaviors(SecondaryTileCreationBehaviors) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE RefreshPropertiesFromPrimaryTile() = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetUniqueId(GUID*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetDefaultTileSize(ABI::Windows::UI::StartScreen::TileSize*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetAppUserModelId(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE ValidatePropertiesForCreate() = 0; |
|
virtual HRESULT STDMETHODCALLTYPE CreateInTileStore() = 0; |
|
}; |
|
} |
|
|
|
namespace ABI::WindowsInternal::Shell::UnifiedTile |
|
{ |
|
enum UnifiedTileIdentifierKind |
|
{ |
|
UnifiedTileIdentifierKind_Unknown = 0x0, |
|
UnifiedTileIdentifierKind_Packaged = 0x1, |
|
UnifiedTileIdentifierKind_Win32 = 0x2, |
|
UnifiedTileIdentifierKind_TargetedContent = 0x3, |
|
}; |
|
|
|
MIDL_INTERFACE("d3653510-4fff-4bfa-905b-ea038b142fa5") |
|
IUnifiedTileIdentifier : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_Kind(UnifiedTileIdentifierKind*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_SerializedIdentifier(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_NotificationId(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_TelemetryId(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE IsEqual(IUnifiedTileIdentifier*, BOOLEAN*) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("ec3e7864-aaab-4367-9c63-94d289545500") |
|
IPackagedUnifiedTileIdentifierFactory : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE Create(HSTRING, IUnifiedTileIdentifier**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE CreateWithTileId(HSTRING, HSTRING, IUnifiedTileIdentifier**) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("87a52467-266a-4b20-a2c8-e316bfbaf64a") |
|
IUnifiedTileIdentifierStatics : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE DeserializeIdentifier(HSTRING, IUnifiedTileIdentifier**) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("0e7735be-a965-44a6-a75f-54b8bcd67bec") |
|
IWin32UnifiedTileIdentifierFactory : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE Create(HSTRING, IUnifiedTileIdentifier**) = 0; |
|
}; |
|
|
|
interface IVisualTileInfo; |
|
interface ILargeFormatVisualTileInfo; |
|
interface IEnterpriseDataProtectionTileInfo; |
|
interface IAppUsageInfo; |
|
interface IAppLifecycleInfo; |
|
|
|
MIDL_INTERFACE("861778d6-ac6c-456f-bd3c-32ab601245e1") |
|
IWin32ShortcutInfo : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_IsTargetFolder(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_TargetPath(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_ShortcutArguments(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_IsUserPinnedShortcut(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_IsManifested(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_PreventPinning(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_SuiteName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_SuiteSortName(HSTRING*) = 0; |
|
}; |
|
|
|
interface IPackagedAppTileInfo; |
|
interface ISuggestionTileInfo; |
|
interface IMixedRealityTileInfo; |
|
interface ITileActivationContext; |
|
interface IVerbSource; |
|
|
|
MIDL_INTERFACE("65b4e03e-a32e-40cf-8bab-b2d9c5287307") |
|
IUnifiedTile : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_Id(IUnifiedTileIdentifier**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_VisualTileInfo(IVisualTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_LargeFormatVisualTileInfo(ILargeFormatVisualTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_EnterpriseDataProtectionTileInfo(IEnterpriseDataProtectionTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_AppUsageInfo(IAppUsageInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_AppLifecycleInfo(IAppLifecycleInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_Win32ShortcutInfo(IWin32ShortcutInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_PackagedAppTileInfo(IPackagedAppTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_SuggestionTileInfo(ISuggestionTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_MixedRealityTileInfo(IMixedRealityTileInfo**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE ActivateAsync(ABI::Windows::Foundation::IAsyncAction**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE ActivateWithContextAsync(ITileActivationContext*, ABI::Windows::Foundation::IAsyncAction**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_Verbs(IVerbSource**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE add_TileChanged(void*, EventRegistrationToken*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE remove_TileChanged(EventRegistrationToken) = 0; |
|
}; |
|
|
|
namespace CuratedTileCollections |
|
{ |
|
interface ICuratedTileCollection; |
|
interface ICuratedTileGroup; |
|
} |
|
|
|
MIDL_INTERFACE("abaabd17-2d4e-43f0-b43c-60e699a32341") |
|
IUnifiedTileCollection : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_CollectionId(HSTRING*); |
|
virtual HRESULT STDMETHODCALLTYPE GetAllTilesRecursive(void**); |
|
virtual HRESULT STDMETHODCALLTYPE get_CuratedCollectionInfo(CuratedTileCollections::ICuratedTileCollection**); |
|
}; |
|
|
|
interface ICuratedCollectionBatch; |
|
|
|
MIDL_INTERFACE("6fe03efc-a8af-4faf-9c23-bc0cb5bf29d3") |
|
ITileCollectionContainer : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_Id(GUID*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetContainers(void**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetTiles(void**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_DisplayName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_SortName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_ParentContainer(ITileCollectionContainer**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_CuratedGroupInfo(CuratedTileCollections::ICuratedTileGroup**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE CreateCuratedCollectionBatch(ICuratedCollectionBatch**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE add_ContentsChanged(void*, EventRegistrationToken*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE remove_ContentsChanged(EventRegistrationToken) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE add_PropertyChanged(void*, EventRegistrationToken*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE remove_PropertyChanged(EventRegistrationToken) = 0; |
|
}; |
|
|
|
enum CollectionProvider |
|
{ |
|
CollectionProvider_AllTilesCollection = 0, |
|
CollectionProvider_AppsListCollection = 1, |
|
CollectionProvider_CuratedTileCollection = 2, |
|
CollectionProvider_FlatAppsListCollection = 3, |
|
CollectionProvider_FlatAppsListWithSecondaryAndUserPinnedTilesCollection = 4, |
|
}; |
|
|
|
enum CollectionOptions |
|
{ |
|
CollectionOptions_None = 0x0, |
|
CollectionOptions_IncludeTombstones = 0x1, |
|
CollectionOptions_UpdatedItemsOnly = 0x2, |
|
}; |
|
|
|
// typedef ABI::Windows::Internal::Storage::Cloud::CollectionOptions CollectionOptions; |
|
|
|
MIDL_INTERFACE("1048dc30-f4f7-4ff4-970e-5058ca17cc26") |
|
IUnifiedTileManager : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE GetTransformer(GUID, IInspectable**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetCollection(CollectionProvider, HSTRING, IUnifiedTileCollection**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetCollectionWithOptions(CollectionProvider, HSTRING, CollectionOptions, IUnifiedTileCollection**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE FindTile(IUnifiedTileIdentifier*, IUnifiedTile**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE WaitForDataStoreReconciliationCompleteAsync(ABI::Windows::Foundation::IAsyncAction**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE WaitForSecondaryDataReconciliationCompleteAsync(ABI::Windows::Foundation::IAsyncAction**) = 0; |
|
}; |
|
|
|
interface ICollectionTile; |
|
interface IContentsChangedEventArgs; |
|
|
|
enum TileVerbFlags |
|
{ |
|
TileVerbFlags_None = 0x0, |
|
TileVerbFlags_CanExecute = 0x1, |
|
TileVerbFlags_IsMetadata = 0x2, |
|
TileVerbFlags_IsGroup = 0x4, |
|
TileVerbFlags_IsSeparator = 0x8, |
|
TileVerbFlags_IsDefault = 0x10, |
|
}; |
|
|
|
DEFINE_ENUM_FLAG_OPERATORS(TileVerbFlags); |
|
|
|
MIDL_INTERFACE("e98fc955-cda1-4ae8-ae08-292531bc6bb2") |
|
IVerbExecutionArgs : IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_Position(void**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_Position(void*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_KeyModifiers(ABI::Windows::System::VirtualKeyModifiers*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_KeyModifiers(ABI::Windows::System::VirtualKeyModifiers) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE SetCallerWindow(ABI::Windows::UI::Core::ICoreWindow*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_CallerWindowId(unsigned int*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_CallerWindowId(unsigned int) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("f9ad7985-244a-4e61-8ba2-55a3f5e1c665") |
|
ITileVerb : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_VerbProviderId(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_GroupPath(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_CanonicalName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_DisplayName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_Glyph(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_GlyphFontFamily(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_AccessKey(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_ShortcutText(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_Flags(TileVerbFlags*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE Execute(IVerbExecutionArgs*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE ExecuteAsync(IVerbExecutionArgs*, ABI::Windows::Foundation::IAsyncOperation<bool>**) = 0; |
|
}; |
|
|
|
enum VerbEnumerationOptions |
|
{ |
|
VerbEnumerationOptions_None = 0x0, |
|
VerbEnumerationOptions_ExcludeNonExecutable = 0x1, |
|
VerbEnumerationOptions_ExcludeResources = 0x2, |
|
VerbEnumerationOptions_IncludeExtendedVerbs = 0x4, |
|
}; |
|
|
|
MIDL_INTERFACE("a9d9c0b6-c84b-4010-8202-7c23b17dc148") |
|
IVerbEnumerationArgs : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_Options(VerbEnumerationOptions*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_Options(VerbEnumerationOptions) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_VerbProviderId(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_VerbProviderId(HSTRING) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_GroupPathPrefix(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_GroupPathPrefix(HSTRING) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_VerbCanonicalName(HSTRING*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_VerbCanonicalName(HSTRING) = 0; |
|
}; |
|
} |
|
|
|
namespace ABI::WindowsInternal::Shell::UnifiedTile::Private |
|
{ |
|
MIDL_INTERFACE("0083831c-82d6-4e8f-bcc2-a8ac2691be49") |
|
IUnifiedTileUserPinHelperStatics : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE CreateUserPinnedShortcutTile(IUnifiedTileIdentifier*) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("7813d04d-61d5-40e7-8d6d-781c5603a891") |
|
ITileContainerPrivate : public IInspectable |
|
{ |
|
virtual void* STDMETHODCALLTYPE GetGroups(void* retstr) = 0; |
|
virtual void* STDMETHODCALLTYPE GetTiles(void* retstr) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetContainer(const GUID*, ITileCollectionContainer**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE AddContainer(ITileCollectionContainer*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE RemoveContainer(const GUID*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetTile(const GUID*, ICollectionTile**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE AddTile(ICollectionTile*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE RemoveTile(const GUID*) = 0; |
|
virtual bool STDMETHODCALLTYPE TryFindTileByUnifiedTileIdRecursive(IUnifiedTileIdentifier*, ICollectionTile**, ITileCollectionContainer**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE InvokeContentsChangedEventSource(IContentsChangedEventArgs*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE InvokePropertiesChangedEventSource(IInspectable*) = 0; |
|
}; |
|
|
|
enum UnifiedTileKind |
|
{ |
|
}; |
|
|
|
MIDL_INTERFACE("de10b7d8-bebd-4599-925d-759462d1c1b1") |
|
IUnifiedTilePrivate : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE get_IsVisibleInAppList(BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_Kind(UnifiedTileKind*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_ExtendedReconciliationRequirements(ABI::WindowsInternal::Shell::CDSProperties::ExtendedReconciliationRequirements*) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("3b8c9be7-fc8c-42e2-a6b5-7005aa719c35") |
|
IVerbEnumerationArgsPrivate : public IInspectable |
|
{ |
|
virtual HRESULT STDMETHODCALLTYPE IsMatchingVerbProviderId(HSTRING, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE IsMatchingGroupPath(HSTRING, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE IsMatchingVerbCanonicalName(HSTRING, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_User(ABI::Windows::System::IUser**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_User(ABI::Windows::System::IUser*) = 0; |
|
}; |
|
} |
|
|
|
namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections |
|
{ |
|
enum CollectionAttributes {}; |
|
enum PackageStatusChangeType {}; |
|
enum StartCollectionCustomizationRestrictionType {}; |
|
|
|
enum TilePinSize |
|
{ |
|
TilePinSize_Tile2x2 = 0, |
|
TilePinSize_Tile4x2 = 1, |
|
}; |
|
|
|
namespace DataStoreCache::CuratedTileCollectionTransformer |
|
{ |
|
class CuratedTile; |
|
} |
|
|
|
MIDL_INTERFACE("354cba6d-19ab-490c-97b6-8d4d9862e052") |
|
ICuratedTileGroup : public IInspectable |
|
{ |
|
}; |
|
|
|
MIDL_INTERFACE("bb4b31ed-0705-432e-bf3d-24bf54bee10d") |
|
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(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_Version(UINT) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetGroups(Windows::Foundation::Collections::IMapView<GUID, ICuratedTileGroup*>**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetTiles(Windows::Foundation::Collections::IMapView<GUID, ICuratedTile*>**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE GetAllTilesInCollection(Windows::Foundation::Collections::IMapView<GUID, ICuratedTile*>**) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE DoesCollectionContainTile(IUnifiedTileIdentifier*, ICuratedTile**, BOOLEAN*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE FindTileAndParentGroup(IUnifiedTileIdentifier*, ICuratedTile**, ICuratedTileGroup**, BOOLEAN*) = 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, BOOLEAN*) = 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<DataStoreCache::CuratedTileCollectionTransformer::CuratedTile>, 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) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE PinToStartAtLocation(IUnifiedTileIdentifier*, ICuratedTileGroup*, Windows::Foundation::Point, Windows::Foundation::Size) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE UnpinFromStart(IUnifiedTileIdentifier*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE ReplaceTinyOrMediumTile(IUnifiedTileIdentifier*, IUnifiedTileIdentifier*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_LastGroupId(GUID*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_LastGroupId(GUID) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_CustomizationRestriction(StartCollectionCustomizationRestrictionType*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_CustomizationRestriction(StartCollectionCustomizationRestrictionType) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_GroupCellWidth(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_GroupCellWidth(UINT) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_PreferredColumnCount(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_PreferredColumnCount(UINT) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE get_CurrentColumnCount(UINT*) = 0; |
|
virtual HRESULT STDMETHODCALLTYPE put_CurrentColumnCount(UINT) = 0; |
|
}; |
|
|
|
MIDL_INTERFACE("a680369c-0862-41a0-b7cd-bb35e3c497eb") |
|
ICuratedTileCollectionOptions : public IInspectable |
|
{ |
|
}; |
|
|
|
MIDL_INTERFACE("899ee71b-5c01-438f-b12e-61d49f6b4083") |
|
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, BOOLEAN*) = 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; |
|
}; |
|
} |
|
|
|
#if 0 |
|
HRESULT StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__GetUnifiedIdentifierForAumid( |
|
void* _this, |
|
const WCHAR* pszAumid, |
|
const WCHAR* pszTileId, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTileIdentifier** out) |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
|
|
ComPtr<IUnifiedTileIdentifierStatics> pUnifiedTileIdentifierStatics; |
|
RETURN_IF_FAILED(RoGetActivationFactory( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.UnifiedTileIdentifier").Get(), |
|
IID_PPV_ARGS(&pUnifiedTileIdentifierStatics) |
|
)); |
|
|
|
ComPtr<IPackagedUnifiedTileIdentifierFactory> pPackagedUnifiedTileIdentifierFactory; |
|
RETURN_IF_FAILED(pUnifiedTileIdentifierStatics.As(&pPackagedUnifiedTileIdentifierFactory)); |
|
|
|
ComPtr<IUnifiedTileIdentifier> pUnifiedTileIdentifier; |
|
RETURN_IF_FAILED(pPackagedUnifiedTileIdentifierFactory->CreateWithTileId( |
|
Wrappers::HStringReference(pszAumid).Get(), |
|
Wrappers::HStringReference(pszTileId).Get(), |
|
&pUnifiedTileIdentifier |
|
)); |
|
|
|
*out = pUnifiedTileIdentifier.Detach(); |
|
return S_OK; |
|
} |
|
|
|
HRESULT (*StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTileFunc)( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
ABI::Windows::UI::StartScreen::ISecondaryTile* tile); |
|
|
|
HRESULT StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTile( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
ABI::Windows::UI::StartScreen::ISecondaryTile* tile) |
|
{ |
|
using namespace ABI::Windows::UI::StartScreen; |
|
using namespace ABI::Windows::Internal::UI::StartScreen; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; |
|
|
|
if (!dwStartShowClassicMode) |
|
return StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTileFunc(_this, hstrAumid, tile); |
|
|
|
/*if (RtlIsMultiUsersInSessionSku()) |
|
return S_OK;*/ |
|
|
|
Wrappers::HString hstrTileId; |
|
if (tile) |
|
{ |
|
RETURN_IF_FAILED(tile->get_TileId(hstrTileId.ReleaseAndGetAddressOf())); |
|
} |
|
|
|
ComPtr<IUnifiedTileIdentifier> pUnifiedTileIdentifier; |
|
RETURN_IF_FAILED(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__GetUnifiedIdentifierForAumid( |
|
_this, |
|
WindowsGetStringRawBuffer(hstrAumid, nullptr), |
|
hstrTileId.GetRawBuffer(nullptr), |
|
&pUnifiedTileIdentifier |
|
)); |
|
|
|
// Windows 10 start menu-specific code begins here |
|
ComPtr<ICuratedTileCollectionManager> pTileCollectionManager; |
|
RETURN_IF_FAILED(RoActivateInstance( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), |
|
&pTileCollectionManager |
|
)); |
|
|
|
ComPtr<ICuratedTileCollection> pTileCollection; |
|
RETURN_IF_FAILED(pTileCollectionManager->GetCollection( |
|
Wrappers::HStringReference(L"Start.TileGrid").Get(), |
|
&pTileCollection |
|
)); |
|
|
|
ComPtr<IStartTileCollection> pStartTileCollection; |
|
RETURN_IF_FAILED(pTileCollection.As(&pStartTileCollection)); |
|
|
|
TileSize defaultTileSize = TileSize_Square150x150; |
|
if (tile) |
|
{ |
|
ComPtr<ISecondaryTilePrivate> pSecondaryTilePrivate; |
|
RETURN_IF_FAILED(tile->QueryInterface(IID_PPV_ARGS(&pSecondaryTilePrivate))); |
|
RETURN_IF_FAILED(pSecondaryTilePrivate->GetDefaultTileSize(&defaultTileSize)); |
|
} |
|
|
|
RETURN_IF_FAILED(pStartTileCollection->PinToStart( |
|
pUnifiedTileIdentifier.Get(), |
|
defaultTileSize == TileSize_Wide310x150 ? TilePinSize_Tile4x2 : TilePinSize_Tile2x2 |
|
)); |
|
|
|
return S_OK; |
|
} |
|
|
|
HRESULT (*StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinnedFunc)( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
HSTRING hstrTileId, |
|
BOOLEAN* out); |
|
|
|
HRESULT StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinned( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
HSTRING hstrTileId, |
|
BOOLEAN* out) |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; |
|
|
|
if (!dwStartShowClassicMode) |
|
return StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinnedFunc(_this, hstrAumid, hstrTileId, out); |
|
|
|
*out = FALSE; |
|
|
|
/*if (RtlIsMultiUsersInSessionSku()) |
|
return S_OK;*/ |
|
|
|
// Windows 10 start menu-specific code begins here |
|
ComPtr<ICuratedTileCollectionManager> pTileCollectionManager; |
|
RETURN_IF_FAILED(RoActivateInstance( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), |
|
&pTileCollectionManager |
|
)); |
|
|
|
ComPtr<IUnifiedTileIdentifier> pUnifiedTileIdentifier; |
|
RETURN_IF_FAILED(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__GetUnifiedIdentifierForAumid( |
|
_this, |
|
WindowsGetStringRawBuffer(hstrAumid, nullptr), |
|
WindowsGetStringRawBuffer(hstrTileId, nullptr), |
|
&pUnifiedTileIdentifier |
|
)); |
|
|
|
ComPtr<ICuratedTileCollection> pTileCollection; |
|
RETURN_IF_FAILED(pTileCollectionManager->GetCollection( |
|
Wrappers::HStringReference(L"Start.TileGrid").Get(), |
|
&pTileCollection |
|
)); |
|
|
|
RETURN_IF_FAILED(pTileCollection->DoesCollectionContainTile(pUnifiedTileIdentifier.Get(), nullptr, out)); |
|
|
|
return S_OK; |
|
} |
|
|
|
HRESULT (*StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTileFunc)( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
HSTRING hstrTileId); |
|
|
|
HRESULT StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTile( |
|
void* _this, |
|
HSTRING hstrAumid, |
|
HSTRING hstrTileId) |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; |
|
|
|
if (!dwStartShowClassicMode) |
|
return StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTileFunc(_this, hstrAumid, hstrTileId); |
|
|
|
/*if (RtlIsMultiUsersInSessionSku()) |
|
return S_OK;*/ |
|
|
|
ComPtr<IUnifiedTileIdentifier> pUnifiedTileIdentifier; |
|
RETURN_IF_FAILED(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__GetUnifiedIdentifierForAumid( |
|
_this, |
|
WindowsGetStringRawBuffer(hstrAumid, nullptr), |
|
WindowsGetStringRawBuffer(hstrTileId, nullptr), |
|
&pUnifiedTileIdentifier |
|
)); |
|
|
|
// Windows 10 start menu-specific code begins here |
|
ComPtr<ICuratedTileCollectionManager> pTileCollectionManager; |
|
RETURN_IF_FAILED(RoActivateInstance( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), |
|
&pTileCollectionManager |
|
)); |
|
|
|
ComPtr<ICuratedTileCollection> pTileCollection; |
|
RETURN_IF_FAILED(pTileCollectionManager->GetCollection( |
|
Wrappers::HStringReference(L"Start.TileGrid").Get(), |
|
&pTileCollection |
|
)); |
|
|
|
ComPtr<IStartTileCollection> pStartTileCollection; |
|
RETURN_IF_FAILED(pTileCollection.As(&pStartTileCollection)); |
|
|
|
RETURN_IF_FAILED(pStartTileCollection->UnpinFromStart(pUnifiedTileIdentifier.Get())); |
|
|
|
return S_OK; |
|
} |
|
|
|
HRESULT PatchStartPinnableSurface(HMODULE hModule, ABI::Windows::Internal::ApplicationModel::IPinnableSurfaceFactory** outPinnableSurfaceFactory) |
|
{ |
|
using namespace ABI::Windows::Internal::ApplicationModel; |
|
|
|
if (outPinnableSurfaceFactory) |
|
*outPinnableSurfaceFactory = nullptr; |
|
|
|
typedef HRESULT (WINAPI* DllGetActivationFactory_t)(HSTRING, IActivationFactory**); |
|
DllGetActivationFactory_t pfnGetActivationFactory = (DllGetActivationFactory_t)GetProcAddress(hModule, "DllGetActivationFactory"); |
|
RETURN_HR_IF_NULL(E_FAIL, pfnGetActivationFactory); |
|
|
|
ComPtr<IActivationFactory> activationFactory; |
|
RETURN_IF_FAILED(pfnGetActivationFactory( |
|
Wrappers::HStringReference(L"Windows.Internal.ApplicationModel.StartPinnableSurface").Get(), |
|
activationFactory.ReleaseAndGetAddressOf()) |
|
); |
|
|
|
ComPtr<IPinnableSurfaceFactory> pinnableSurfaceFactory; |
|
RETURN_IF_FAILED(activationFactory.As(&pinnableSurfaceFactory)); |
|
|
|
if (outPinnableSurfaceFactory) |
|
pinnableSurfaceFactory.CopyTo(outPinnableSurfaceFactory); |
|
|
|
ComPtr<IPinnableSurface> pinnableSurface; |
|
RETURN_IF_FAILED(pinnableSurfaceFactory->GetCurrent(pinnableSurface.ReleaseAndGetAddressOf())); |
|
|
|
DWORD dwOldProtect = 0; |
|
|
|
void** vtable = *(void***)pinnableSurface.Get(); |
|
void** p_PinTile = &vtable[8]; |
|
void** p_IsTilePinned = &vtable[9]; |
|
void** p_UnpinTile = &vtable[11]; |
|
|
|
// PinTile |
|
if (*p_PinTile != StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTile) |
|
{ |
|
StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTileFunc = |
|
(decltype(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTileFunc))*p_PinTile; |
|
if (VirtualProtect(p_PinTile, sizeof(void*), PAGE_EXECUTE_READWRITE, &dwOldProtect)) |
|
{ |
|
*p_PinTile = StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__PinTile; |
|
VirtualProtect(p_PinTile, sizeof(void*), dwOldProtect, &dwOldProtect); |
|
} |
|
} |
|
|
|
// IsTilePinned |
|
if (*p_IsTilePinned != StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinned) |
|
{ |
|
StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinnedFunc = |
|
(decltype(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinnedFunc))*p_IsTilePinned; |
|
if (VirtualProtect(p_IsTilePinned, sizeof(void*), PAGE_EXECUTE_READWRITE, &dwOldProtect)) |
|
{ |
|
*p_IsTilePinned = StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__IsTilePinned; |
|
VirtualProtect(p_IsTilePinned, sizeof(void*), dwOldProtect, &dwOldProtect); |
|
} |
|
} |
|
|
|
// UnpinTile |
|
if (*p_UnpinTile != StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTile) |
|
{ |
|
StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTileFunc = |
|
(decltype(StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTileFunc))*p_UnpinTile; |
|
if (VirtualProtect(p_UnpinTile, sizeof(void*), PAGE_EXECUTE_READWRITE, &dwOldProtect)) |
|
{ |
|
*p_UnpinTile = StartTileData_Windows__Internal__ApplicationModel__StartPinnableSurface__UnpinTile; |
|
VirtualProtect(p_UnpinTile, sizeof(void*), dwOldProtect, &dwOldProtect); |
|
} |
|
} |
|
|
|
return S_OK; |
|
} |
|
#endif |
|
|
|
namespace VerbGlyphs::SegoeMDL2Assets |
|
{ |
|
const WCHAR* const Pin = L"\uE718"; |
|
const WCHAR* const Unpin = L"\uE77A"; |
|
} |
|
|
|
class EPStartPinUnpinTileVerb : public RuntimeClass<RuntimeClassFlags<WinRt>, ABI::WindowsInternal::Shell::UnifiedTile::ITileVerb, FtmBase> |
|
{ |
|
public: |
|
EPStartPinUnpinTileVerb() : |
|
m_flags(ABI::WindowsInternal::Shell::UnifiedTile::TileVerbFlags_None) |
|
{ |
|
} |
|
|
|
HRESULT RuntimeClassInitialize( |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTileIdentifier* unifiedTileIdentifier, |
|
bool bShowPin, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IVerbEnumerationArgs* verbEnumerationArgs, |
|
HSTRING verbProviderId, |
|
HSTRING groupPath) |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private; |
|
|
|
m_unifiedTileIdentifier = unifiedTileIdentifier; |
|
|
|
VerbEnumerationOptions options; |
|
RETURN_IF_FAILED(verbEnumerationArgs->get_Options(&options)); |
|
|
|
ComPtr<IVerbEnumerationArgsPrivate> pVerbEnumerationArgsPrivate; |
|
RETURN_IF_FAILED(verbEnumerationArgs->QueryInterface(IID_PPV_ARGS(&pVerbEnumerationArgsPrivate))); |
|
RETURN_IF_FAILED(pVerbEnumerationArgsPrivate->get_User(&m_user)); |
|
|
|
if (bShowPin) |
|
{ |
|
RETURN_IF_FAILED(m_canonicalName.Set(L"StartPin")); |
|
if ((options & VerbEnumerationOptions_ExcludeResources) == 0) |
|
{ |
|
RETURN_IF_FAILED(m_glyph.Set(VerbGlyphs::SegoeMDL2Assets::Pin)); |
|
} |
|
} |
|
else |
|
{ |
|
RETURN_IF_FAILED(m_canonicalName.Set(L"StartUnpin")); |
|
if ((options & VerbEnumerationOptions_ExcludeResources) == 0) |
|
{ |
|
RETURN_IF_FAILED(m_glyph.Set(VerbGlyphs::SegoeMDL2Assets::Unpin)); |
|
} |
|
} |
|
|
|
if ((options & VerbEnumerationOptions_ExcludeResources) == 0) |
|
{ |
|
WCHAR szDisplayName[260]; |
|
int written = LoadStringW(GetModuleHandleW(L"StartTileData.dll"), bShowPin ? 1007 : 1008, szDisplayName, ARRAYSIZE(szDisplayName)); |
|
if (written > 0 && written < ARRAYSIZE(szDisplayName)) |
|
{ |
|
RETURN_IF_FAILED(m_displayName.Set(szDisplayName)); |
|
} |
|
else |
|
{ |
|
RETURN_IF_FAILED(m_displayName.Set(m_canonicalName)); |
|
} |
|
RETURN_IF_FAILED(m_glyphFontFamily.Set(L"Segoe Fluent Icons")); |
|
} |
|
|
|
RETURN_IF_FAILED(m_verbProviderId.Set(verbProviderId)); |
|
RETURN_IF_FAILED(m_groupPath.Set(groupPath)); |
|
|
|
m_flags |= TileVerbFlags_CanExecute; |
|
|
|
return S_OK; |
|
} |
|
|
|
STDMETHODIMP get_VerbProviderId(HSTRING* out) override { RETURN_HR(m_verbProviderId.CopyTo(out)); } |
|
STDMETHODIMP get_GroupPath(HSTRING* out) override { RETURN_HR(m_groupPath.CopyTo(out)); } |
|
STDMETHODIMP get_CanonicalName(HSTRING* out) override { RETURN_HR(m_canonicalName.CopyTo(out)); } |
|
STDMETHODIMP get_DisplayName(HSTRING* out) override { RETURN_HR(m_displayName.CopyTo(out)); } |
|
STDMETHODIMP get_Glyph(HSTRING* out) override { RETURN_HR(m_glyph.CopyTo(out)); } |
|
STDMETHODIMP get_GlyphFontFamily(HSTRING* out) override { RETURN_HR(m_glyphFontFamily.CopyTo(out)); } |
|
STDMETHODIMP get_AccessKey(HSTRING* out) override { RETURN_HR(m_accessKey.CopyTo(out)); } |
|
STDMETHODIMP get_ShortcutText(HSTRING* out) override { RETURN_HR(m_shortcutText.CopyTo(out)); } |
|
STDMETHODIMP get_Flags(ABI::WindowsInternal::Shell::UnifiedTile::TileVerbFlags* out) override { *out = m_flags; return S_OK; } |
|
|
|
STDMETHODIMP Execute(ABI::WindowsInternal::Shell::UnifiedTile::IVerbExecutionArgs* verbExecutionArgs) override |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; |
|
|
|
ComPtr<ICuratedTileCollectionManagerStatics> pCuratedTileCollectionManagerStatics; |
|
RETURN_IF_FAILED(RoGetActivationFactory( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), |
|
IID_PPV_ARGS(&pCuratedTileCollectionManagerStatics) |
|
)); |
|
|
|
ComPtr<ICuratedTileCollectionManager> pCuratedTileCollectionManager; |
|
RETURN_IF_FAILED(pCuratedTileCollectionManagerStatics->CreateWithUser(m_user.Get(), &pCuratedTileCollectionManager)); |
|
|
|
ComPtr<ICuratedTileCollection> pTileCollection; |
|
RETURN_IF_FAILED(pCuratedTileCollectionManager->GetCollection( |
|
Wrappers::HStringReference(L"Start.TileGrid").Get(), |
|
&pTileCollection |
|
)); |
|
|
|
BOOLEAN bCollectionContainsTile; |
|
RETURN_IF_FAILED(pTileCollection->DoesCollectionContainTile(m_unifiedTileIdentifier.Get(), nullptr, &bCollectionContainsTile)); |
|
bool bPinned = bCollectionContainsTile != FALSE; |
|
|
|
bool bPin = m_canonicalName == Wrappers::HStringReference(L"StartPin").Get(); |
|
if (bPin != bPinned) |
|
{ |
|
ComPtr<IStartTileCollection> pStartTileCollection; |
|
RETURN_IF_FAILED(pTileCollection.As(&pStartTileCollection)); |
|
|
|
if (bPin) |
|
{ |
|
RETURN_IF_FAILED(pStartTileCollection->PinToStart(m_unifiedTileIdentifier.Get(), TilePinSize_Tile2x2)); |
|
} |
|
else |
|
{ |
|
RETURN_IF_FAILED(pStartTileCollection->UnpinFromStart(m_unifiedTileIdentifier.Get())); |
|
} |
|
} |
|
|
|
return S_OK; |
|
} |
|
|
|
STDMETHODIMP ExecuteAsync(ABI::WindowsInternal::Shell::UnifiedTile::IVerbExecutionArgs* verbExecutionArgs, ABI::Windows::Foundation::IAsyncOperation<bool>** out) override |
|
{ |
|
winrt::Windows::Foundation::IAsyncOperation<bool> asyncOp = InternalExecuteAsync(verbExecutionArgs); |
|
*out = (ABI::Windows::Foundation::IAsyncOperation<bool>*)winrt::detach_abi(asyncOp); |
|
return S_OK; |
|
} |
|
|
|
winrt::Windows::Foundation::IAsyncOperation<bool> InternalExecuteAsync(ABI::WindowsInternal::Shell::UnifiedTile::IVerbExecutionArgs* verbExecutionArgs) |
|
{ |
|
co_await winrt::resume_background(); |
|
co_return SUCCEEDED(Execute(verbExecutionArgs)); |
|
} |
|
|
|
Wrappers::HString m_verbProviderId; |
|
Wrappers::HString m_groupPath; |
|
Wrappers::HString m_canonicalName; |
|
Wrappers::HString m_displayName; |
|
Wrappers::HString m_glyph; |
|
Wrappers::HString m_glyphFontFamily; |
|
Wrappers::HString m_accessKey; |
|
Wrappers::HString m_shortcutText; |
|
ComPtr<ABI::Windows::System::IUser> m_user; |
|
ABI::WindowsInternal::Shell::UnifiedTile::TileVerbFlags m_flags; |
|
|
|
ComPtr<ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTileIdentifier> m_unifiedTileIdentifier; |
|
}; |
|
|
|
namespace ABI::Windows::Foundation::Collections |
|
{ |
|
template <> |
|
struct __declspec(uuid("22e86da4-c5d3-50e2-b649-dd5a9e58fd26")) |
|
IVector<ABI::WindowsInternal::Shell::UnifiedTile::ITileVerb*> : IVector_impl<ABI::WindowsInternal::Shell::UnifiedTile::ITileVerb*> |
|
{ |
|
}; |
|
} |
|
|
|
HRESULT (*WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicableFunc)( |
|
void* _this, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTile* tile, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTileManager* manager, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IVerbEnumerationArgs* verbEnumerationArgs, |
|
ABI::Windows::Foundation::Collections::IVector<ABI::WindowsInternal::Shell::UnifiedTile::ITileVerb*>* verbs); |
|
|
|
HRESULT WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicable( |
|
void* _this, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTile* tile, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IUnifiedTileManager* manager, |
|
ABI::WindowsInternal::Shell::UnifiedTile::IVerbEnumerationArgs* verbEnumerationArgs, |
|
ABI::Windows::Foundation::Collections::IVector<ABI::WindowsInternal::Shell::UnifiedTile::ITileVerb*>* verbs) |
|
{ |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::Private; |
|
|
|
if (!dwStartShowClassicMode) |
|
return WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicableFunc(_this, tile, manager, verbEnumerationArgs, verbs); |
|
|
|
ComPtr<IUnifiedTileIdentifier> pUnifiedTileIdentifier; |
|
THROW_IF_FAILED(tile->get_Id(&pUnifiedTileIdentifier)); |
|
|
|
UnifiedTileIdentifierKind kind; |
|
THROW_IF_FAILED(pUnifiedTileIdentifier->get_Kind(&kind)); |
|
|
|
ComPtr<IVerbEnumerationArgsPrivate> pVerbEnumerationArgsPrivate; |
|
THROW_IF_FAILED(verbEnumerationArgs->QueryInterface(IID_PPV_ARGS(&pVerbEnumerationArgsPrivate))); |
|
|
|
bool bCanProceed = false; |
|
|
|
BOOLEAN bIsStartPin; |
|
if (SUCCEEDED_LOG(pVerbEnumerationArgsPrivate->IsMatchingVerbCanonicalName(Wrappers::HStringReference(L"StartPin").Get(), &bIsStartPin)) && bIsStartPin) |
|
{ |
|
bCanProceed = kind != UnifiedTileIdentifierKind_Unknown; |
|
} |
|
else |
|
{ |
|
BOOLEAN bIsStartUnpin; |
|
if (SUCCEEDED_LOG(pVerbEnumerationArgsPrivate->IsMatchingVerbCanonicalName(Wrappers::HStringReference(L"StartUnpin").Get(), &bIsStartUnpin)) && bIsStartUnpin) |
|
{ |
|
bCanProceed = kind != UnifiedTileIdentifierKind_Unknown; |
|
} |
|
} |
|
|
|
if (!bCanProceed) |
|
return S_OK; |
|
|
|
// Windows 10 start menu-specific code begins here |
|
ComPtr<IUnifiedTileCollection> pTileCollection; |
|
THROW_IF_FAILED(manager->GetCollection(CollectionProvider_CuratedTileCollection, Wrappers::HStringReference(L"Start.TileGrid").Get(), &pTileCollection)); // @MOD Not accessing field_58 |
|
|
|
ComPtr<ITileContainerPrivate> pTileContainerPrivate; |
|
THROW_IF_FAILED(pTileCollection.As(&pTileContainerPrivate)); |
|
|
|
bool bPreventPinning; |
|
|
|
ComPtr<ITileCollectionContainer> pTileCollectionContainer; |
|
bool bCollectionFound = pTileContainerPrivate->TryFindTileByUnifiedTileIdRecursive(pUnifiedTileIdentifier.Get(), nullptr, &pTileCollectionContainer); |
|
|
|
if (bCollectionFound) |
|
{ |
|
bPreventPinning = false; |
|
} |
|
else if (kind == UnifiedTileIdentifierKind_TargetedContent) |
|
{ |
|
bPreventPinning = true; |
|
} |
|
else |
|
{ |
|
ComPtr<IUnifiedTilePrivate> pUnifiedTilePrivate; |
|
THROW_IF_FAILED(tile->QueryInterface(IID_PPV_ARGS(&pUnifiedTilePrivate))); |
|
|
|
BOOLEAN bVisibleInAppList; |
|
THROW_IF_FAILED(pUnifiedTilePrivate->get_IsVisibleInAppList(&bVisibleInAppList)); |
|
|
|
if (bVisibleInAppList) |
|
{ |
|
bPreventPinning = false; |
|
if (kind == UnifiedTileIdentifierKind_Win32) |
|
{ |
|
ComPtr<IWin32ShortcutInfo> pWin32ShortcutInfo; |
|
THROW_IF_FAILED(tile->get_Win32ShortcutInfo(&pWin32ShortcutInfo)); |
|
|
|
if (pWin32ShortcutInfo.Get()) |
|
{ |
|
BOOLEAN bLocalPreventPinning; |
|
if (SUCCEEDED_LOG(pWin32ShortcutInfo->get_PreventPinning(&bLocalPreventPinning))) |
|
bPreventPinning = bLocalPreventPinning != FALSE; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
bPreventPinning = true; |
|
} |
|
} |
|
|
|
if (!bPreventPinning) |
|
{ |
|
// We are not playing around with policies for now |
|
} |
|
|
|
ComPtr<ITileVerb> pTileVerb; |
|
THROW_IF_FAILED(MakeAndInitialize<EPStartPinUnpinTileVerb>(&pTileVerb, pUnifiedTileIdentifier.Get(), !bCollectionFound, verbEnumerationArgs, *(HSTRING*)((PBYTE)_this + 0x40), nullptr)); |
|
THROW_IF_FAILED(verbs->Append(pTileVerb.Get())); |
|
|
|
return S_OK; |
|
} |
|
|
|
HRESULT PatchUnifiedTilePinUnpinProvider(HMODULE hModule) |
|
{ |
|
MODULEINFO mi; |
|
RETURN_IF_WIN32_BOOL_FALSE(GetModuleInformation(GetCurrentProcess(), hModule, &mi, sizeof(mi))); |
|
|
|
#if defined(_M_X64) |
|
// 40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 FF 49 8B ?? 4D 8B ?? 48 8B ?? 4C 8B ?? 4C 89 4D |
|
PBYTE match = (PBYTE)FindPattern( |
|
hModule, |
|
mi.SizeOfImage, |
|
"\x40\x55\x53\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\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\xFF\x49\x8B\x00\x4D\x8B\x00\x48\x8B\x00\x4C\x8B\x00\x4C\x89\x4D", |
|
"xxxxxxxxxxxxxxxxx?xxx????xxx????xxxxxxxxx?xx?xx?xx?xxx" |
|
); |
|
#elif defined(_M_ARM64) |
|
// E4 06 40 F9 E3 03 15 AA E2 0E 40 F9 E1 03 19 AA E0 03 16 AA ?? ?? ?? ?? E3 03 00 2A |
|
// ^^^^^^^^^^^ |
|
// Ref: WindowsInternal::Shell::UnifiedTile::Private::UnifiedTilePinUnpinVerbProvider::GetVerbs() |
|
PBYTE match = (PBYTE)FindPattern( |
|
hModule, |
|
mi.SizeOfImage, |
|
"\xE4\x06\x40\xF9\xE3\x03\x15\xAA\xE2\x0E\x40\xF9\xE1\x03\x19\xAA\xE0\x03\x16\xAA\x00\x00\x00\x00\xE3\x03\x00\x2A", |
|
"xxxxxxxxxxxxxxxxxxxx????xxxx" |
|
); |
|
if (match) |
|
{ |
|
match += 20; |
|
match = (PBYTE)ARM64_FollowBL((DWORD*)match); |
|
} |
|
#endif |
|
|
|
int rv = -1; |
|
if (match) |
|
{ |
|
WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicableFunc = |
|
(decltype(WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicableFunc))match; |
|
rv = funchook_prepare( |
|
funchook, |
|
(void**)&WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicableFunc, |
|
WindowsInternal__Shell__UnifiedTile__Private__UnifiedTilePinUnpinVerbProvider__AddStartPinUnpinVerbIfApplicable |
|
); |
|
} |
|
if (rv != 0) |
|
{ |
|
printf("Failed to hook UnifiedTilePinUnpinVerbProvider::GetVerbs(). rv = %d\n", rv); |
|
} |
|
|
|
return S_OK; |
|
} |
|
|
|
extern "C" { |
|
|
|
void PatchStartTileDataFurther(HMODULE hModule, BOOL bSMEH) |
|
{ |
|
// ComPtr<ABI::Windows::Internal::ApplicationModel::IPinnableSurfaceFactory> pPinnableSurfaceFactory; |
|
// PatchStartPinnableSurface(hModule, nullptr /*&pPinnableSurfaceFactory*/); |
|
|
|
// if (bSMEH) |
|
// pPinnableSurfaceFactory->AddRef(); // Pin in memory so that StartTileData.dll doesn't get unloaded |
|
|
|
PatchUnifiedTilePinUnpinProvider(hModule); |
|
} |
|
|
|
} // extern "C" |
|
|
|
struct CCacheShortcut |
|
{ |
|
const wchar_t* GetAppID(const void* a2) const |
|
{ |
|
DWORD dwOffset = *(DWORD*)((PBYTE)this + 44); // Same offset in Windows 10 and 11 |
|
return dwOffset != -1 ? (wchar_t*)((char*)a2 + dwOffset) : nullptr; |
|
} |
|
}; |
|
|
|
extern "C" |
|
{ |
|
|
|
HRESULT(*AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc)(void* _this, 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::Private; |
|
using namespace ABI::WindowsInternal::Shell::UnifiedTile::CuratedTileCollections; |
|
|
|
if (!dwStartShowClassicMode) |
|
return AppResolver_CAppResolverCacheBuilder__AddUserPinnedShortcutToStartFunc(_this, a2, a3); |
|
|
|
ComPtr<IWin32UnifiedTileIdentifierFactory> pTileIdentifierFactory; |
|
RETURN_IF_FAILED(Windows::Foundation::GetActivationFactory( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.UnifiedTileIdentifier").Get(), |
|
&pTileIdentifierFactory |
|
)); |
|
|
|
ComPtr<IUnifiedTileIdentifier> pTileIdentifier; |
|
const wchar_t* pwszAppId = a2->GetAppID(a3); |
|
RETURN_IF_FAILED(pTileIdentifierFactory->Create( |
|
Wrappers::HStringReference(pwszAppId).Get(), |
|
&pTileIdentifier |
|
)); |
|
|
|
ComPtr<IUnifiedTileUserPinHelperStatics> pTileUserPinHelper; |
|
RETURN_IF_FAILED(Windows::Foundation::GetActivationFactory( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.Private.UnifiedTileUserPinHelper").Get(), |
|
&pTileUserPinHelper |
|
)); |
|
|
|
RETURN_IF_FAILED(pTileUserPinHelper->CreateUserPinnedShortcutTile(pTileIdentifier.Get())); |
|
|
|
// Windows 10 start menu-specific code begins here |
|
ComPtr<ICuratedTileCollectionManager> pTileCollectionManager; |
|
RETURN_IF_FAILED(RoActivateInstance( |
|
Wrappers::HStringReference(L"WindowsInternal.Shell.UnifiedTile.CuratedTileCollections.CuratedTileCollectionManager").Get(), |
|
&pTileCollectionManager |
|
)); |
|
|
|
ComPtr<ICuratedTileCollection> pTileCollection; |
|
RETURN_IF_FAILED(pTileCollectionManager->GetCollection( |
|
Wrappers::HStringReference(L"Start.TileGrid").Get(), |
|
&pTileCollection |
|
)); |
|
|
|
ComPtr<IStartTileCollection> pStartTileCollection; |
|
RETURN_IF_FAILED(pTileCollection.As(&pStartTileCollection)); |
|
|
|
RETURN_IF_FAILED(pStartTileCollection->PinToStart(pTileIdentifier.Get(), TilePinSize_Tile2x2)); |
|
|
|
RETURN_IF_FAILED(pTileCollection->Commit()); |
|
|
|
return S_OK; |
|
} |
|
|
|
} // extern "C"
|
|
|