99#include < activation.h>
1010#include < VersionHelpers.h>
1111
12+ #include < IsWindowsVersion.h>
13+
1214#include " urfw.h"
1315
1416#include " catalog.h"
@@ -58,18 +60,18 @@ static decltype(RoGetActivationFactory)* TrueRoGetActivationFactory = RoGetActiv
5860static decltype (RoGetMetaDataFile)* TrueRoGetMetaDataFile = RoGetMetaDataFile;
5961static decltype (RoResolveNamespace)* TrueRoResolveNamespace = RoResolveNamespace;
6062
63+ static bool g_apisAreDetoured{};
64+
6165enum class ActivationLocation
6266{
6367 CurrentApartment,
6468 CrossApartmentMTA
6569};
6670
67- VOID CALLBACK EnsureMTAInitializedCallBack
68- (
71+ VOID CALLBACK EnsureMTAInitializedCallBack (
6972 PTP_CALLBACK_INSTANCE /* instance*/ ,
7073 PVOID /* parameter*/ ,
71- PTP_WORK /* work*/
72- )
74+ PTP_WORK /* work*/ )
7375{
7476 Microsoft::WRL::ComPtr<IComThreadingInfo> spThreadingInfo;
7577 CoGetObjectContext (IID_PPV_ARGS (&spThreadingInfo));
@@ -405,10 +407,34 @@ HRESULT ExtRoLoadCatalog()
405407
406408HRESULT UrfwInitialize () noexcept
407409{
410+ #if defined(TODO_URFW_DELEGATE_TO_OS_19H1PLUS)
411+ // Windows' Reg-Free WinRT first appeared in Windows 10 Version 1903, May 2019 Update (aka 19H1)
412+ // https://blogs.windows.com/windowsdeveloper/2019/04/30/enhancing-non-packaged-desktop-apps-using-windows-runtime-components/
413+ // Delegate to the OS' implementation when available
414+ if (WindowsVersion::IsWindows10_19H1OrGreater ())
415+ {
416+ return S_OK;
417+ }
418+ #elif defined(TODO_SEEME_PRODUCT_TARGET)
419+ // Delegate to the OS' implementation on >= Windows 11 24H1
420+ if (WindowsVersion::IsWindows11_22H2OrGreater ())
421+ {
422+ return S_OK;
423+ }
424+ #else
425+ // Delegate to the OS' implementation on >= Windows 11 24H1
426+ if (WindowsVersion::IsWindows11_24H1OrGreater ())
427+ {
428+ return S_OK;
429+ }
430+ #endif
431+
432+ // OS Reg-Free WinRT isn't available so let's do it ourselves...
408433 DetourAttach (&(PVOID&)TrueRoActivateInstance, RoActivateInstanceDetour);
409434 DetourAttach (&(PVOID&)TrueRoGetActivationFactory, RoGetActivationFactoryDetour);
410435 DetourAttach (&(PVOID&)TrueRoGetMetaDataFile, RoGetMetaDataFileDetour);
411436 DetourAttach (&(PVOID&)TrueRoResolveNamespace, RoResolveNamespaceDetour);
437+ g_apisAreDetoured = true ;
412438 try
413439 {
414440 RETURN_IF_FAILED (ExtRoLoadCatalog ());
@@ -422,10 +448,14 @@ HRESULT UrfwInitialize() noexcept
422448
423449void UrfwShutdown () noexcept
424450{
425- DetourDetach (&(PVOID&)TrueRoActivateInstance, RoActivateInstanceDetour);
426- DetourDetach (&(PVOID&)TrueRoGetActivationFactory, RoGetActivationFactoryDetour);
427- DetourDetach (&(PVOID&)TrueRoGetMetaDataFile, RoGetMetaDataFileDetour);
428- DetourDetach (&(PVOID&)TrueRoResolveNamespace, RoResolveNamespaceDetour);
451+ if (g_apisAreDetoured)
452+ {
453+ DetourDetach (&(PVOID&)TrueRoActivateInstance, RoActivateInstanceDetour);
454+ DetourDetach (&(PVOID&)TrueRoGetActivationFactory, RoGetActivationFactoryDetour);
455+ DetourDetach (&(PVOID&)TrueRoGetMetaDataFile, RoGetMetaDataFileDetour);
456+ DetourDetach (&(PVOID&)TrueRoResolveNamespace, RoResolveNamespaceDetour);
457+ g_apisAreDetoured = false ;
458+ }
429459}
430460
431461extern " C" void WINAPI winrtact_Initialize ()
0 commit comments