Skip to content

Commit 3959f0d

Browse files
DrusTheAxekythant
andauthored
Reapply "Delegate to OS RegFreeWinRT when available (>=24H1) (#4728)" (#4935) (#4949)
* Reapply "Delegate to OS RegFreeWinRT when available (>=24H1) (#4728)" (#4935) This reverts commit c088336. * Added missing dependencies for OAuth2ManagerTests * Expanded tests * Modified IsSupported with temporary debugging hack to expedite testing. Added local hackery for Architectures=None (but is it needed?) * Removed debug hackery * Test fixes * More test fiddling * Microsoft.Windows.BadgeNotifications.Projection project is missing a build-order dependency on WindowsAppRuntime_DLL so depending on timing and beefy machine it can try to build before the dependency is built and boom :-( * Removed redundant Import * Fixed bad merge * Fixed WinAppSDK framework package family name construction in GetFrameworkPackageFamilyName() [MddBootstrap.cpp]. This is used in production when delegating to OS DynDep but not when using WinAppSDK DynDep (and test support used different codepath). That's why test packages with blah-major.minor... package names worked in test and on Win10 but not when delegating to OS DynDep on Win11. Added additional test tools to aid verification and debugging (now and in any future changes). * Fixed DevCheck -CheckDependencies if packages.config has no <package> elements. Ran DevCheck -SyncDependencies to update stale dependencies * Fix test framework package Name from name-major.minor to name.major.minor * Workaround Windows bug https://task.ms/54835001 where IsPackage*ReadyOrNewerAvailable() doesn't correctly handle ProcessorArchitectureFilter=None * Ran devcheck -syncdependencies * Fixed failing PackageManagementTests * Updated dependnecies via DevCheck -SyncDependencies. Removed unused Microsoft.Windows.SDK.BuildTools and Microsoft.WindowsAppSDK references in WindowsAppRuntime_UniversalBGTaskDLL's packages.config. Removed dead readme.txt in WindowsAppRuntime_UniversalBGTaskDLL projectdir (artifact of VS File/NewProject...). * Updated link to latest SDK rev * Fixed dependencies (syntax and usage * Put WindowsAppRuntime_UniversalBGTaskDLL back to what's in main. No idea why that works but changing it -- in what should be innocuous ways -- breaks local + pipeline builds. Deferring that problem to Will Thant in its own right (not relevant to my changes) * Fixed hardcoded versions in OAuthTestApp.vcxproj (wasn't using version macro) * Fixed more bad projects - Import Microsoft.Cpp.Default.props not at the top, .. pathing to nugets and hardwired nuget versions * Fixed WindowsAppRuntime_UniversalBGTaskDLL - Import Microsoft.Cpp.Default.props not at top of file, not using $(NugetPackageDirectory) for pathing to nugets, hardwired versions for nugets, unnecessary Microsoft.WindowsAppSDK in packages.config * Added -ShowSystemInfo (default=$true) to Testall so test run output includes basic system info * Fixed up test Main+Singleton+DDLM naming/constants * Fixed bug in package name constant * Added missing project dependencies. Updated ConfigurationManager to build test packages on ARM64 too (some were only build for x64|x86) * Fixed bad merge * Fixed a bad merge * Removed temporary debugging code * Some test packages lacked ARM64 support, plus those and others weren't getting built for ARM64. And some projects built not-ARM64 for ARM64. Mostly fixed. Some test projects lack ARM64 support but not touched as not blocking here and overdue already; they can (and will) be handled in a separate follow up effort * Fixed one more ARM configuration manager misconfiguration --------- Co-authored-by: Kyaw Thant <[email protected]>
1 parent 64e32d6 commit 3959f0d

File tree

141 files changed

+2469
-353
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+2469
-353
lines changed

TestAll.ps1

+42-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ param(
6666
[Switch]$Test,
6767

6868
[Parameter(Mandatory=$false)]
69-
[Switch]$List
69+
[Switch]$List,
70+
71+
[Parameter(Mandatory=$false)]
72+
[Switch]$ShowSystemInfo=$true
7073
)
7174

7275
$StartTime = Get-Date
@@ -175,6 +178,44 @@ function Run-Tests
175178
}
176179
}
177180

181+
function Get-SystemInfo
182+
{
183+
$regkey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
184+
$productname = $(Get-Item -Path $regkey).GetValue('ProductName')
185+
$displayversion = $(Get-Item -Path $regkey).GetValue('DisplayVersion')
186+
$currentmajor = $(Get-Item -Path $regkey).GetValue('CurrentMajorVersionNumber')
187+
$currentminor = $(Get-Item -Path $regkey).GetValue('CurrentMinorVersionNumber')
188+
$currentbuild = $(Get-Item -Path $regkey).GetValue('CurrentBuild')
189+
Write-Host "Product : $($productname) $($displayversion) $($currentmajor).$($currentminor).$($currentbuild)"
190+
191+
$installationtype = $(Get-Item -Path $regkey).GetValue('InstallationType')
192+
Write-Host "InstallationType: $($installationtype)"
193+
194+
$editionid = $(Get-Item -Path $regkey).GetValue('EditionId')
195+
$compositioneditionid = $(Get-Item -Path $regkey).GetValue('CompositionEditionID')
196+
if ($editionid -eq $compositioneditionid)
197+
{
198+
Write-Host "Edition : $($editionid)"
199+
}
200+
else
201+
{
202+
Write-Host "Edition : $($editionid) [$($compositioneditionid)]"
203+
}
204+
205+
$buildlabex = $(Get-Item -Path $regkey).GetValue('BuildLabEx')
206+
Write-Host "Build : $($buildlabex)"
207+
208+
$lcuver = $(Get-Item -Path $regkey).GetValue('LCUVer')
209+
Write-Host "LCU Version : $($lcuver)"
210+
211+
Write-Host "Powershell : $($PSVersionTable.PSEdition) $($PSVersionTable.PSVersion)"
212+
}
213+
214+
if ($ShowSystemInfo -eq $true)
215+
{
216+
Get-SystemInfo
217+
}
218+
178219
if ($List -eq $true)
179220
{
180221
List-Tests | Out-String

WindowsAppRuntime.sln

+191-28
Large diffs are not rendered by default.

build/AzurePipelinesTemplates/WindowsAppSDK-RunTests-Steps.yml

+12-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ steps:
1111
inputs:
1212
targetType: filePath
1313
filePath: tools\DevCheck\DevCheck.ps1
14-
arguments: -NoInteractive -Offline -Verbose -CheckTestPfx -Clean -CheckDependencies -ShowSystemInfo
14+
arguments: -NoInteractive -Offline -Verbose -CheckTestPfx -Clean -CheckDependencies -CheckVisualStudio -ShowSystemInfo
1515
workingDirectory: '$(Build.SourcesDirectory)'
1616

1717
- task: DownloadPipelineArtifact@2
@@ -147,6 +147,17 @@ steps:
147147
Write-Host "WhoAmI"
148148
Write-Host (whoami /user /groups /priv)
149149
150+
- task: PowerShell@2
151+
displayName: 'Dump services'
152+
inputs:
153+
targetType: 'inline'
154+
script: |
155+
Get-Service
156+
Get-Service | Write-Host
157+
Get-Service | Out-Host
158+
sc.exe queryex te.service | Write-Host
159+
sc.exe qc te.service | Write-Host
160+
150161
- task: PowerShell@2
151162
displayName: 'Run TAEF Tests'
152163
inputs:

build/AzurePipelinesTemplates/WindowsAppSDK-SetupBuildEnvironment-Steps.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ steps:
7272
inputs:
7373
targetType: filePath
7474
filePath: tools\DevCheck\DevCheck.ps1
75-
arguments: -NoInteractive -Offline -Verbose -CheckTestPfx -Clean -CheckDependencies -ShowSystemInfo
75+
arguments: -NoInteractive -Offline -Verbose -CheckTestPfx -Clean -CheckDependencies -CheckVisualStudio -ShowSystemInfo
7676
workingDirectory: '$(Build.SourcesDirectory)'
7777
7878
- task: PowerShell@2

dev/Common/IsWindowsVersion.h

+11-6
Original file line numberDiff line numberDiff line change
@@ -33,30 +33,35 @@ inline bool IsExportPresent(
3333

3434
inline bool IsWindows10_19H1OrGreater()
3535
{
36-
// GetPackageInfo2() added to kernelbase.dll in NTDDI_WIN10_19H1 (aka 19H1)
36+
// GetPackageInfo2() added to kernelbase.dll in 19H1 (aka NTDDI_WIN10_19H1)
3737
return IsExportPresent(L"kernelbase.dll", "GetPackageInfo2");
3838
}
3939

4040
inline bool IsWindows10_20H1OrGreater()
4141
{
42-
// GetPackageInfo3() added to kernelbase.dll in NTDDI_WIN10_VB (aka 20H1)
42+
// GetPackageInfo3() added to kernelbase.dll in 20H1 (aka NTDDI_WIN10_VB)
4343
return IsExportPresent(L"kernelbase.dll", "GetPackageInfo3");
4444
}
4545
inline bool IsWindows11_21H2OrGreater()
4646
{
47-
// GetMachineTypeAttributes() added to kernelbase.dll in NTDDI_WIN10_CO (aka Windows 11 21H2)
47+
// GetMachineTypeAttributes() added to kernelbase.dll in Windows 11 21H2 (aka NTDDI_WIN10_CO)
4848
return IsExportPresent(L"kernelbase.dll", "GetMachineTypeAttributes");
4949
}
5050
inline bool IsWindows11_22H2OrGreater()
5151
{
52-
// GetPackageGraphRevisionId() added to kernelbase.dll in NTDDI_WIN10_NI (aka Windows 11 22H2)
52+
// GetPackageGraphRevisionId() added to kernelbase.dll in Windows 11 22H2 (aka NTDDI_WIN10_NI)
5353
return IsExportPresent(L"kernelbase.dll", "GetPackageGraphRevisionId");
5454
}
55-
inline bool IsWindows11_23H1OrGreater()
55+
inline bool IsWindows11_24H1OrGreater()
5656
{
57-
// TryCreatePackageDependency2() added to in NTDDI_WIN10_GE (aka Windows 11 23H1)
57+
// TryCreatePackageDependency2() added to in Windows 11 24H1 (aka NTDDI_WIN11_GE)
5858
return IsExportPresent(L"kernelbase.dll", "TryCreatePackageDependency2");
5959
}
60+
inline bool IsWindows11_24H2OrGreater()
61+
{
62+
// MsixIsPackageFeatureSupported() added to in Windows 11 24H2 (aka NTDDI_WIN11_GE)
63+
return IsExportPresent(L"appxdeploymentclient.dll", "MsixIsPackageFeatureSupported");
64+
}
6065
}
6166

6267
#endif // __ISWINDOWSVERSION_H

dev/DynamicDependency/API/MddWin11.h

+37-12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <MsixDynamicDependency.h>
88

99
#include <IsWindowsVersion.h>
10+
#include <AppModel.Identity.h>
1011

1112
namespace MddCore::Win11
1213
{
@@ -41,7 +42,7 @@ namespace MddCore::Win11
4142
__declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{};
4243
//TODO:47775758 GetResolved2 __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency2) g_win11GetResolvedPackageFullNameForPackageDependency2{};
4344

44-
__declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() };
45+
__declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_24H1OrGreater() };
4546

4647
constexpr PackageDependencyLifetimeKind ToLifetimeKind(MddPackageDependencyLifetimeKind lifetimeKind)
4748
{
@@ -95,18 +96,48 @@ namespace MddCore::Win11
9596

9697
inline bool IsSupported()
9798
{
98-
#if defined(TODO_WindowsAppSDKAggregator_Test_Failures)
9999
return MddCore::Win11::details::g_isSupported;
100-
#else
101-
return false;
102-
#endif
103100
}
104101

105102
inline bool IsGetResolvedPackageFullNameForPackageDependency2Supported()
106103
{
107104
return IsSupported() && MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7;
108105
}
109106

107+
constexpr PackageDependencyProcessorArchitectures GetPackageDependencyProcessorArchitecturesCompatibleWithCallerArchitecture()
108+
{
109+
#if defined(_M_ARM)
110+
return PackageDependencyProcessorArchitectures_Arm | PackageDependencyProcessorArchitectures_Neutral;
111+
#elif defined(_M_ARM64)
112+
return PackageDependencyProcessorArchitectures_Arm64 | PackageDependencyProcessorArchitectures_Neutral;
113+
#elif defined(_M_IX86)
114+
return PackageDependencyProcessorArchitectures_X86 | PackageDependencyProcessorArchitectures_Neutral;
115+
#elif defined(_M_X64)
116+
return PackageDependencyProcessorArchitectures_X64 | PackageDependencyProcessorArchitectures_Neutral;
117+
#else
118+
# error "Unknown processor architecture"
119+
#endif
120+
}
121+
122+
constexpr PackageDependencyProcessorArchitectures ToPackageDependencyProcessorArchitectures(
123+
const MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures)
124+
{
125+
if (packageDependencyProcessorArchitectures == MddPackageDependencyProcessorArchitectures::None)
126+
{
127+
// Workaround Windows bug (https://task.ms/54835001) that doesn't treat PackageDependencyProcessorArchitectures::None equivalent to caller-architecture + Neutral
128+
return GetPackageDependencyProcessorArchitecturesCompatibleWithCallerArchitecture();
129+
}
130+
131+
auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None };
132+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Neutral));
133+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86));
134+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X64));
135+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm));
136+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm64));
137+
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86OnArm64));
138+
return win11PackageDependencyProcessorArchitectures;
139+
}
140+
110141
inline HRESULT TryCreatePackageDependency(
111142
PSID user,
112143
_In_ PCWSTR packageFamilyName,
@@ -119,13 +150,7 @@ namespace MddCore::Win11
119150
{
120151
const ::AppModel::Identity::PackageVersion win11MinVersion{ minVersion };
121152

122-
auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None };
123-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Neutral));
124-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86));
125-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X64));
126-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm));
127-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm64));
128-
WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86OnArm64));
153+
auto win11PackageDependencyProcessorArchitectures{ ToPackageDependencyProcessorArchitectures(packageDependencyProcessorArchitectures) };
129154

130155
const auto win11LifetimeKind{ MddCore::Win11::details::ToLifetimeKind(lifetimeKind) };
131156

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="Microsoft.Taef" version="10.94.240624002" targetFramework="native" />
3+
<package id="Microsoft.Taef" version="10.95.240918004" targetFramework="native" />
44
</packages>
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="Microsoft.Taef" version="10.94.240624002" targetFramework="net45" />
3+
<package id="Microsoft.Taef" version="10.95.240918004" targetFramework="net45" />
44
</packages>
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
33
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.240803.1" targetFramework="native" />
4-
<package id="Microsoft.Taef" version="10.94.240624002" targetFramework="native" />
4+
<package id="Microsoft.Taef" version="10.95.240918004" targetFramework="native" />
55
</packages>

dev/PackageManager/API/M.W.M.D.PackageDeploymentManager.cpp

+30-3
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,34 @@ static PackageManagement_ArchitectureType ToArchitectureType(const winrt::Window
5858
}
5959
}
6060

61+
static constexpr PackageManagement_ArchitectureType GetPackageManagementArchitectureTypesCompatibleWithCallerArchitecture()
62+
{
63+
#if defined(_M_ARM)
64+
return PackageManagement_ArchitectureType_Arm | PackageManagement_ArchitectureType_Neutral;
65+
#elif defined(_M_ARM64)
66+
return PackageManagement_ArchitectureType_Arm64 | PackageManagement_ArchitectureType_Neutral;
67+
#elif defined(_M_IX86)
68+
return PackageManagement_ArchitectureType_X86 | PackageManagement_ArchitectureType_Neutral;
69+
#elif defined(_M_X64)
70+
return PackageManagement_ArchitectureType_X64 | PackageManagement_ArchitectureType_Neutral;
71+
#else
72+
# error "Unknown processor architecture"
73+
#endif
74+
}
75+
6176
namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency
6277
{
6378
DEFINE_ENUM_FLAG_OPERATORS(PackageDependencyProcessorArchitectures)
6479
}
6580
static PackageManagement_ArchitectureType ToArchitectureType(const winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures processorArchitectureFilter)
6681
{
82+
// Workaround bug in Windows https://task.ms/54835001 not handling processor architecture filter = None as "architcture(s) supported by the calling code"
83+
// TODO: Use IsPackageDeploymentFeatureSupported(IsPackageReadyOrNewerAvailable_ProcessorArchitectureFilter_None) when available
84+
if (processorArchitectureFilter == winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::None)
85+
{
86+
return GetPackageManagementArchitectureTypesCompatibleWithCallerArchitecture();
87+
}
88+
6789
auto architectureType{ PackageManagement_ArchitectureType_None };
6890
if (WI_IsFlagSet(processorArchitectureFilter, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral))
6991
{
@@ -119,9 +141,14 @@ namespace winrt::Microsoft::Windows::Management::Deployment::implementation
119141
{
120142
case winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentFeature::PackageUriScheme_ms_uup:
121143
{
122-
//TODO Feature lookup
123-
// Relies on PackageManagement_IsFeatureSupported(L"PackageUriScheme.ms-uup") exist in Microsoft.FrameworkUdk and enabled
124-
return ::WindowsVersion::IsExportPresent(L"appxdeploymentclient.dll", "MsixRemovePackageByUriAsync");
144+
BOOL isSupported{};
145+
const HRESULT hr{ PackageManagement_IsFeatureSupported(L"PackageUriScheme.ms-uup", &isSupported) };
146+
if (hr == E_NOTIMPL)
147+
{
148+
return false;
149+
}
150+
THROW_IF_FAILED_MSG(hr, "PackageUriScheme_ms_uup");
151+
return !!isSupported;
125152
}
126153
case winrt::Microsoft::Windows::Management::Deployment::PackageDeploymentFeature::IsPackageReadyOrNewerAvailable:
127154
{

dev/UndockedRegFreeWinRT/urfw.cpp

+38-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
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
5860
static decltype(RoGetMetaDataFile)* TrueRoGetMetaDataFile = RoGetMetaDataFile;
5961
static decltype(RoResolveNamespace)* TrueRoResolveNamespace = RoResolveNamespace;
6062

63+
static bool g_apisAreDetoured{};
64+
6165
enum 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

406408
HRESULT 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

423449
void 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

431461
extern "C" void WINAPI winrtact_Initialize()

0 commit comments

Comments
 (0)