From 46c7bba762b268c486b047c874e8141e9b631031 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 4 Jul 2023 22:14:36 -0700 Subject: [PATCH 01/18] DynamicDependencies: Use Win11 APIs if available --- .../API/DynamicDependency.vcxitems | 2 + .../API/DynamicDependency.vcxitems.filters | 6 ++ .../API/MddDetourPackageGraph.cpp | 16 +++++ .../API/MsixDynamicDependency.cpp | 64 +++++++++++++++++-- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems b/dev/DynamicDependency/API/DynamicDependency.vcxitems index 091653b2b9..ed77031035 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems @@ -23,6 +23,7 @@ + @@ -46,6 +47,7 @@ + diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters index 587277fc02..5e6e3be7bb 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters @@ -50,6 +50,9 @@ Source Files + + Source Files + Source Files @@ -127,6 +130,9 @@ Header Files + + Header Files + Header Files diff --git a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp index 4ef959e4e6..0717bbda0a 100644 --- a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp +++ b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp @@ -9,6 +9,8 @@ #include "PackageGraphManager.h" +#include "MddWin11.h" + #include <../Detours/detours.h> // Windows provides HRESULT_FROM_WIN32() but not the reverse. We need that for compat reasons. @@ -110,6 +112,13 @@ typedef UINT32 (WINAPI* GetPackageGraphRevisionIdFunction)(); HRESULT WINAPI MddDetourPackageGraphInitialize() noexcept { + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::Initialize()); + return S_OK; + } + // Detour package graph APIs to our implementation FAIL_FAST_IF_WIN32_ERROR(DetourUpdateThread(GetCurrentThread())); FAIL_FAST_IF_WIN32_ERROR(DetourAttach(&(PVOID&)TrueGetCurrentPackageInfo, DynamicGetCurrentPackageInfo)); @@ -160,6 +169,13 @@ HRESULT WINAPI MddDetourPackageGraphInitialize() noexcept HRESULT _MddDetourPackageGraphShutdown() noexcept { + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + MddCore::Win11::Shutdown(); + return S_OK; + } + // Stop Detour'ing package graph APIs to our implementation (undo in reverse order we started Detour'ing APIs) if (TrueGetPackageGraphRevisionId) { diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.cpp b/dev/DynamicDependency/API/MsixDynamicDependency.cpp index 609ba2b03a..414bfe6527 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.cpp +++ b/dev/DynamicDependency/API/MsixDynamicDependency.cpp @@ -9,6 +9,8 @@ #include "PackageDependencyManager.h" #include "PackageGraphManager.h" +#include "MddWin11.h" + STDAPI MddTryCreatePackageDependency( PSID user, _In_ PCWSTR packageFamilyName, @@ -21,7 +23,16 @@ STDAPI MddTryCreatePackageDependency( { *packageDependencyId = nullptr; - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::TryCreatePackageDependency(user, packageFamilyName, + minVersion, packageDependencyProcessorArchitectures, lifetimeKind, lifetimeArtifact, + options, packageDependencyId)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); MddCore::PackageDependencyManager::CreatePackageDependency(user, packageFamilyName, minVersion, packageDependencyProcessorArchitectures, lifetimeKind, lifetimeArtifact, options, packageDependencyId); @@ -32,7 +43,14 @@ CATCH_RETURN(); STDAPI_(void) MddDeletePackageDependency( _In_ PCWSTR packageDependencyId) noexcept try { - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + MddCore::Win11::DeletePackageDependency(packageDependencyId); + return; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process THROW_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); MddCore::PackageDependencyManager::DeletePackageDependency(packageDependencyId); @@ -52,7 +70,14 @@ STDAPI MddAddPackageDependency( *packageFullName = nullptr; } - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::AddPackageDependency(packageDependencyId, rank, options, packageDependencyContext, packageFullName)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); RETURN_IF_FAILED(MddCore::PackageGraphManager::AddToPackageGraph(packageDependencyId, rank, options, packageDependencyContext, packageFullName)); @@ -63,7 +88,14 @@ CATCH_RETURN(); STDAPI_(void) MddRemovePackageDependency( _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) noexcept try { - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + MddCore::Win11::RemovePackageDependency(packageDependencyContext); + return; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process LOG_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); MddCore::PackageGraphManager::RemoveFromPackageGraph(packageDependencyContext); @@ -76,7 +108,14 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency( { *packageFullName = nullptr; - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::GetResolvedPackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); RETURN_HR_IF(E_INVALIDARG, !packageDependencyId || (packageDependencyId[0] == L'\0')); @@ -95,7 +134,14 @@ STDAPI MddGetIdForPackageDependencyContext( { *packageDependencyId = nullptr; - // Dynamic Dependencies requires a non-packaged process + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::GetIdForPackageDependencyContext(packageDependencyContext, packageDependencyId)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); RETURN_HR_IF(E_INVALIDARG, !packageDependencyContext); @@ -110,6 +156,12 @@ CATCH_RETURN(); STDAPI_(UINT32) MddGetPackageGraphRevisionId() noexcept { + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + return MddCore::Win11::GetPackageGraphRevisionId(); + } + return MddCore::PackageGraphManager::GetPackageGraphRevisionId(); } From 8c3f01ace53fcf55a78b7a0671024844accdc50d Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 4 Jul 2023 22:14:45 -0700 Subject: [PATCH 02/18] Add new files --- dev/DynamicDependency/API/MddWin11.cpp | 158 +++++++++++++++++++++++++ dev/DynamicDependency/API/MddWin11.h | 49 ++++++++ 2 files changed, 207 insertions(+) create mode 100644 dev/DynamicDependency/API/MddWin11.cpp create mode 100644 dev/DynamicDependency/API/MddWin11.h diff --git a/dev/DynamicDependency/API/MddWin11.cpp b/dev/DynamicDependency/API/MddWin11.cpp new file mode 100644 index 0000000000..f6c9cf0f20 --- /dev/null +++ b/dev/DynamicDependency/API/MddWin11.cpp @@ -0,0 +1,158 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#include "pch.h" + +#include + +#include "MddWin11.h" + +namespace MddCore::Win11 +{ +decltype(&::TryCreatePackageDependency) g_win11TryCreatePackageDependency{}; +decltype(&::DeletePackageDependency) g_win11DeletePackageDependency{}; +decltype(&::AddPackageDependency) g_win11AddPackageDependency{}; +decltype(&::RemovePackageDependency) g_win11RemovePackageDependency{}; +decltype(&::GetResolvedPackageFullNameForPackageDependency) g_win11GetResolvedPackageFullNameForPackageDependency{}; +decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; +decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; +} + +bool MddCore::Win11::IsSupported() +{ + static bool s_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; + return s_isSupported; +} + +HRESULT MddCore::Win11::Initialize() +{ + HMODULE dllApisetAppmodelRuntime_1_6{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-6.dll", nullptr, 0) }; + FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_6); + + auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, TryCreatePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11TryCreatePackageDependency); + auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, DeletePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11DeletePackageDependency); + auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, AddPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11AddPackageDependency); + auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, RemovePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11RemovePackageDependency); + auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetResolvedPackageFullNameForPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11GetResolvedPackageFullNameForPackageDependency); + auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetIdForPackageDependencyContext) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11GetIdForPackageDependencyContext); + auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), g_win11GetPackageGraphRevisionId); + + g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; + g_win11DeletePackageDependency = win11DeletePackageDependency; + g_win11AddPackageDependency = win11AddPackageDependency; + g_win11RemovePackageDependency = win11RemovePackageDependency; + g_win11GetResolvedPackageFullNameForPackageDependency = win11GetResolvedPackageFullNameForPackageDependency; + g_win11GetIdForPackageDependencyContext = win11GetIdForPackageDependencyContext; + g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; + return S_OK; +} + +void MddCore::Win11::Shutdown() +{ + g_win11TryCreatePackageDependency = nullptr; + g_win11DeletePackageDependency = nullptr; + g_win11AddPackageDependency = nullptr; + g_win11RemovePackageDependency = nullptr; + g_win11GetResolvedPackageFullNameForPackageDependency = nullptr; + g_win11GetIdForPackageDependencyContext = nullptr; + g_win11GetPackageGraphRevisionId = nullptr; +} + +HRESULT MddCore::Win11::TryCreatePackageDependency( + PSID user, + _In_ PCWSTR packageFamilyName, + PACKAGE_VERSION minVersion, + MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + MddPackageDependencyLifetimeKind lifetimeKind, + PCWSTR lifetimeArtifact, + MddCreatePackageDependencyOptions options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) +{ + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::None) == static_cast(PackageDependencyProcessorArchitectures_None)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::Neutral) == static_cast(PackageDependencyProcessorArchitectures_Neutral)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::X86) == static_cast(PackageDependencyProcessorArchitectures_X86)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::X64) == static_cast(PackageDependencyProcessorArchitectures_X64)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::Arm) == static_cast(PackageDependencyProcessorArchitectures_Arm)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::Arm64) == static_cast(PackageDependencyProcessorArchitectures_Arm64)); + static_assert(static_cast(MddPackageDependencyProcessorArchitectures::X86OnArm64) == static_cast(PackageDependencyProcessorArchitectures_X86A64)); + auto win11PackageDependencyProcessorArchitectures{ static_cast<::PackageDependencyProcessorArchitectures>(packageDependencyProcessorArchitectures) }; + + static_assert(static_cast(MddPackageDependencyLifetimeKind::Process) == static_cast(PackageDependencyLifetimeKind_Process)); + static_assert(static_cast(MddPackageDependencyLifetimeKind::FilePath) == static_cast(PackageDependencyLifetimeKind_FilePath)); + static_assert(static_cast(MddPackageDependencyLifetimeKind::RegistryKey) == static_cast(PackageDependencyLifetimeKind_RegistryKey)); + auto win11LifetimeKind{ static_cast<::PackageDependencyLifetimeKind>(lifetimeKind) }; + + static_assert(static_cast(MddCreatePackageDependencyOptions::None) == static_cast(CreatePackageDependencyOptions_None)); + static_assert(static_cast(MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution) == static_cast(CreatePackageDependencyOptions_DoNotVerifyDependencyResolution)); + static_assert(static_cast(MddCreatePackageDependencyOptions::ScopeIsSystem) == static_cast(CreatePackageDependencyOptions_ScopeIsSystem)); + auto win11Options{ static_cast<::CreatePackageDependencyOptions>(options) }; + + RETURN_IF_FAILED(g_win11TryCreatePackageDependency(user, packageFamilyName, minVersion, + win11PackageDependencyProcessorArchitectures, win11LifetimeKind, lifetimeArtifact, + win11Options, packageDependencyId)); + return S_OK; +} + +void MddCore::Win11::DeletePackageDependency( + _In_ PCWSTR packageDependencyId) +{ + g_win11DeletePackageDependency(packageDependencyId); +} + +HRESULT MddCore::Win11::AddPackageDependency( + _In_ PCWSTR packageDependencyId, + INT32 rank, + MddAddPackageDependencyOptions options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName) +{ + static_assert(static_cast(MddAddPackageDependencyOptions::None) == static_cast(AddPackageDependencyOptions_None)); + static_assert(static_cast(MddAddPackageDependencyOptions::PrependIfRankCollision) == static_cast(AddPackageDependencyOptions_PrependIfRankCollision)); + auto win11Options{ static_cast<::AddPackageDependencyOptions>(options) }; + + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(g_win11AddPackageDependency(packageDependencyId, rank, win11Options, win11PackageDependencyContext, packageFullName)); + return S_OK; +} + +void MddCore::Win11::RemovePackageDependency( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) +{ + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + g_win11RemovePackageDependency(win11PackageDependencyContext); +} + +HRESULT MddCore::Win11::GetResolvedPackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) +{ + RETURN_IF_FAILED(g_win11GetResolvedPackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + return S_OK; +} + +HRESULT MddCore::Win11::GetIdForPackageDependencyContext( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) +{ + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(g_win11GetIdForPackageDependencyContext(win11PackageDependencyContext, packageDependencyId)); + return S_OK; +} + +UINT32 MddCore::Win11::GetPackageGraphRevisionId() +{ + return g_win11GetPackageGraphRevisionId(); +} diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h new file mode 100644 index 0000000000..c77a47e281 --- /dev/null +++ b/dev/DynamicDependency/API/MddWin11.h @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation and Contributors. +// Licensed under the MIT License. + +#if !defined(MDDWIN11DYNAMICDEPENDENCY_H) +#define MDDWIN11DYNAMICDEPENDENCY_H + +namespace MddCore::Win11 +{ +bool IsSupported(); + +HRESULT Initialize(); + +void Shutdown(); + +HRESULT TryCreatePackageDependency( + PSID user, + _In_ PCWSTR packageFamilyName, + PACKAGE_VERSION minVersion, + MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + MddPackageDependencyLifetimeKind lifetimeKind, + PCWSTR lifetimeArtifact, + MddCreatePackageDependencyOptions options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId); + +void DeletePackageDependency( + _In_ PCWSTR packageDependencyId); + +HRESULT AddPackageDependency( + _In_ PCWSTR packageDependencyId, + INT32 rank, + MddAddPackageDependencyOptions options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName); + +void RemovePackageDependency( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext); + +HRESULT GetResolvedPackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName); + +HRESULT GetIdForPackageDependencyContext( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, + _Outptr_result_maybenull_ PWSTR* packageDependencyId); + +UINT32 GetPackageGraphRevisionId(); +} + +#endif // MDDWIN11DYNAMICDEPENDENCY_H From 4c9e0a83d965527b970b0a9cd5a522f4d1289848 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Thu, 26 Oct 2023 21:15:11 -0700 Subject: [PATCH 03/18] Bootstrapper compiles! Dirty hack needs cleaning up but the initial work is done. Cleanup and test revisions needed but progress --- .../API/DynamicDependency.vcxitems | 1 - .../API/DynamicDependency.vcxitems.filters | 3 - .../API/MddDetourPackageGraph.cpp | 6 +- dev/DynamicDependency/API/MddWin11.cpp | 256 -------------- dev/DynamicDependency/API/MddWin11.h | 334 ++++++++++++++---- .../MddBootstrap.cpp | 177 ++++++---- .../framework.h | 2 + 7 files changed, 392 insertions(+), 387 deletions(-) delete mode 100644 dev/DynamicDependency/API/MddWin11.cpp diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems b/dev/DynamicDependency/API/DynamicDependency.vcxitems index e5f3fa55ae..9f8cfc64cc 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems @@ -23,7 +23,6 @@ - diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters index 293f21384c..d9841d40fd 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters @@ -50,9 +50,6 @@ Source Files - - Source Files - Source Files diff --git a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp index 0717bbda0a..31c63cc58f 100644 --- a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp +++ b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -115,7 +115,7 @@ HRESULT WINAPI MddDetourPackageGraphInitialize() noexcept // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - RETURN_IF_FAILED(MddCore::Win11::Initialize()); + RETURN_IF_FAILED(MddWin11Initialize()); return S_OK; } @@ -172,7 +172,7 @@ HRESULT _MddDetourPackageGraphShutdown() noexcept // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - MddCore::Win11::Shutdown(); + MddWin11Shutdown(); return S_OK; } diff --git a/dev/DynamicDependency/API/MddWin11.cpp b/dev/DynamicDependency/API/MddWin11.cpp deleted file mode 100644 index cca5dad052..0000000000 --- a/dev/DynamicDependency/API/MddWin11.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright (c) Microsoft Corporation and Contributors. -// Licensed under the MIT License. - -#include "pch.h" - -#include - -#include "MddWin11.h" - -namespace MddCore::Win11 -{ -static HMODULE g_dllApisetAppmodelRuntime_1_6{}; -static decltype(&::TryCreatePackageDependency) g_win11TryCreatePackageDependency{}; -static decltype(&::DeletePackageDependency) g_win11DeletePackageDependency{}; -static decltype(&::AddPackageDependency) g_win11AddPackageDependency{}; -static decltype(&::RemovePackageDependency) g_win11RemovePackageDependency{}; -static decltype(&::GetResolvedPackageFullNameForPackageDependency) g_win11GetResolvedPackageFullNameForPackageDependency{}; -static decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; -static decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; - -constexpr PackageDependencyLifetimeKind ToLifetimeKind(MddPackageDependencyLifetimeKind lifetimeKind) -{ - switch (lifetimeKind) - { - case MddPackageDependencyLifetimeKind::Process: return PackageDependencyLifetimeKind_Process; - case MddPackageDependencyLifetimeKind::FilePath: return PackageDependencyLifetimeKind_FilePath; - case MddPackageDependencyLifetimeKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; - default: THROW_HR_MSG(E_UNEXPECTED, "Unknown MddPackageDependencyLifetimeKind (%d)", lifetimeKind); - }; -} - -constexpr PackageDependencyLifetimeKind ToLifetimeKind(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind lifetimeKind) -{ - switch (lifetimeKind) - { - case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::Process: return PackageDependencyLifetimeKind_Process; - case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::FilePath: return PackageDependencyLifetimeKind_FilePath; - case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; - default: THROW_HR_MSG(E_UNEXPECTED, "Unknown winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeKind (%d)", lifetimeKind); - }; -} -} - -HRESULT WINAPI MddWin11Initialize() noexcept -{ - if (!MddCore::Win11::IsSupported()) - { - return S_OK; - } - - HMODULE dllApisetAppmodelRuntime_1_6{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-6.dll", nullptr, 0) }; - FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_6); - - auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, TryCreatePackageDependency) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11TryCreatePackageDependency); - auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, DeletePackageDependency) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11DeletePackageDependency); - auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, AddPackageDependency) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11AddPackageDependency); - auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, RemovePackageDependency) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11RemovePackageDependency); - auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetResolvedPackageFullNameForPackageDependency) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency); - auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetIdForPackageDependencyContext) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetIdForPackageDependencyContext); - auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); - - MddCore::Win11::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; - MddCore::Win11::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; - MddCore::Win11::g_win11DeletePackageDependency = win11DeletePackageDependency; - MddCore::Win11::g_win11AddPackageDependency = win11AddPackageDependency; - MddCore::Win11::g_win11RemovePackageDependency = win11RemovePackageDependency; - MddCore::Win11::g_win11GetResolvedPackageFullNameForPackageDependency = win11GetResolvedPackageFullNameForPackageDependency; - MddCore::Win11::g_win11GetIdForPackageDependencyContext = win11GetIdForPackageDependencyContext; - MddCore::Win11::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; - return S_OK; -} - -HRESULT WINAPI MddWin11Shutdown() noexcept -{ - if (MddCore::Win11::g_dllApisetAppmodelRuntime_1_6) - { - MddCore::Win11::g_win11TryCreatePackageDependency = nullptr; - MddCore::Win11::g_win11DeletePackageDependency = nullptr; - MddCore::Win11::g_win11AddPackageDependency = nullptr; - MddCore::Win11::g_win11RemovePackageDependency = nullptr; - MddCore::Win11::g_win11GetResolvedPackageFullNameForPackageDependency = nullptr; - MddCore::Win11::g_win11GetIdForPackageDependencyContext = nullptr; - MddCore::Win11::g_win11GetPackageGraphRevisionId = nullptr; - FreeLibrary(MddCore::Win11::g_dllApisetAppmodelRuntime_1_6); - MddCore::Win11::g_dllApisetAppmodelRuntime_1_6 = nullptr; - } - return S_OK; -} - -bool MddCore::Win11::IsSupported() -{ - static bool s_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; - return s_isSupported; -} - -HRESULT MddCore::Win11::TryCreatePackageDependency( - PSID user, - const winrt::hstring& packageFamilyName, - const winrt::Windows::ApplicationModel::PackageVersion& minVersion, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, - _Outptr_result_maybenull_ PWSTR* packageDependencyId) -{ - PCWSTR win11PackageFamilyName{ packageFamilyName.c_str() }; - - const ::AppModel::Identity::PackageVersion minPackageVersion{ minVersion }; - const PACKAGE_VERSION win11MinVersion{ minPackageVersion }; - - auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64)); - - const auto win11LifetimeKind{ ToLifetimeKind(options.LifetimeArtifactKind()) }; - - PCWSTR win11LifetimeArtifact{ options.LifetimeArtifact().c_str() }; - - auto win11Options{ CreatePackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, !options.VerifyDependencyResolution()); - //TODO CreatePackageDependencyOptions_ScopeIsSystem - - RETURN_IF_FAILED(g_win11TryCreatePackageDependency(user, win11PackageFamilyName, win11MinVersion, - win11PackageDependencyProcessorArchitectures, win11LifetimeKind, win11LifetimeArtifact, - win11Options, packageDependencyId)); - return S_OK; -} - -HRESULT MddCore::Win11::TryCreatePackageDependency( - PSID user, - _In_ PCWSTR packageFamilyName, - PACKAGE_VERSION minVersion, - MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, - MddPackageDependencyLifetimeKind lifetimeKind, - PCWSTR lifetimeArtifact, - MddCreatePackageDependencyOptions options, - _Outptr_result_maybenull_ PWSTR* packageDependencyId) -{ - const ::AppModel::Identity::PackageVersion win11MinVersion{ minVersion }; - - auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Neutral)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86OnArm64)); - - const auto win11LifetimeKind{ ToLifetimeKind(lifetimeKind) }; - - auto win11Options{ CreatePackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution)); - WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_ScopeIsSystem, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::ScopeIsSystem)); - - RETURN_IF_FAILED(g_win11TryCreatePackageDependency(user, packageFamilyName, win11MinVersion, - win11PackageDependencyProcessorArchitectures, win11LifetimeKind, lifetimeArtifact, - win11Options, packageDependencyId)); - return S_OK; -} - -void MddCore::Win11::DeletePackageDependency( - const winrt::hstring& packageDependencyId) -{ - DeletePackageDependency(packageDependencyId.c_str()); -} - -void MddCore::Win11::DeletePackageDependency( - _In_ PCWSTR packageDependencyId) -{ - (void)LOG_IF_FAILED(g_win11DeletePackageDependency(packageDependencyId)); -} - -HRESULT MddCore::Win11::AddPackageDependency( - const winrt::hstring& packageDependencyId, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, - _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, - _Outptr_opt_result_maybenull_ PWSTR* packageFullName) -{ - PCWSTR win11PackageDependencyId{ packageDependencyId.c_str() }; - - const auto win11Rank{ options.Rank() }; - - auto win11Options{ AddPackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, options.PrependIfRankCollision()); - - static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); - auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; - - RETURN_IF_FAILED(g_win11AddPackageDependency(win11PackageDependencyId, win11Rank, win11Options, win11PackageDependencyContext, packageFullName)); - return S_OK; -} - -HRESULT MddCore::Win11::AddPackageDependency( - _In_ PCWSTR packageDependencyId, - INT32 rank, - MddAddPackageDependencyOptions options, - _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, - _Outptr_opt_result_maybenull_ PWSTR* packageFullName) -{ - auto win11Options{ AddPackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, WI_IsFlagSet(options, MddAddPackageDependencyOptions::PrependIfRankCollision)); - - static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); - auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; - - RETURN_IF_FAILED(g_win11AddPackageDependency(packageDependencyId, rank, win11Options, win11PackageDependencyContext, packageFullName)); - return S_OK; -} - -void MddCore::Win11::RemovePackageDependency( - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId) -{ - return RemovePackageDependency(ToContext(packageDependencyContextId)); -} - -void MddCore::Win11::RemovePackageDependency( - _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) -{ - static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); - auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; - - g_win11RemovePackageDependency(win11PackageDependencyContext); -} - -HRESULT MddCore::Win11::GetResolvedPackageFullNameForPackageDependency( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName) -{ - RETURN_IF_FAILED(g_win11GetResolvedPackageFullNameForPackageDependency(packageDependencyId, packageFullName)); - return S_OK; -} - -HRESULT MddCore::Win11::GetIdForPackageDependencyContext( - _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, - _Outptr_result_maybenull_ PWSTR* packageDependencyId) -{ - static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); - auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; - - RETURN_IF_FAILED(g_win11GetIdForPackageDependencyContext(win11PackageDependencyContext, packageDependencyId)); - return S_OK; -} - -UINT32 MddCore::Win11::GetPackageGraphRevisionId() -{ - return g_win11GetPackageGraphRevisionId(); -} diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index 8b0f6bef92..d984770551 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -5,78 +5,284 @@ #define MDDWIN11DYNAMICDEPENDENCY_H #include -#include +//TODO #include -HRESULT WINAPI MddWin11Initialize() noexcept; - -HRESULT WINAPI MddWin11Shutdown() noexcept; +#include namespace MddCore::Win11 { -bool IsSupported(); - -HRESULT TryCreatePackageDependency( - PSID user, - const winrt::hstring& packageFamilyName, - const winrt::Windows::ApplicationModel::PackageVersion& minVersion, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, - _Outptr_result_maybenull_ PWSTR* packageDependencyId); - -HRESULT TryCreatePackageDependency( - PSID user, - _In_ PCWSTR packageFamilyName, - PACKAGE_VERSION minVersion, - MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, - MddPackageDependencyLifetimeKind lifetimeKind, - PCWSTR lifetimeArtifact, - MddCreatePackageDependencyOptions options, - _Outptr_result_maybenull_ PWSTR* packageDependencyId); - -void DeletePackageDependency( - const winrt::hstring& packageDependencyId); - -void DeletePackageDependency( - _In_ PCWSTR packageDependencyId); - -HRESULT AddPackageDependency( - const winrt::hstring& packageDependencyId, - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, - _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, - _Outptr_opt_result_maybenull_ PWSTR* packageFullName); - -HRESULT AddPackageDependency( - _In_ PCWSTR packageDependencyId, - std::int32_t rank, - MddAddPackageDependencyOptions options, - _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, - _Outptr_opt_result_maybenull_ PWSTR* packageFullName); - -void RemovePackageDependency( - winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId); - -void RemovePackageDependency( - _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext); - -HRESULT GetResolvedPackageFullNameForPackageDependency( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName); - -HRESULT GetIdForPackageDependencyContext( - _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, - _Outptr_result_maybenull_ PWSTR* packageDependencyId); - -UINT32 GetPackageGraphRevisionId(); - -inline winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId ToContextId(MDD_PACKAGEDEPENDENCY_CONTEXT context) -{ - return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId{ static_cast(reinterpret_cast(context)) }; + namespace details + { + __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_6{}; + __declspec(selectany) decltype(&::TryCreatePackageDependency) g_win11TryCreatePackageDependency{}; + __declspec(selectany) decltype(&::DeletePackageDependency) g_win11DeletePackageDependency{}; + __declspec(selectany) decltype(&::AddPackageDependency) g_win11AddPackageDependency{}; + __declspec(selectany) decltype(&::RemovePackageDependency) g_win11RemovePackageDependency{}; + __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency) g_win11GetResolvedPackageFullNameForPackageDependency{}; + __declspec(selectany) decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; + __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; + + __declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; + + constexpr PackageDependencyLifetimeKind ToLifetimeKind(MddPackageDependencyLifetimeKind lifetimeKind) + { + switch (lifetimeKind) + { + case MddPackageDependencyLifetimeKind::Process: return PackageDependencyLifetimeKind_Process; + case MddPackageDependencyLifetimeKind::FilePath: return PackageDependencyLifetimeKind_FilePath; + case MddPackageDependencyLifetimeKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown MddPackageDependencyLifetimeKind (%d)", lifetimeKind); + }; + } + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + constexpr PackageDependencyLifetimeKind ToLifetimeKind(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind lifetimeKind) + { + switch (lifetimeKind) + { + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::Process: return PackageDependencyLifetimeKind_Process; + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::FilePath: return PackageDependencyLifetimeKind_FilePath; + case winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::RegistryKey: return PackageDependencyLifetimeKind_RegistryKey; + default: THROW_HR_MSG(E_UNEXPECTED, "Unknown winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeKind (%d)", lifetimeKind); + }; + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + } + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + inline winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId ToContextId(MDD_PACKAGEDEPENDENCY_CONTEXT context) + { + return winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId{ static_cast(reinterpret_cast(context)) }; + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + inline MDD_PACKAGEDEPENDENCY_CONTEXT ToContext(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId contextId) + { + return reinterpret_cast(static_cast(contextId.Id)); + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + + inline bool IsSupported() + { + return MddCore::Win11::details::g_isSupported; + } + + inline HRESULT TryCreatePackageDependency( + PSID user, + _In_ PCWSTR packageFamilyName, + PACKAGE_VERSION minVersion, + MddPackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + MddPackageDependencyLifetimeKind lifetimeKind, + PCWSTR lifetimeArtifact, + MddCreatePackageDependencyOptions options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) + { + const ::AppModel::Identity::PackageVersion win11MinVersion{ minVersion }; + + auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Neutral)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::Arm64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, MddPackageDependencyProcessorArchitectures::X86OnArm64)); + + const auto win11LifetimeKind{ MddCore::Win11::details::ToLifetimeKind(lifetimeKind) }; + + auto win11Options{ CreatePackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution)); + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_ScopeIsSystem, WI_IsFlagSet(options, MddCreatePackageDependencyOptions::ScopeIsSystem)); + + RETURN_IF_FAILED(MddCore::Win11::details::g_win11TryCreatePackageDependency(user, packageFamilyName, win11MinVersion, + win11PackageDependencyProcessorArchitectures, win11LifetimeKind, lifetimeArtifact, + win11Options, packageDependencyId)); + return S_OK; + } + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) +//TODO reimplement over above + inline HRESULT TryCreatePackageDependency( + PSID user, + const winrt::hstring& packageFamilyName, + const winrt::Windows::ApplicationModel::PackageVersion& minVersion, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) + { + PCWSTR win11PackageFamilyName{ packageFamilyName.c_str() }; + + const ::AppModel::Identity::PackageVersion minPackageVersion{ minVersion }; + const PACKAGE_VERSION win11MinVersion{ minPackageVersion }; + + auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64)); + WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64)); + + const auto win11LifetimeKind{ MddCore::Win11::details::ToLifetimeKind(options.LifetimeArtifactKind()) }; + + PCWSTR win11LifetimeArtifact{ options.LifetimeArtifact().c_str() }; + + auto win11Options{ CreatePackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, !options.VerifyDependencyResolution()); + //TODO CreatePackageDependencyOptions_ScopeIsSystem + + RETURN_IF_FAILED(MddCore::Win11::details::g_win11TryCreatePackageDependency(user, win11PackageFamilyName, win11MinVersion, + win11PackageDependencyProcessorArchitectures, win11LifetimeKind, win11LifetimeArtifact, + win11Options, packageDependencyId)); + return S_OK; + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + + inline void DeletePackageDependency( + const winrt::hstring& packageDependencyId) + { + DeletePackageDependency(packageDependencyId.c_str()); + } + + inline void DeletePackageDependency( + _In_ PCWSTR packageDependencyId) + { + (void)LOG_IF_FAILED(MddCore::Win11::details::g_win11DeletePackageDependency(packageDependencyId)); + } + + inline HRESULT AddPackageDependency( + _In_ PCWSTR packageDependencyId, + std::int32_t rank, + MddAddPackageDependencyOptions options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName) + { + auto win11Options{ AddPackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, WI_IsFlagSet(options, MddAddPackageDependencyOptions::PrependIfRankCollision)); + + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(MddCore::Win11::details::g_win11AddPackageDependency(packageDependencyId, rank, win11Options, win11PackageDependencyContext, packageFullName)); + return S_OK; + } + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) +//TODO reimplement over above + inline HRESULT AddPackageDependency( + const winrt::hstring& packageDependencyId, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, + _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, + _Outptr_opt_result_maybenull_ PWSTR* packageFullName) + { + PCWSTR win11PackageDependencyId{ packageDependencyId.c_str() }; + + const auto win11Rank{ options.Rank() }; + + auto win11Options{ AddPackageDependencyOptions_None }; + WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, options.PrependIfRankCollision()); + + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(MddCore::Win11::details::g_win11AddPackageDependency(win11PackageDependencyId, win11Rank, win11Options, win11PackageDependencyContext, packageFullName)); + return S_OK; + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + + inline void RemovePackageDependency( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) + { + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + MddCore::Win11::details::g_win11RemovePackageDependency(win11PackageDependencyContext); + } + +#if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + inline void RemovePackageDependency( + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId packageDependencyContextId) + { + return RemovePackageDependency(MddCore::Win11::ToContext(packageDependencyContextId)); + } +#endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + + inline HRESULT GetResolvedPackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) + { + RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + return S_OK; + } + + inline HRESULT GetIdForPackageDependencyContext( + _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) + { + static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); + auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; + + RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetIdForPackageDependencyContext(win11PackageDependencyContext, packageDependencyId)); + return S_OK; + } + + inline UINT32 GetPackageGraphRevisionId() + { + return MddCore::Win11::details::g_win11GetPackageGraphRevisionId(); + } } -inline MDD_PACKAGEDEPENDENCY_CONTEXT ToContext(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyContextId contextId) +inline HRESULT WINAPI MddWin11Initialize() noexcept { - return reinterpret_cast(static_cast(contextId.Id)); + if (!MddCore::Win11::IsSupported()) + { + return S_OK; + } + + HMODULE dllApisetAppmodelRuntime_1_6{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-6.dll", nullptr, 0) }; + FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_6); + + auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, TryCreatePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11TryCreatePackageDependency); + auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, DeletePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11DeletePackageDependency); + auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, AddPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11AddPackageDependency); + auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, RemovePackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11RemovePackageDependency); + auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetResolvedPackageFullNameForPackageDependency) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency); + auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetIdForPackageDependencyContext) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetIdForPackageDependencyContext); + auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); + + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; + MddCore::Win11::details::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; + MddCore::Win11::details::g_win11DeletePackageDependency = win11DeletePackageDependency; + MddCore::Win11::details::g_win11AddPackageDependency = win11AddPackageDependency; + MddCore::Win11::details::g_win11RemovePackageDependency = win11RemovePackageDependency; + MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency = win11GetResolvedPackageFullNameForPackageDependency; + MddCore::Win11::details::g_win11GetIdForPackageDependencyContext = win11GetIdForPackageDependencyContext; + MddCore::Win11::details::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; + return S_OK; } + +inline HRESULT WINAPI MddWin11Shutdown() noexcept +{ + if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6) + { + MddCore::Win11::details::g_win11TryCreatePackageDependency = nullptr; + MddCore::Win11::details::g_win11DeletePackageDependency = nullptr; + MddCore::Win11::details::g_win11AddPackageDependency = nullptr; + MddCore::Win11::details::g_win11RemovePackageDependency = nullptr; + MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency = nullptr; + MddCore::Win11::details::g_win11GetIdForPackageDependencyContext = nullptr; + MddCore::Win11::details::g_win11GetPackageGraphRevisionId = nullptr; + FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6); + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = nullptr; + } + return S_OK; } #endif // MDDWIN11DYNAMICDEPENDENCY_H diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index f6baf144e4..1d774604a3 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -10,6 +10,8 @@ #include "IDynamicDependencyLifetimeManager.h" +#include "MddWin11.h" + #include HRESULT _MddBootstrapInitialize( @@ -353,72 +355,127 @@ void FirstTimeInitialization( // Make a copy of the versionTag in preparation of succcess auto packageVersionTag{ std::wstring(!versionTag ? L"" : versionTag) }; - // Create the lifetime manager - wil::com_ptr_nothrow lifetimeManager; - wil::unique_event endTheLifetimeManagerEvent; - auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; - CreateLifetimeManager(majorMinorVersion, versionTag, minVersion, lifetimeManager, endTheLifetimeManagerEvent, activityContext.GetInitializationPackageFullName()); - - const PACKAGE_INFO* frameworkPackageInfo{}; - auto packageInfoBuffer{ GetFrameworkPackageInfoForPackage(activityContext.GetInitializationPackageFullName().get(), frameworkPackageInfo) }; + // Use the Win11 APIs if available (instead of WinAppSDK's implementation) +//TODO optimize common code + if (MddCore::Win11::IsSupported()) + { + // Add the framework package to the package graph + auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; + const PACKAGE_INFO* frameworkPackageInfo{}; + auto packageInfoBuffer{ GetFrameworkPackageInfoForPackage(activityContext.GetInitializationPackageFullName().get(), frameworkPackageInfo) }; + + const MddPackageDependencyProcessorArchitectures architectureFilter{}; + const auto lifetimeKind{ MddPackageDependencyLifetimeKind::Process }; + const MddCreatePackageDependencyOptions createOptions{}; + wil::unique_process_heap_string packageDependencyId; + THROW_IF_FAILED(MddCore::Win11::TryCreatePackageDependency(nullptr, frameworkPackageInfo->packageFamilyName, minVersion, architectureFilter, lifetimeKind, nullptr, createOptions, &packageDependencyId)); + // + const MddAddPackageDependencyOptions addOptions{}; + MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext{}; + wil::unique_process_heap_string packageFullName; + THROW_IF_FAILED(MddCore::Win11::AddPackageDependency(packageDependencyId.get(), MDD_PACKAGE_DEPENDENCY_RANK_DEFAULT, addOptions, &packageDependencyContext, &packageFullName)); - // Temporarily add the framework's package directory to PATH so LoadLibrary can find it and any colocated imports - wil::unique_dll_directory_cookie dllDirectoryCookie{ AddFrameworkToPath(frameworkPackageInfo->path) }; + // Pass along test information (if necessary) + if (!g_test_ddlmPackageNamePrefix.empty()) + { + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_ddlmPackagePublisherId.empty()); + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_frameworkPackageNamePrefix.empty()); + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_mainPackageNamePrefix.empty()); + + uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; + uint16_t minorVersion{ static_cast(majorMinorVersion) }; + PCWSTR packagVersionTagDelimiter{ packageVersionTag.empty() ? L"" : L"-" }; + + WCHAR frameworkPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + wsprintf(frameworkPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_frameworkPackageNamePrefix.c_str(), + majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); + + WCHAR mainPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + wsprintf(mainPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_mainPackageNamePrefix.c_str(), + majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); + ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName); + } - auto windowsAppRuntimeDllFilename{ std::wstring(frameworkPackageInfo->path) + L"\\Microsoft.WindowsAppRuntime.dll" }; - wil::unique_hmodule windowsAppRuntimeDll(LoadLibraryEx(windowsAppRuntimeDllFilename.c_str(), nullptr, LOAD_WITH_ALTERED_SEARCH_PATH)); - if (!windowsAppRuntimeDll) - { - const auto lastError{ GetLastError() }; - THROW_WIN32_MSG(lastError, "Error in LoadLibrary: %d (0x%X) loading %ls", lastError, lastError, windowsAppRuntimeDllFilename.c_str()); + // Track our initialized state + //TODO g_lifetimeManager = lifetimeManager.detach(); + //TODO g_endTheLifetimeManagerEvent = std::move(endTheLifetimeManagerEvent); + //TODO g_windowsAppRuntimeDll = std::move(windowsAppRuntimeDll); + g_packageDependencyId = std::move(packageDependencyId); + g_packageDependencyContext = packageDependencyContext; + // + g_initializationMajorMinorVersion = majorMinorVersion; + g_initializationVersionTag = std::move(packageVersionTag); + g_initializationFrameworkPackageVersion.Version = frameworkPackageInfo->packageId.version.Version; } + else + { + // Create the lifetime manager + wil::com_ptr_nothrow lifetimeManager; + wil::unique_event endTheLifetimeManagerEvent; + auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; + CreateLifetimeManager(majorMinorVersion, versionTag, minVersion, lifetimeManager, endTheLifetimeManagerEvent, activityContext.GetInitializationPackageFullName()); - // Add the framework package to the package graph - const MddPackageDependencyProcessorArchitectures architectureFilter{}; - const auto lifetimeKind{ MddPackageDependencyLifetimeKind::Process }; - const MddCreatePackageDependencyOptions createOptions{}; - wil::unique_process_heap_string packageDependencyId; - THROW_IF_FAILED(MddTryCreatePackageDependency(nullptr, frameworkPackageInfo->packageFamilyName, minVersion, architectureFilter, lifetimeKind, nullptr, createOptions, &packageDependencyId)); - // - const MddAddPackageDependencyOptions addOptions{}; - MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext{}; - THROW_IF_FAILED(MddAddPackageDependency(packageDependencyId.get(), MDD_PACKAGE_DEPENDENCY_RANK_DEFAULT, addOptions, &packageDependencyContext, nullptr)); + const PACKAGE_INFO* frameworkPackageInfo{}; + auto packageInfoBuffer{ GetFrameworkPackageInfoForPackage(activityContext.GetInitializationPackageFullName().get(), frameworkPackageInfo) }; - // Remove our temporary path addition - RemoveFrameworkFromPath(frameworkPackageInfo->path); - dllDirectoryCookie.reset(); + // Temporarily add the framework's package directory to PATH so LoadLibrary can find it and any colocated imports + wil::unique_dll_directory_cookie dllDirectoryCookie{ AddFrameworkToPath(frameworkPackageInfo->path) }; - // Pass along test information (if necessary) - if (!g_test_ddlmPackageNamePrefix.empty()) - { - FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_ddlmPackagePublisherId.empty()); - FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_frameworkPackageNamePrefix.empty()); - FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_mainPackageNamePrefix.empty()); - - uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; - uint16_t minorVersion{ static_cast(majorMinorVersion) }; - PCWSTR packagVersionTagDelimiter{ packageVersionTag.empty() ? L"" : L"-" }; - - WCHAR frameworkPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(frameworkPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_frameworkPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); - - WCHAR mainPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(mainPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_mainPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); - ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName); - } + auto windowsAppRuntimeDllFilename{ std::wstring(frameworkPackageInfo->path) + L"\\Microsoft.WindowsAppRuntime.dll" }; + wil::unique_hmodule windowsAppRuntimeDll(LoadLibraryEx(windowsAppRuntimeDllFilename.c_str(), nullptr, LOAD_WITH_ALTERED_SEARCH_PATH)); + if (!windowsAppRuntimeDll) + { + const auto lastError{ GetLastError() }; + THROW_WIN32_MSG(lastError, "Error in LoadLibrary: %d (0x%X) loading %ls", lastError, lastError, windowsAppRuntimeDllFilename.c_str()); + } - // Track our initialized state - g_lifetimeManager = lifetimeManager.detach(); - g_endTheLifetimeManagerEvent = std::move(endTheLifetimeManagerEvent); - g_windowsAppRuntimeDll = std::move(windowsAppRuntimeDll); - g_packageDependencyId = std::move(packageDependencyId); - g_packageDependencyContext = packageDependencyContext; - // - g_initializationMajorMinorVersion = majorMinorVersion; - g_initializationVersionTag = std::move(packageVersionTag); - g_initializationFrameworkPackageVersion.Version = frameworkPackageInfo->packageId.version.Version; + // Add the framework package to the package graph + const MddPackageDependencyProcessorArchitectures architectureFilter{}; + const auto lifetimeKind{ MddPackageDependencyLifetimeKind::Process }; + const MddCreatePackageDependencyOptions createOptions{}; + wil::unique_process_heap_string packageDependencyId; + THROW_IF_FAILED(MddTryCreatePackageDependency(nullptr, frameworkPackageInfo->packageFamilyName, minVersion, architectureFilter, lifetimeKind, nullptr, createOptions, &packageDependencyId)); + // + const MddAddPackageDependencyOptions addOptions{}; + MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext{}; + THROW_IF_FAILED(MddAddPackageDependency(packageDependencyId.get(), MDD_PACKAGE_DEPENDENCY_RANK_DEFAULT, addOptions, &packageDependencyContext, nullptr)); + + // Remove our temporary path addition + RemoveFrameworkFromPath(frameworkPackageInfo->path); + dllDirectoryCookie.reset(); + + // Pass along test information (if necessary) + if (!g_test_ddlmPackageNamePrefix.empty()) + { + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_ddlmPackagePublisherId.empty()); + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_frameworkPackageNamePrefix.empty()); + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_mainPackageNamePrefix.empty()); + + uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; + uint16_t minorVersion{ static_cast(majorMinorVersion) }; + PCWSTR packagVersionTagDelimiter{ packageVersionTag.empty() ? L"" : L"-" }; + + WCHAR frameworkPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + wsprintf(frameworkPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_frameworkPackageNamePrefix.c_str(), + majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); + + WCHAR mainPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + wsprintf(mainPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_mainPackageNamePrefix.c_str(), + majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); + ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName); + } + + // Track our initialized state + g_lifetimeManager = lifetimeManager.detach(); + g_endTheLifetimeManagerEvent = std::move(endTheLifetimeManagerEvent); + g_windowsAppRuntimeDll = std::move(windowsAppRuntimeDll); + g_packageDependencyId = std::move(packageDependencyId); + g_packageDependencyContext = packageDependencyContext; + // + g_initializationMajorMinorVersion = majorMinorVersion; + g_initializationVersionTag = std::move(packageVersionTag); + g_initializationFrameworkPackageVersion.Version = frameworkPackageInfo->packageId.version.Version; + } } /// Determine the path for the Windows App Runtime Framework package diff --git a/dev/WindowsAppRuntime_BootstrapDLL/framework.h b/dev/WindowsAppRuntime_BootstrapDLL/framework.h index 7fb011d015..81035d28eb 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/framework.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/framework.h @@ -30,3 +30,5 @@ #include #include "wil_msixdynamicdependency.h" + +//TODO #include From bba32bfb206fde17925a9e0a208c1c6cf5ab0ee6 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 30 Oct 2023 13:51:06 -0700 Subject: [PATCH 04/18] Remove MSIXInstallFromPath - prototype/attempt to enhance VS experience during early 1.x days but not moved forward and starting to age out. Removed rather than continuing upkeep --- WindowsAppRuntime.sln | 18 - build/CopyFilesToStagingDir.ps1 | 4 - ...dowsAppRuntime_MSIXInstallFromPath.filters | 36 -- ...dowsAppRuntime_MSIXInstallFromPath.vcxproj | 252 -------------- .../framework.h | 27 -- .../main.cpp | 325 ------------------ .../packages.config | 7 - .../pch.cpp | 6 - .../pch.h | 16 - 9 files changed, 691 deletions(-) delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.filters delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.vcxproj delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/framework.h delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/main.cpp delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/packages.config delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/pch.cpp delete mode 100644 dev/WindowsAppRuntime_MSIXInstallFromPath/pch.h diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln index e9bd3244f5..ab84193876 100644 --- a/WindowsAppRuntime.sln +++ b/WindowsAppRuntime.sln @@ -261,8 +261,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Process.Environme EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChangeTracker", "dev\EnvironmentManager\ChangeTracker\ChangeTracker.vcxitems", "{E15C3465-9D45-495D-92CE-B91EF45E8623}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WindowsAppRuntime_MSIXInstallFromPath", "dev\WindowsAppRuntime_MSIXInstallFromPath\WindowsAppRuntime_MSIXInstallFromPath.vcxproj", "{D45D4170-E055-4926-8B03-04DAA5F02C6C}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Framework.Widgets", "test\DynamicDependency\data\Framework.Widgets\Framework.Widgets.vcxproj", "{09DDAE21-397F-4263-8561-7F2FF28127CF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DynamicDependencyLifetimeManagerShadow", "dev\DynamicDependency\DynamicDependencyLifetimeManagerShadow\DynamicDependencyLifetimeManagerShadow.vcxproj", "{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}" @@ -1315,20 +1313,6 @@ Global {0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x64.Build.0 = Release|x64 {0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x86.ActiveCfg = Release|Win32 {0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x86.Build.0 = Release|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|ARM64.Build.0 = Debug|ARM64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x64.ActiveCfg = Debug|x64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x64.Build.0 = Debug|x64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x86.ActiveCfg = Debug|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x86.Build.0 = Debug|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|Any CPU.ActiveCfg = Release|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|ARM64.ActiveCfg = Release|ARM64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|ARM64.Build.0 = Release|ARM64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x64.ActiveCfg = Release|x64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x64.Build.0 = Release|x64 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x86.ActiveCfg = Release|Win32 - {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x86.Build.0 = Release|Win32 {09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|Any CPU.ActiveCfg = Debug|Win32 {09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|ARM64.Build.0 = Debug|ARM64 @@ -2470,7 +2454,6 @@ Global {6967798A-AC07-4994-8FE9-DC9442F88E97} = {B4196B13-AB24-492E-9147-03CC7F2CAE59} {2F3FAD1B-D3DF-4866-A3A3-C2C777D55638} = {8ABB3637-75DB-4DC3-BFB1-0933FFA4269B} {E15C3465-9D45-495D-92CE-B91EF45E8623} = {6967798A-AC07-4994-8FE9-DC9442F88E97} - {D45D4170-E055-4926-8B03-04DAA5F02C6C} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A} {09DDAE21-397F-4263-8561-7F2FF28127CF} = {0C534F12-B076-47E5-A05B-2A711233AC6F} {6539E9E1-BF36-40E5-86BC-070E99DB7B7B} = {6CD01EF6-D4A4-4801-ADCF-344CF87FF942} {4B30C685-8490-440F-9879-A75D45DAA361} = {AC5FFC80-92FE-4933-BED2-EC5519AC4440} @@ -2634,7 +2617,6 @@ Global dev\DynamicDependency\API\DynamicDependency.vcxitems*{bf055a59-0919-4e34-9b76-dd055495cc5a}*SharedItemsImports = 9 test\inc\inc.vcxitems*{c62688a1-16a0-4729-b6ed-842f4faa29f3}*SharedItemsImports = 4 dev\AccessControl\AccessControl.vcxitems*{c91bcb93-9ed1-4acd-85f3-26f9f6ac52e3}*SharedItemsImports = 9 - dev\Common\Common.vcxitems*{d45d4170-e055-4926-8b03-04daa5f02c6c}*SharedItemsImports = 4 test\inc\inc.vcxitems*{d5667df6-a151-4081-abc7-b93e8e5604ce}*SharedItemsImports = 4 dev\Deployment\Deployment.vcxitems*{db38fb4d-d04f-4c1d-93e0-f8ae259c5fd6}*SharedItemsImports = 9 dev\EnvironmentManager\ChangeTracker\ChangeTracker.vcxitems*{e15c3465-9d45-495d-92ce-b91ef45e8623}*SharedItemsImports = 9 diff --git a/build/CopyFilesToStagingDir.ps1 b/build/CopyFilesToStagingDir.ps1 index 86d240c80a..18a8e36c41 100644 --- a/build/CopyFilesToStagingDir.ps1 +++ b/build/CopyFilesToStagingDir.ps1 @@ -169,10 +169,6 @@ PublishFile $FullBuildOutput\DynamicDependencyLifetimeManager.ProxyStub\DynamicD PublishFile $FullBuildOutput\WindowsAppRuntime_BootstrapDLL\Microsoft.WindowsAppRuntime.Bootstrap.dll $NugetDir\runtimes\win10-$Platform\native PublishFile $FullBuildOutput\WindowsAppRuntime_BootstrapDLL\Microsoft.WindowsAppRuntime.Bootstrap.pdb $NugetDir\runtimes\win10-$Platform\native # -# Tools -PublishFile $FullBuildOutput\WindowsAppRuntime_MSIXInstallFromPath\WindowsAppRuntime_MSIXInstallFromPath.exe $NugetDir\tools\$Platform -PublishFile $FullBuildOutput\WindowsAppRuntime_MSIXInstallFromPath\WindowsAppRuntime_MSIXInstallFromPath.pdb $NugetDir\tools\$Platform -# # WinMD for UWP apps PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.ApplicationModel.DynamicDependency.winmd $NugetDir\lib\uap10.0 PublishFile $FullBuildOutput\WindowsAppRuntime_DLL\StrippedWinMD\Microsoft.Windows.ApplicationModel.WindowsAppRuntime.winmd $NugetDir\lib\uap10.0 diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.filters b/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.filters deleted file mode 100644 index 21fff5013a..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.filters +++ /dev/null @@ -1,36 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - - - - diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.vcxproj b/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.vcxproj deleted file mode 100644 index 312a8c5f4f..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/WindowsAppRuntime_MSIXInstallFromPath.vcxproj +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - Debug - ARM64 - - - Debug - Win32 - - - Release - ARM64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {d45d4170-e055-4926-8b03-04daa5f02c6c} - WindowsAppRuntime_MSIXInstallFromPath - 10.0 - true - true - true - true - false - 9 - - - Application - true - v143 - Unicode - - - Application - false - v143 - Unicode - - - Application - true - v143 - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - Unicode - - - Application - false - v143 - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - WindowsAppRuntime_MSIXInstallFromPath - - - WindowsAppRuntime_MSIXInstallFromPath - - - WindowsAppRuntime_MSIXInstallFromPath - - - WindowsAppRuntime_MSIXInstallFromPath - - - WindowsAppRuntime_MSIXInstallFromPath - - - WindowsAppRuntime_MSIXInstallFromPath - - - $(MSBuildThisFileDirectory)..\..\ - - - - UNICODE;_UNICODE;%(PreprocessorDefinitions) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - Use - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)$(PlatformTarget)\$(Configuration);$(SolutionDir)common;$(OutDir)\..\PushNotificationsLongRunningTask.ProxyStub;$(RepoRoot)dev\PushNotifications\PushNotificationsLongRunningTask.StartupTask;$(RepoRoot)\Dev\PushNotifications - NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - pch.h - - - Console - false - onecore.lib;onecoreuap.lib;%(AdditionalDependencies) - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/framework.h b/dev/WindowsAppRuntime_MSIXInstallFromPath/framework.h deleted file mode 100644 index d82b8b8f3b..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/framework.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Microsoft Corporation and Contributors. -// Licensed under the MIT License. - -#pragma once - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include - diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/main.cpp b/dev/WindowsAppRuntime_MSIXInstallFromPath/main.cpp deleted file mode 100644 index 12cf253e01..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/main.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) Microsoft Corporation and Contributors. -// Licensed under the MIT License. - -#include "pch.h" - -#include -#include - -#include -void Help(); -HRESULT JustDoIt(PCWSTR path, bool forceDeployment) noexcept; -void AddPackageIfNecessary(PCWSTR path, const std::wstring& filename, const std::wstring& packageFullName, bool forceDeployment); -bool NeedToRegisterPackage(const std::wstring& packageFullName); -bool NeedToRegisterPackage(PCWSTR packageFullName); -HRESULT AddPackage(PCWSTR path, const std::wstring& filename, bool forceDeployment); - -class PackageId -{ -public: - static PackageId FromPackageFullName(const std::wstring& packageFullName) - { - return FromPackageFullName(packageFullName.c_str()); - } - - static PackageId FromPackageFullName(PCWSTR packageFullName) - { - PackageId packageId; - uint32_t bufferLength{ sizeof(packageId.m_buffer) }; - THROW_IF_WIN32_ERROR(PackageIdFromFullName(packageFullName, PACKAGE_INFORMATION_BASIC, &bufferLength, packageId.m_buffer)); - packageId.m_packageId = reinterpret_cast(packageId.m_buffer); - packageId.m_packageFullName = packageFullName; - return packageId; - } - - PackageId() = default; - - PackageId(PackageId&& other) : - m_packageFullName(std::move(other.m_packageFullName)) - { - memcpy(m_buffer, other.m_buffer, sizeof(m_buffer)); - m_packageId = reinterpret_cast(m_buffer); - - other.m_packageId = nullptr; - memset(other.m_buffer, 0, sizeof(other.m_buffer)); - } - - ~PackageId() = default; - - PackageId& operator=(PackageId&& other) - { - if (this != &other) - { - m_packageFullName = std::move(other.m_packageFullName); - memcpy(m_buffer, other.m_buffer, sizeof(m_buffer)); - m_packageId = reinterpret_cast(m_buffer); - - other.m_packageId = nullptr; - memset(other.m_buffer, 0, sizeof(other.m_buffer)); - } - return *this; - } - - const std::wstring& PackageFullName() const - { - return m_packageFullName; - } - - PCWSTR Name() const - { - return m_packageId->name; - } - - PACKAGE_VERSION Version() const - { - return m_packageId->version; - } - - winrt::Windows::System::ProcessorArchitecture Architecture() const - { - return static_cast(m_packageId->processorArchitecture); - } - - PCWSTR ResourceId() const - { - return m_packageId->resourceId; - } - - PCWSTR PublisherId() const - { - return m_packageId->publisherId; - } - - PCWSTR PackageFamilyName() const - { - if (m_packageFamilyName.empty()) - { - wchar_t packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - uint32_t packageFamilyNameLength{ ARRAYSIZE(packageFamilyName) }; - THROW_IF_WIN32_ERROR_MSG(::PackageFamilyNameFromFullName(m_packageFullName.c_str(), &packageFamilyNameLength, packageFamilyName), "PackageFullName:%ls", m_packageFullName.c_str()); - m_packageFamilyName = packageFamilyName; - } - return m_packageFamilyName.c_str(); - } - - explicit operator bool() const - { - return m_packageId != nullptr; - } - -private: - std::wstring m_packageFullName; - mutable std::wstring m_packageFamilyName; - const PACKAGE_ID * m_packageId{}; - BYTE m_buffer[sizeof(PACKAGE_ID) + (PACKAGE_NAME_MAX_LENGTH + 1 + - PACKAGE_RESOURCEID_MAX_LENGTH + 1 + - PACKAGE_PUBLISHERID_MAX_LENGTH + 1) * sizeof(WCHAR)]{}; -}; - -void Help() -{ - wprintf(L"WindowsAppRuntime_MSIXInstallFromPath [options] \n" - L"options:\n" - L" -f, --force = Force shutdown WinAppSDK's processes if necessary to update WinAppSDK's MSIX packages\n" - L" -?, --help = Display help\n" - L" -- = End of options\n" - L"where:\n" - L" path = Path where Windows App SDK's MSIX packages can be found\n" - L" => Microsoft.WindowsAppRuntime.*.msix\n" - L" => Microsoft.WindowsAppRuntime.DDLM.*.msix\n" - L" => Microsoft.WindowsAppRuntime.Main.*.msix\n" - L" => Microsoft.WindowsAppRuntime.Singleton.*.msix\n"); -} -HRESULT JustDoIt(PCWSTR path, bool forceDeployment) noexcept try -{ - wprintf(L"path: %s\n", path); - - // Install packages - auto fpath{ std::filesystem::path(path) }; - auto inventory{ fpath / L"MSIX.inventory" }; - std::string lineUtf8; - std::ifstream f{ inventory }; - - THROW_HR_IF_MSG(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), std::filesystem::exists(inventory), "%ls", inventory.c_str()); - - while (getline(f, lineUtf8)) - { - // Skip blank lines - if (lineUtf8.empty()) - { - continue; - } - - // Skip comments - if (lineUtf8[0] == '#') - { - continue; - } - - // Parse the line - auto line{ Microsoft::Utf8::ToUtf16(lineUtf8.c_str()) }; - auto offset{ line.find(L'=') }; - THROW_HR_IF_MSG(E_UNEXPECTED, offset == std::wstring::npos, "line:%s", lineUtf8.c_str()); - auto filename{ line.substr(0, offset) }; - THROW_HR_IF_MSG(E_UNEXPECTED, filename.empty(), "line:%s", lineUtf8.c_str()); - auto packageFullName{ std::wstring(line.c_str() + offset + 1) }; - THROW_HR_IF_MSG(E_UNEXPECTED, packageFullName.empty(), "line:%s", lineUtf8.c_str()); - - AddPackageIfNecessary(path, filename, packageFullName, forceDeployment); - } - - // Restart Push Notifications Long Running Platform when ForceDeployment option is applied. - if (forceDeployment) - { - // wil callback will be set up to log telemetry events for LRP. - THROW_IF_FAILED_MSG(StartupNotificationsLongRunningPlatform(), "Restarting Push Notifications LRP failed after 3 attempts."); - } - - return 0; -} -CATCH_RETURN(); - -void AddPackageIfNecessary(PCWSTR path, const std::wstring& filename, const std::wstring& packageFullName, bool forceDeployment) -{ - wprintf(L"Path: %s\n", path); - wprintf(L"Filename: %s\n", filename.c_str()); - wprintf(L"PackageFullName: %s\n", packageFullName.c_str()); - wprintf(L"forceDeployment:%s\n", forceDeployment ? L"true" : L"false"); - - if (!NeedToRegisterPackage(packageFullName)) - { - return; - } - - auto hr{ AddPackage(path, filename, forceDeployment) }; - if (FAILED(hr)) - { - wprintf(L"AddPackage(): 0x%X Path:%s Filename:%s PackageFullName:%s forceDeployment:%s", hr, path, filename.c_str(), packageFullName.c_str(), forceDeployment ? L"true" : L"false"); - THROW_HR_MSG(hr, "Path:%ls Filename:%ls PackageFullName:%ls forceDeployment:%ls", path, filename.c_str(), packageFullName.c_str(), forceDeployment ? L"true" : L"false"); - } -} - -bool NeedToRegisterPackage(const std::wstring& packageFullName) -{ - return NeedToRegisterPackage(packageFullName.c_str()); -} - -bool NeedToRegisterPackage(PCWSTR packageFullName) -{ - auto packageId{ PackageId::FromPackageFullName(packageFullName) }; - - // Is there an equal-or-better package already registered? - wprintf(L"Family: %s\n", packageId.PackageFamilyName()); - auto packageFullNames{ AppModel::Package::FindByFamily(packageId.PackageFamilyName()) }; - if (packageFullNames.empty()) - { - wprintf(L"1 None found\n"); - return true; - } - for (auto registeredPackageFullName : packageFullNames) - { - auto registeredPackage{ PackageId::FromPackageFullName(registeredPackageFullName) }; - wprintf(L"C %ls %ls %d %d %I64X %I64X\n", - packageId.PackageFullName().c_str(), registeredPackage.PackageFullName().c_str(), - packageId.Architecture(), registeredPackage.Architecture(), - packageId.Version().Version, registeredPackage.Version().Version); - if (registeredPackage.Architecture() != packageId.Architecture()) - { - continue; - } - if (registeredPackage.Version().Version >= packageId.Version().Version) - { - continue; - } - - // This registered package is equal-or-better than the specified package. - // No need to register the specified package - wprintf(L"2 %ls not-needed because %ls\n", packageFullName, registeredPackage.PackageFullName().c_str()); - return false; - } - - // Nope. The specified package is better than anything current registered - wprintf(L"3 Nothing better\n"); - return true; -} - -HRESULT AddPackage(PCWSTR path, const std::wstring& filename, bool forceDeployment) -{ - const auto packagePath{ std::filesystem::path(path) / filename }; - const auto packagePathUri{ winrt::Windows::Foundation::Uri(packagePath.c_str()) }; - winrt::Windows::Management::Deployment::PackageManager packageManager; - - const auto options{ forceDeployment ? - winrt::Windows::Management::Deployment::DeploymentOptions::ForceTargetApplicationShutdown : - winrt::Windows::Management::Deployment::DeploymentOptions::None }; - auto deploymentResult{ packageManager.AddPackageAsync(packagePathUri, nullptr, options).get() }; - return deploymentResult.ExtendedErrorCode(); -} - -int wmain(int argc, wchar_t *argv[]) -{ - try - { - winrt::init_apartment(); - - bool forceDeployment{}; - - // Parse the command line - int index{ 1 }; - for (; index < argc; ++index) - { - auto arg{ argv[index] }; - if (arg[0] != L'-') - { - // Options are -o (short form) or --option (long form) - break; - } - else if ((CompareStringOrdinal(arg, -1, L"--", -1, TRUE) == CSTR_EQUAL)) - { - // -- = end of options - ++index; - break; - } - else if ((CompareStringOrdinal(arg, -1, L"-f", -1, TRUE) == CSTR_EQUAL) || - (CompareStringOrdinal(arg, -1, L"--force", -1, TRUE) == CSTR_EQUAL)) - { - forceDeployment = true; - } - else if ((CompareStringOrdinal(arg, -1, L"-?", -1, FALSE) == CSTR_EQUAL) || - (CompareStringOrdinal(arg, -1, L"--help", -1, FALSE) == CSTR_EQUAL)) - { - Help(); - return ERROR_BAD_ARGUMENTS; - } - else - { - Help(); - return ERROR_BAD_ARGUMENTS; - } - } - - if (index >= argc) - { - Help(); - return ERROR_BAD_ARGUMENTS; - } - auto path{ argv[index++] }; - - if (index < argc) - { - Help(); - return ERROR_BAD_ARGUMENTS; - } - - return JustDoIt(path, forceDeployment); - } - catch (...) - { - const auto e{ winrt::hresult_error(winrt::to_hresult(), winrt::take_ownership_from_abi) }; - const auto hr{ e.code() }; - const auto message{ e.message() }; - (void) LOG_HR_MSG(hr, "%ls", message.c_str()); - wprintf(L"0x%X %s", hr.value, message.c_str()); - return hr; - } -} diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/packages.config b/dev/WindowsAppRuntime_MSIXInstallFromPath/packages.config deleted file mode 100644 index e9fecf8c0b..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.cpp b/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.cpp deleted file mode 100644 index 6c107a3575..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) Microsoft Corporation and Contributors. -// Licensed under the MIT License. - -#include "pch.h" - -// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.h b/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.h deleted file mode 100644 index 5db719debd..0000000000 --- a/dev/WindowsAppRuntime_MSIXInstallFromPath/pch.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Corporation and Contributors. -// Licensed under the MIT License. - -// pch.h: This is a precompiled header file. -// Files listed below are compiled only once, improving build performance for future builds. -// This also affects IntelliSense performance, including code completion and many code browsing features. -// However, files listed here are ALL re-compiled if any one of them is updated between builds. -// Do not add files here that you will be updating frequently as this negates the performance advantage. - -#ifndef PCH_H -#define PCH_H - -// add headers that you want to pre-compile here -#include "framework.h" - -#endif //PCH_H From deb7f3180910540e8fdb0b7d00fc7bd406af9f9b Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 30 Oct 2023 13:51:58 -0700 Subject: [PATCH 05/18] 47326537: [Splash] - WinAppSDK DynamicDependency delegate to OS API when available --- dev/Common/WindowsAppRuntime.VersionInfo.cpp | 21 ++++++-- dev/Common/WindowsAppRuntime.VersionInfo.h | 14 ++++- .../MddBootstrap.cpp | 54 ++++++++++++------- .../dllmain.cpp | 13 ++++- dev/WindowsAppRuntime_DLL/dllmain.cpp | 7 +-- 5 files changed, 78 insertions(+), 31 deletions(-) diff --git a/dev/Common/WindowsAppRuntime.VersionInfo.cpp b/dev/Common/WindowsAppRuntime.VersionInfo.cpp index 51d08caf58..2dda2aae1d 100644 --- a/dev/Common/WindowsAppRuntime.VersionInfo.cpp +++ b/dev/Common/WindowsAppRuntime.VersionInfo.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -7,6 +7,8 @@ #include "WindowsAppRuntime.VersionInfo.h" +#include "MddWin11.h" + // Function prototype of the function exported by the resource DLL // (defined later in the build pipeline so we can't #include a header from there) STDAPI_(const void*) WindowsAppRuntime_GetVersionInfo(); @@ -115,11 +117,20 @@ STDAPI WindowsAppRuntime_VersionInfo_TestInitialize( PCWSTR frameworkPackageFamilyName, PCWSTR mainPackageFamilyName) noexcept try { - // Both or neither must be valued + // Verify parameters const bool frameworkPackageFamilyNameIsEmpty{ !frameworkPackageFamilyName || (*frameworkPackageFamilyName == L'0') }; const bool mainPackageFamilyNameIsEmpty{ !mainPackageFamilyName || (*mainPackageFamilyName == L'0') }; - FAIL_FAST_HR_IF(E_UNEXPECTED, frameworkPackageFamilyNameIsEmpty && !mainPackageFamilyNameIsEmpty); - FAIL_FAST_HR_IF(E_UNEXPECTED, !frameworkPackageFamilyNameIsEmpty && mainPackageFamilyNameIsEmpty); + if (MddCore::Win11::IsSupported()) + { + // Framework is optional but Main is never specified + FAIL_FAST_HR_IF(E_UNEXPECTED, !mainPackageFamilyNameIsEmpty); + } + else + { + // Both or neither must be valued + FAIL_FAST_HR_IF(E_UNEXPECTED, frameworkPackageFamilyNameIsEmpty && !mainPackageFamilyNameIsEmpty); + FAIL_FAST_HR_IF(E_UNEXPECTED, !frameworkPackageFamilyNameIsEmpty && mainPackageFamilyNameIsEmpty); + } // Update our state if (frameworkPackageFamilyNameIsEmpty) @@ -132,7 +143,7 @@ STDAPI WindowsAppRuntime_VersionInfo_TestInitialize( { // Initialize test support g_test_frameworkPackageFamilyName = frameworkPackageFamilyName; - g_test_mainPackageFamilyName = mainPackageFamilyName; + g_test_mainPackageFamilyName = (!mainPackageFamilyName ? L"" : mainPackageFamilyName); } return S_OK; } diff --git a/dev/Common/WindowsAppRuntime.VersionInfo.h b/dev/Common/WindowsAppRuntime.VersionInfo.h index 986f946493..e4194a1d8b 100644 --- a/dev/Common/WindowsAppRuntime.VersionInfo.h +++ b/dev/Common/WindowsAppRuntime.VersionInfo.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #ifndef __MICROSFT_WINDOWSAPPRUNTIME_VERSIONINFO_H @@ -68,6 +68,18 @@ inline void TestInitialize( THROW_IF_FAILED(WindowsAppRuntime_VersionInfo_TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName)); } +/// Initialize VersionInfo's test support. This will constrain package enumeration +/// and matching for test purposes. +/// +/// @param frameworkPackageFamilyName only match framework packages with this family name +/// +/// @note Not for product use. This is for test purposes only to verify the implementation. +inline void TestInitialize( + _In_ PCWSTR frameworkPackageFamilyName) +{ + THROW_IF_FAILED(WindowsAppRuntime_VersionInfo_TestInitialize(frameworkPackageFamilyName, nullptr)); +} + /// Shutdown VersionInfo's test support. /// /// @note Not for product use. This is for test purposes only to verify the implementation. diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index 1d774604a3..29344a424b 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -26,6 +26,9 @@ void FirstTimeInitialization( UINT32 majorMinorVersion, PCWSTR versionTag, PACKAGE_VERSION minVersion); +std::wstring GetFrameworkPackageFamilyName( + UINT32 majorMinorVersion, + PCWSTR versionTag); wil::unique_cotaskmem_ptr GetFrameworkPackageInfoForPackage(PCWSTR packageFullName, const PACKAGE_INFO*& frameworkPackageInfo); DLL_DIRECTORY_COOKIE AddFrameworkToPath(PCWSTR path); void RemoveFrameworkFromPath(PCWSTR frameworkPath); @@ -360,40 +363,32 @@ void FirstTimeInitialization( if (MddCore::Win11::IsSupported()) { // Add the framework package to the package graph - auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; - const PACKAGE_INFO* frameworkPackageInfo{}; - auto packageInfoBuffer{ GetFrameworkPackageInfoForPackage(activityContext.GetInitializationPackageFullName().get(), frameworkPackageInfo) }; + const std::wstring frameworkPackageFamilyName{ GetFrameworkPackageFamilyName(majorMinorVersion, packageVersionTag.c_str()) }; + // Add the framework package to the package graph const MddPackageDependencyProcessorArchitectures architectureFilter{}; const auto lifetimeKind{ MddPackageDependencyLifetimeKind::Process }; const MddCreatePackageDependencyOptions createOptions{}; wil::unique_process_heap_string packageDependencyId; - THROW_IF_FAILED(MddCore::Win11::TryCreatePackageDependency(nullptr, frameworkPackageInfo->packageFamilyName, minVersion, architectureFilter, lifetimeKind, nullptr, createOptions, &packageDependencyId)); + THROW_IF_FAILED(MddCore::Win11::TryCreatePackageDependency(nullptr, frameworkPackageFamilyName.c_str(), minVersion, architectureFilter, lifetimeKind, nullptr, createOptions, &packageDependencyId)); // const MddAddPackageDependencyOptions addOptions{}; MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext{}; wil::unique_process_heap_string packageFullName; THROW_IF_FAILED(MddCore::Win11::AddPackageDependency(packageDependencyId.get(), MDD_PACKAGE_DEPENDENCY_RANK_DEFAULT, addOptions, &packageDependencyContext, &packageFullName)); + // Update the activity context + auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; + activityContext.SetInitializationPackageFullName(packageFullName.get()); + // Pass along test information (if necessary) - if (!g_test_ddlmPackageNamePrefix.empty()) + if (!g_test_frameworkPackageNamePrefix.empty()) { + FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_ddlmPackageNamePrefix.empty()); FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_ddlmPackagePublisherId.empty()); - FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_frameworkPackageNamePrefix.empty()); FAIL_FAST_HR_IF(E_UNEXPECTED, g_test_mainPackageNamePrefix.empty()); - uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; - uint16_t minorVersion{ static_cast(majorMinorVersion) }; - PCWSTR packagVersionTagDelimiter{ packageVersionTag.empty() ? L"" : L"-" }; - - WCHAR frameworkPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(frameworkPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_frameworkPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); - - WCHAR mainPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(mainPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_mainPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); - ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName); + ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName.c_str()); } // Track our initialized state @@ -405,7 +400,8 @@ void FirstTimeInitialization( // g_initializationMajorMinorVersion = majorMinorVersion; g_initializationVersionTag = std::move(packageVersionTag); - g_initializationFrameworkPackageVersion.Version = frameworkPackageInfo->packageId.version.Version; + const auto frameworkPackageIdentity{ ::AppModel::Identity::PackageIdentity::FromPackageFullName(packageFullName.get()) }; + g_initializationFrameworkPackageVersion.Version = frameworkPackageIdentity.Version().Version; } else { @@ -478,6 +474,26 @@ void FirstTimeInitialization( } } +/// Determine the package famile name for the Windows App Runtime Framework package +std::wstring GetFrameworkPackageFamilyName( + UINT32 majorMinorVersion, + PCWSTR versionTag) +{ + PCWSTR namePrefix{ !g_test_frameworkPackageNamePrefix.empty() ? + g_test_frameworkPackageNamePrefix.c_str() : + L"Microsoft.WindowsAppRuntime" }; + + const uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; + const uint16_t minorVersion{ static_cast(majorMinorVersion) }; + + PCWSTR versionTagDelimiter{ (!versionTag || (*versionTag == L'\0')) ? L"" : L"-" }; + + WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; + wsprintf(packageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", + namePrefix, majorVersion, minorVersion, versionTagDelimiter, versionTag); + return packageFamilyName; +} + /// Determine the path for the Windows App Runtime Framework package wil::unique_cotaskmem_ptr GetFrameworkPackageInfoForPackage(PCWSTR packageFullName, const PACKAGE_INFO*& frameworkPackageInfo) { diff --git a/dev/WindowsAppRuntime_BootstrapDLL/dllmain.cpp b/dev/WindowsAppRuntime_BootstrapDLL/dllmain.cpp index 2da5b862d4..fea531256b 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/dllmain.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/dllmain.cpp @@ -3,6 +3,8 @@ #include "pch.h" +#include "MddWin11.h" + // Including this file once per binary will automatically opt WIL error handling macros into calling RoOriginateError when they // begin logging a new error. This greatly improves the debuggability of errors that propagate before a failfast. #include @@ -12,10 +14,19 @@ BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) switch (reason) { case DLL_PROCESS_ATTACH: + { DisableThreadLibraryCalls(hmodule); + FAIL_FAST_IF_FAILED(MddWin11Initialize()); + break; + } + case DLL_PROCESS_DETACH: + { + MddWin11Shutdown(); + break; + } case DLL_THREAD_ATTACH: + break; case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: break; } diff --git a/dev/WindowsAppRuntime_DLL/dllmain.cpp b/dev/WindowsAppRuntime_DLL/dllmain.cpp index cc0604d331..60c61157c6 100644 --- a/dev/WindowsAppRuntime_DLL/dllmain.cpp +++ b/dev/WindowsAppRuntime_DLL/dllmain.cpp @@ -30,11 +30,8 @@ static HRESULT DetoursInitialize() // Detour APIs to our implementation DetourRestoreAfterWith(); FAIL_FAST_IF_WIN32_ERROR(DetourTransactionBegin()); - - FAIL_FAST_IF_FAILED(MddWin11Initialize()); FAIL_FAST_IF_FAILED(MddDetourPackageGraphInitialize()); FAIL_FAST_IF_FAILED(UrfwInitialize()); - FAIL_FAST_IF_WIN32_ERROR(DetourTransactionCommit()); return S_OK; } @@ -56,10 +53,8 @@ static HRESULT DetoursShutdown() // Stop Detour'ing APIs to our implementation FAIL_FAST_IF_WIN32_ERROR(DetourTransactionBegin()); FAIL_FAST_IF_WIN32_ERROR(DetourUpdateThread(GetCurrentThread())); - UrfwShutdown(); MddDetourPackageGraphShutdown(); - FAIL_FAST_IF_WIN32_ERROR(DetourTransactionCommit()); return S_OK; } @@ -71,12 +66,14 @@ BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved) case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hmodule); + FAIL_FAST_IF_FAILED(MddWin11Initialize()); FAIL_FAST_IF_FAILED(DetoursInitialize()); break; } case DLL_PROCESS_DETACH: { DetoursShutdown(); + MddWin11Shutdown(); break; } case DLL_THREAD_ATTACH: From 9d07d806b9ec9c2358e9aef6262b07898f95abef Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 30 Oct 2023 20:00:44 -0700 Subject: [PATCH 06/18] Removed dead code --- dev/WindowsAppRuntime_BootstrapDLL/framework.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/dev/WindowsAppRuntime_BootstrapDLL/framework.h b/dev/WindowsAppRuntime_BootstrapDLL/framework.h index 81035d28eb..7fb011d015 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/framework.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/framework.h @@ -30,5 +30,3 @@ #include #include "wil_msixdynamicdependency.h" - -//TODO #include From 0f2929082a14f29fdedca69d72e43b3024384702 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 30 Oct 2023 22:53:46 -0700 Subject: [PATCH 07/18] Closer... --- .../MddBootstrap.cpp | 61 +++++++++++-------- .../MddBootstrapActivity.h | 7 ++- .../Test_Win32/TestMddBootstrap.cpp | 12 ++-- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index 29344a424b..4c497fd351 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -150,7 +150,7 @@ STDAPI MddBootstrapInitialize2( DebugBreak(); } - if (hr == HRESULT_FROM_WIN32(ERROR_NO_MATCH)) + if (hr == STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED) { if (WI_IsFlagSet(options, MddBootstrapInitializeOptions_OnNoMatch_ShowUI) || IsOptionEnabled(L"MICROSOFT_WINDOWSAPPRUNTIME_BOOTSTRAP_INITIALIZE_SHOWUI")) @@ -236,7 +236,7 @@ STDAPI_(void) MddBootstrapShutdown() noexcept if (initializationCount == 1) { // Last one out turn out the lights... - if (g_packageDependencyContext && g_windowsAppRuntimeDll) + if (g_packageDependencyContext && (MddCore::Win11::IsSupported() || g_windowsAppRuntimeDll)) { MddRemovePackageDependency(g_packageDependencyContext); g_packageDependencyContext = nullptr; @@ -312,7 +312,8 @@ void VerifyInitializationIsCompatible( // Sanity check we're already initialized // g_lifetimeManager is optional. Don't check it // g_endTheLifetimeManagerEvent is optional. Don't check it - FAIL_FAST_HR_IF(E_UNEXPECTED, g_windowsAppRuntimeDll == nullptr); + // g_windowsAppRuntimeDll is only relevant if not delegating to OS APIs + FAIL_FAST_HR_IF(E_UNEXPECTED, !MddCore::Win11::IsSupported() && (g_windowsAppRuntimeDll == nullptr)); FAIL_FAST_HR_IF(E_UNEXPECTED, g_packageDependencyId == nullptr); FAIL_FAST_HR_IF(E_UNEXPECTED, g_packageDependencyContext == nullptr); @@ -356,7 +357,7 @@ void FirstTimeInitialization( FAIL_FAST_HR_IF(E_UNEXPECTED, g_packageDependencyContext != nullptr); // Make a copy of the versionTag in preparation of succcess - auto packageVersionTag{ std::wstring(!versionTag ? L"" : versionTag) }; + const std::wstring packageVersionTag{ !versionTag ? L"" : versionTag }; // Use the Win11 APIs if available (instead of WinAppSDK's implementation) //TODO optimize common code @@ -451,14 +452,19 @@ void FirstTimeInitialization( uint16_t minorVersion{ static_cast(majorMinorVersion) }; PCWSTR packagVersionTagDelimiter{ packageVersionTag.empty() ? L"" : L"-" }; - WCHAR frameworkPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(frameworkPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_frameworkPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); + const std::wstring frameworkPackageFamilyName{ std::format(L"{}-{}.{}{}{}_8wekyb3d8bbwe", + g_test_frameworkPackageNamePrefix, + majorVersion, minorVersion, + packagVersionTagDelimiter, packageVersionTag) }; + FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, frameworkPackageFamilyName.length() > PACKAGE_FAMILY_NAME_MAX_LENGTH, "%ls", frameworkPackageFamilyName.c_str()); - WCHAR mainPackageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(mainPackageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", g_test_mainPackageNamePrefix.c_str(), - majorVersion, minorVersion, packagVersionTagDelimiter, packageVersionTag.c_str()); - ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName, mainPackageFamilyName); + const std::wstring mainPackageFamilyName{ std::format(L"{}-{}.{}{}{}_8wekyb3d8bbwe", + g_test_mainPackageNamePrefix, + majorVersion, minorVersion, + packagVersionTagDelimiter, packageVersionTag) }; + FAIL_FAST_HR_IF_MSG(E_UNEXPECTED, mainPackageFamilyName.length() > PACKAGE_FAMILY_NAME_MAX_LENGTH, "%ls", mainPackageFamilyName.c_str()); + + ::WindowsAppRuntime::VersionInfo::TestInitialize(frameworkPackageFamilyName.c_str(), mainPackageFamilyName.c_str()); } // Track our initialized state @@ -474,23 +480,26 @@ void FirstTimeInitialization( } } -/// Determine the package famile name for the Windows App Runtime Framework package +/// Determine the package family name for the Windows App Runtime Framework package std::wstring GetFrameworkPackageFamilyName( UINT32 majorMinorVersion, PCWSTR versionTag) { PCWSTR namePrefix{ !g_test_frameworkPackageNamePrefix.empty() ? - g_test_frameworkPackageNamePrefix.c_str() : - L"Microsoft.WindowsAppRuntime" }; + g_test_frameworkPackageNamePrefix.c_str() : + L"Microsoft.WindowsAppRuntime" }; const uint16_t majorVersion{ static_cast(majorMinorVersion >> 16) }; const uint16_t minorVersion{ static_cast(majorMinorVersion) }; - PCWSTR versionTagDelimiter{ (!versionTag || (*versionTag == L'\0')) ? L"" : L"-" }; + PCWSTR packageVersionTag{ !versionTag ? L"" : versionTag }; + PCWSTR packageVersionTagDelimiter{ (packageVersionTag[0] == L'\0') ? L"" : L"-"}; + + const std::wstring packageFamilyName{ std::format(L"{}-{}.{}{}{}_8wekyb3d8bbwe", + namePrefix, majorVersion, minorVersion, + packageVersionTagDelimiter, packageVersionTag) }; + THROW_HR_IF_MSG(E_INVALIDARG, packageFamilyName.length() > PACKAGE_FAMILY_NAME_MAX_LENGTH, "%ls", packageFamilyName.c_str()); - WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{}; - wsprintf(packageFamilyName, L"%s-%hu.%hu%s%s_8wekyb3d8bbwe", - namePrefix, majorVersion, minorVersion, versionTagDelimiter, versionTag); return packageFamilyName; } @@ -743,17 +752,21 @@ CLSID FindDDLMViaAppExtension( // Look for windows.appExtension with name="microsoft.winappruntime.ddlm-.-[-shorttag]" // NOTE: . MUST have a string length <= 8 characters ("12.34567", "12345.67", etc) to fit within // the maximum allowed length of a windows.appExtension's Name (39 chars) on Windows versions <= RS5 (10.0.17763.0). - WCHAR appExtensionName[100]{}; + std::wstring appExtensionName; const UINT16 majorVersion{ HIWORD(majorMinorVersion) }; const UINT16 minorVersion{ LOWORD(majorMinorVersion) }; const auto versionShortTag{ AppModel::Identity::GetVersionShortTagFromVersionTag(versionTag) }; if (!versionShortTag.empty()) { - wsprintf(appExtensionName, L"microsoft.winappruntime.ddlm-%hu.%hu-%s-%s", majorVersion, minorVersion, AppModel::Identity::GetCurrentArchitectureAsShortString(), versionShortTag.c_str()); + appExtensionName = std::format(L"microsoft.winappruntime.ddlm-{}.{}-{}-{}", + majorVersion, minorVersion, AppModel::Identity::GetCurrentArchitectureAsShortString(), versionShortTag); + THROW_HR_IF_MSG(E_INVALIDARG, appExtensionName.length() > PACKAGE_NAME_MAX_LENGTH, "%ls", appExtensionName.c_str()); } else { - wsprintf(appExtensionName, L"microsoft.winappruntime.ddlm-%hu.%hu-%s", majorVersion, minorVersion, AppModel::Identity::GetCurrentArchitectureAsShortString()); + appExtensionName = std::format(L"microsoft.winappruntime.ddlm-{}.{}-{}", + majorVersion, minorVersion, AppModel::Identity::GetCurrentArchitectureAsShortString()); + THROW_HR_IF_MSG(E_INVALIDARG, appExtensionName.length() > PACKAGE_NAME_MAX_LENGTH, "%ls", appExtensionName.c_str()); } auto catalog{ winrt::Windows::ApplicationModel::AppExtensions::AppExtensionCatalog::Open(appExtensionName) }; @@ -815,8 +828,8 @@ CLSID FindDDLMViaAppExtension( continue; } } - THROW_HR_IF_MSG(HRESULT_FROM_WIN32(ERROR_NO_MATCH), !foundAny, "AppExtension.Name=%ls, Major=%hu, Minor=%hu, Tag=%ls, MinVersion=%hu.%hu.%hu.%hu", - appExtensionName, majorVersion, minorVersion, (!versionTag ? L"" : versionTag), + THROW_HR_IF_MSG(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, !foundAny, "AppExtension.Name=%ls, Major=%hu, Minor=%hu, Tag=%ls, MinVersion=%hu.%hu.%hu.%hu", + appExtensionName.c_str(), majorVersion, minorVersion, (!versionTag ? L"" : versionTag), minVersion.Major, minVersion.Minor, minVersion.Build, minVersion.Revision); return bestFitClsid; } @@ -1013,7 +1026,7 @@ void FindDDLMViaEnumeration( continue; } } - THROW_HR_IF_MSG(HRESULT_FROM_WIN32(ERROR_NO_MATCH), !foundAny, "Enumeration: %ls", criteria.get()); + THROW_HR_IF_MSG(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, !foundAny, "Enumeration: %ls", criteria.get()); (void)LOG_HR_MSG(MDD_E_BOOTSTRAP_INITIALIZE_DDLM_FOUND, "Bootstrap.Intitialize: %ls best matches the criteria (%ls) of %d packages scanned", bestFitPackageFullName.c_str(), criteria.get(), packagesScanned); diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h index 5837e7effb..adf65f1f8b 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h @@ -56,10 +56,15 @@ namespace WindowsAppRuntime::MddBootstrap::Activity return m_mddBootstrapAPI; } + const uint32_t GetInitializationCount) const + { + return m_initializationCount; + } + const uint32_t GetInitializeData(PWSTR& initializationPackageFullName) const { initializationPackageFullName = m_initializationPackageFullName.get(); - return m_initializationCount; + return GetInitializationCount(); } wil::unique_cotaskmem_string& GetInitializationPackageFullName() diff --git a/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp b/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp index d57351b499..34858cec11 100644 --- a/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp +++ b/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp @@ -190,7 +190,7 @@ namespace Test::DynamicDependency // Major.Minor = 0.0 == No such framework package const UINT32 doesNotExist{}; const PACKAGE_VERSION minVersionMatchAny{}; - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_NO_MATCH), MddBootstrapInitialize(doesNotExist, nullptr, minVersionMatchAny)); + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(doesNotExist, nullptr, minVersionMatchAny)); } TEST_METHOD(Initialize_DDLMMinVersionNoMatch) @@ -203,7 +203,7 @@ namespace Test::DynamicDependency // Version .65535.65535.65535 to find framework packages for the major.minor version but none meeting this minVersion criteria const UINT32 c_Version_MajorMinor{ Test::Packages::DynamicDependencyLifetimeManager::c_Version_MajorMinor }; PACKAGE_VERSION minVersionNoMatch{ static_cast(Test::Packages::DynamicDependencyLifetimeManager::c_Version.Major) << 48 | 0x0000FFFFFFFFFFFFuI64 }; - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_NO_MATCH), MddBootstrapInitialize(c_Version_MajorMinor, nullptr, minVersionNoMatch)); + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(c_Version_MajorMinor, nullptr, minVersionNoMatch)); } TEST_METHOD(Initialize) @@ -288,7 +288,7 @@ namespace Test::DynamicDependency const PACKAGE_VERSION c_minVersion3{}; VERIFY_ARE_EQUAL(c_minVersion3.Version, c_minVersion1.Version); VERIFY_ARE_NOT_EQUAL(c_minVersion3.Version, c_minVersion2.Version); - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_NO_MATCH), MddBootstrapInitialize(c_Version_MajorMinor3, L"NotTheVersionTag", c_minVersion3)); + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(c_Version_MajorMinor3, L"NotTheVersionTag", c_minVersion3)); // Incompatible criteria. Verify Initialize+Shutdown brought us // back to initial state so we can fail to initialize as expected @@ -297,7 +297,7 @@ namespace Test::DynamicDependency VERIFY_ARE_NOT_EQUAL(c_minVersion4.Version, c_minVersion1.Version); VERIFY_ARE_NOT_EQUAL(c_minVersion4.Version, c_minVersion2.Version); VERIFY_ARE_NOT_EQUAL(c_minVersion4.Version, c_minVersion3.Version); - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_NO_MATCH), MddBootstrapInitialize(c_Version_MajorMinor4, nullptr, c_minVersion4)); + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(c_Version_MajorMinor4, nullptr, c_minVersion4)); // Same criteria but MinVersion Date: Mon, 30 Oct 2023 23:22:56 -0700 Subject: [PATCH 08/18] Almost... --- .../MddBootstrap.cpp | 15 +++++++-------- .../MddBootstrapActivity.h | 6 +++--- .../MddBootstrapTracelogging.cpp | 2 +- .../MddBootstrapTracelogging.h | 6 +++--- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index 4c497fd351..1922c9f7d3 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -109,10 +109,9 @@ STDAPI MddBootstrapInitialize2( auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; - PWSTR initializationFrameworkPackageFullName{}; - auto initializationCount{ activityContext.GetInitializeData(initializationFrameworkPackageFullName) }; + auto initializationCount{ activityContext.GetInitializeCount() }; activityContext.SetMddBootstrapAPI(WindowsAppRuntime::MddBootstrap::Activity::MddBootstrapAPI::Initialize); - auto threadCallback = wil::ThreadFailureCallback(wilResultLoggingThreadCallback); + auto threadCallback{ wil::ThreadFailureCallback(wilResultLoggingThreadCallback) }; auto initializeActivity{ activityContext.GetInitializeActivity().Start( majorMinorVersion, @@ -176,6 +175,7 @@ STDAPI MddBootstrapInitialize2( if (activityContext.GetInitializeActivity().IsRunning()) { + PCWSTR initializationFrameworkPackageFullName{}; initializationCount = activityContext.GetInitializeData(initializationFrameworkPackageFullName); initializeActivity.StopWithResult( hr, @@ -199,8 +199,7 @@ HRESULT _MddBootstrapInitialize( PCWSTR versionTag, PACKAGE_VERSION minVersion) noexcept try { - PWSTR initializationFrameworkPackageFullName{}; - auto initializationCount{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get().GetInitializeData(initializationFrameworkPackageFullName) }; + const auto initializationCount{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get().GetInitializeCount() }; // Are we already initialized? if (initializationCount > 0) @@ -223,10 +222,10 @@ STDAPI_(void) MddBootstrapShutdown() noexcept auto& activityContext{ WindowsAppRuntime::MddBootstrap::Activity::Context::Get() }; - PWSTR initializationFrameworkPackageFullName{}; - auto initializationCount{ activityContext.GetInitializeData(initializationFrameworkPackageFullName) }; + PCWSTR initializationFrameworkPackageFullName{}; + const auto initializationCount{ activityContext.GetInitializeData(initializationFrameworkPackageFullName) }; activityContext.SetMddBootstrapAPI(WindowsAppRuntime::MddBootstrap::Activity::MddBootstrapAPI::Shutdown); - auto threadCallback = wil::ThreadFailureCallback(wilResultLoggingThreadCallback); + auto threadCallback{ wil::ThreadFailureCallback(wilResultLoggingThreadCallback) }; auto shutdownActivity{ activityContext.GetShutdownActivity().Start( static_cast(initializationCount), diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h index adf65f1f8b..5f87777b5b 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h @@ -56,15 +56,15 @@ namespace WindowsAppRuntime::MddBootstrap::Activity return m_mddBootstrapAPI; } - const uint32_t GetInitializationCount) const + const uint32_t GetInitializeCount() const { return m_initializationCount; } - const uint32_t GetInitializeData(PWSTR& initializationPackageFullName) const + const uint32_t GetInitializeData(PCWSTR& initializationPackageFullName) const { initializationPackageFullName = m_initializationPackageFullName.get(); - return GetInitializationCount(); + return GetInitializeCount(); } wil::unique_cotaskmem_string& GetInitializationPackageFullName() diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.cpp index 71fe1609d6..ca92888132 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.cpp @@ -12,7 +12,7 @@ void MddBootstrap_StopActivity( { if (isActivityRunning) { - PWSTR initializationFrameworkPackageFullName{}; + PCWSTR initializationFrameworkPackageFullName{}; auto initializationCount{ activityContext.GetInitializeData(initializationFrameworkPackageFullName) }; if (activityContext.GetMddBootstrapAPI() == WindowsAppRuntime::MddBootstrap::Activity::MddBootstrapAPI::Initialize) diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.h b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.h index fce11d68dd..372923e621 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapTracelogging.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #pragma once @@ -41,7 +41,7 @@ class WindowsAppRuntimeBootstrap_TraceLogger final : public wil::TraceLoggingPro const HRESULT hresult, UINT32 initializationCount, UINT32 IntegrityFlags, - PWSTR resolvedFrameworkPackageFullName, + PCWSTR resolvedFrameworkPackageFullName, UINT32 failureType, PCSTR failureFile, unsigned int failureLineNumber, @@ -78,7 +78,7 @@ class WindowsAppRuntimeBootstrap_TraceLogger final : public wil::TraceLoggingPro BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(Shutdown, PDT_ProductAndServicePerformance); void StartActivity( UINT32 initializationCount, - PWSTR resolvedFrameworkPackageFullName) + PCWSTR resolvedFrameworkPackageFullName) { // Set lifetime activity Id that helps in corelating all sub-activities/telemetry from a single Mdd Bootstrap lifetime SetRelatedActivityId(GetLifetimeActivityId()); From 7a1d4f9721345558aa86da85f90af2fda20f659e Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 1 Nov 2023 00:21:52 -0700 Subject: [PATCH 09/18] More tweaks. BootstrapTests pass! --- dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp | 5 +++++ .../MddBootstrapActivity.h | 10 +++++++++- test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp | 6 ++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index 1922c9f7d3..e11d84189d 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -316,6 +316,11 @@ void VerifyInitializationIsCompatible( FAIL_FAST_HR_IF(E_UNEXPECTED, g_packageDependencyId == nullptr); FAIL_FAST_HR_IF(E_UNEXPECTED, g_packageDependencyContext == nullptr); + // Verify the parameter(s) + // NOTE: GetFrameworkPackageFamilyName() verifies the resulting package family name is valid. + // We don't care about the return value, just the verification along the way. + GetFrameworkPackageFamilyName(majorMinorVersion, versionTag); + // Is the initialization request compatible with the current initialization state? THROW_HR_IF_MSG(MDD_E_BOOTSTRAP_INITIALIZE_INCOMPATIBLE, majorMinorVersion != g_initializationMajorMinorVersion, diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h index 5f87777b5b..ee37f9ea26 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapActivity.h @@ -118,7 +118,15 @@ namespace WindowsAppRuntime::MddBootstrap::Activity void SetInitializationPackageFullName(PWSTR initializationPackageFullName) { - m_initializationPackageFullName.reset(initializationPackageFullName); + if (initializationPackageFullName) + { + auto packageFullName{ wil::make_cotaskmem_string(initializationPackageFullName) }; + m_initializationPackageFullName = std::move(packageFullName); + } + else + { + m_initializationPackageFullName.reset(); + } } void StopActivityForWilReturnHR(const bool stopActivityForWilReturnHR) diff --git a/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp b/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp index 34858cec11..89c2f99792 100644 --- a/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp +++ b/test/DynamicDependency/Test_Win32/TestMddBootstrap.cpp @@ -253,7 +253,8 @@ namespace Test::DynamicDependency const UINT32 c_Version_MajorMinor_Incompatible{ c_Version_MajorMinor + 1 }; VERIFY_ARE_EQUAL(MDD_E_BOOTSTRAP_INITIALIZE_INCOMPATIBLE, MddBootstrapInitialize(c_Version_MajorMinor_Incompatible, nullptr, c_minVersion)); - VERIFY_ARE_EQUAL(MDD_E_BOOTSTRAP_INITIALIZE_INCOMPATIBLE, MddBootstrapInitialize(c_Version_MajorMinor, L"NotTheVersionTag", c_minVersion)); + VERIFY_ARE_EQUAL(E_INVALIDARG, MddBootstrapInitialize(c_Version_MajorMinor, L"MakesPackageFamilyNameTooLong", c_minVersion)); + VERIFY_ARE_EQUAL(MDD_E_BOOTSTRAP_INITIALIZE_INCOMPATIBLE, MddBootstrapInitialize(c_Version_MajorMinor, L"Zathras", c_minVersion)); const PACKAGE_VERSION c_minVersion_Incompatible{ UINT64_MAX }; VERIFY_ARE_EQUAL(MDD_E_BOOTSTRAP_INITIALIZE_INCOMPATIBLE, MddBootstrapInitialize(c_Version_MajorMinor, nullptr, c_minVersion_Incompatible)); @@ -288,7 +289,8 @@ namespace Test::DynamicDependency const PACKAGE_VERSION c_minVersion3{}; VERIFY_ARE_EQUAL(c_minVersion3.Version, c_minVersion1.Version); VERIFY_ARE_NOT_EQUAL(c_minVersion3.Version, c_minVersion2.Version); - VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(c_Version_MajorMinor3, L"NotTheVersionTag", c_minVersion3)); + VERIFY_ARE_EQUAL(E_INVALIDARG, MddBootstrapInitialize(c_Version_MajorMinor3, L"MakesPackageFamilyNameTooLong", c_minVersion3)); + VERIFY_ARE_EQUAL(STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED, MddBootstrapInitialize(c_Version_MajorMinor3, L"Zathras", c_minVersion3)); // Incompatible criteria. Verify Initialize+Shutdown brought us // back to initial state so we can fail to initialize as expected From 2ba55f5a354bcb35421e0c2a1dd81cebcae5e5be Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 1 Nov 2023 20:51:33 -0700 Subject: [PATCH 10/18] Added initial Resolve API. Fixed GetResolved*() to only query not resolve an unresolved PackageDependency --- .../API/M.AM.DD.PackageDependency.cpp | 6 ++++ .../API/M.AM.DD.PackageDependency.h | 1 + .../API/M.AM.DynamicDependency.idl | 15 ++++++++- dev/DynamicDependency/API/MddWin11.h | 31 +++++++++++++++++-- .../API/MsixDynamicDependency.cpp | 26 ++++++++++++++++ .../API/MsixDynamicDependency.h | 13 ++++++-- dev/DynamicDependency/API/PackageGraph.cpp | 23 +++++++++++++- dev/DynamicDependency/API/PackageGraph.h | 9 ++++++ .../API/PackageGraphManager.cpp | 9 ++++++ .../API/PackageGraphManager.h | 4 +++ .../Test_Win32/Test_Win32.cpp | 27 ++++++++++++++++ 11 files changed, 158 insertions(+), 6 deletions(-) diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp index e78c85f086..3b7318c791 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp @@ -118,6 +118,12 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem return context; } + winrt::PackageDependencyContext PackageDependency::Resolve() + { + //TODO:Resolve + throw winrt::hresult_not_implemented(); + } + winrt::PackageDependency PackageDependency::Create( PSID userSid, PCWSTR packageFamilyName, diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h index eacce8a1e5..ba34db6550 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h @@ -26,6 +26,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem void Delete(); winrt::PackageDependencyContext Add(); winrt::PackageDependencyContext Add(Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options); + winrt::PackageDependencyContext Resolve(); private: static winrt::PackageDependency Create( diff --git a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl index 140bf1a167..f8ac5187a8 100644 --- a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl +++ b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl @@ -3,7 +3,7 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency { - [contractversion(2)] + [contractversion(3)] apicontract DynamicDependencyContract{}; /// CPU architectures to optionally filter available packages against a package dependency. @@ -246,6 +246,7 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency /// Successful calls change the package graph's current revision id. /// /// @see PackageGraphRevisionId + /// @see Resolve PackageDependencyContext Add(); /// Resolve a previously pinned PackageDependency to a specific package and @@ -285,8 +286,20 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency /// Successful calls change the package graph's current revision id. /// /// @see PackageGraphRevisionId + /// @see Resolve PackageDependencyContext Add(AddPackageDependencyOptions options); + /// Resolve a previously pinned PackageDependency to a specific package. + /// + /// @note This does NOT update the calling process' package graph. + /// + /// Package resolution is specific to a user. The same package dependency can + /// resolve to different packages for different users on a system. + /// + /// @see Add + [contract(DynamicDependencyContract, 3)] + PackageDependencyContext Resolve(); + /// Return the package graph's current revision id. [contract(DynamicDependencyContract, 2)] static UInt32 PackageGraphRevisionId{ get; }; diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index d984770551..d223863f54 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -5,7 +5,6 @@ #define MDDWIN11DYNAMICDEPENDENCY_H #include -//TODO #include #include @@ -22,6 +21,9 @@ namespace MddCore::Win11 __declspec(selectany) decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; + //TODO:Resolve __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; + //TODO:Resolve __declspec(selectany) decltype(&::ResolvePackageFullNameForPackageDependency) g_win11ResolvePackageFullNameForPackageDependency{}; + __declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; constexpr PackageDependencyLifetimeKind ToLifetimeKind(MddPackageDependencyLifetimeKind lifetimeKind) @@ -215,6 +217,15 @@ namespace MddCore::Win11 return S_OK; } + inline HRESULT ResolvePackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) + { + //TODO:Resolve RETURN_IF_FAILED(MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + //TODO:Resolve return S_OK; + RETURN_HR(E_NOTIMPL); + } + inline HRESULT GetIdForPackageDependencyContext( _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, _Outptr_result_maybenull_ PWSTR* packageDependencyId) @@ -256,7 +267,16 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetIdForPackageDependencyContext); auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); - + // + //TODO:Resolve HMODULE dllApisetAppmodelRuntime_1_7{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-7.dll", nullptr, 0) }; + //TODO:Resolve FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_7); + //TODO:Resolve + //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; + //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); + + //TODO:Resolve MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; + //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = win11ResolvePackageFullNameForPackageDependency; + // MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; MddCore::Win11::details::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; MddCore::Win11::details::g_win11DeletePackageDependency = win11DeletePackageDependency; @@ -270,6 +290,13 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept inline HRESULT WINAPI MddWin11Shutdown() noexcept { + //TODO:Resolve if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7) + //TODO:Resolve { + //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = nullptr; + //TODO:Resolve FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7); + //TODO:Resolve MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = nullptr; + //TODO:Resolve } + if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6) { MddCore::Win11::details::g_win11TryCreatePackageDependency = nullptr; diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.cpp b/dev/DynamicDependency/API/MsixDynamicDependency.cpp index 414bfe6527..cefb83bf54 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.cpp +++ b/dev/DynamicDependency/API/MsixDynamicDependency.cpp @@ -120,6 +120,32 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency( RETURN_HR_IF(E_INVALIDARG, !packageDependencyId || (packageDependencyId[0] == L'\0')); + wil::unique_process_heap_string fullName; + RETURN_IF_FAILED(MddCore::PackageGraphManager::GetResolvedPackageDependency(packageDependencyId, fullName)); + + *packageFullName = fullName.release(); + return S_OK; +} +CATCH_RETURN(); + +STDAPI MddResolvePackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept try +{ + *packageFullName = nullptr; + + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::ResolvePackageFullNameForPackageDependency(packageDependencyId, packageFullName)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process + RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); + + RETURN_HR_IF(E_INVALIDARG, !packageDependencyId || (packageDependencyId[0] == L'\0')); + wil::unique_process_heap_string fullName; RETURN_IF_FAILED(MddCore::PackageGraphManager::ResolvePackageDependency(packageDependencyId, MddAddPackageDependencyOptions::None, fullName)); diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.h b/dev/DynamicDependency/API/MsixDynamicDependency.h index e80c389ce4..ec3e1fde98 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.h +++ b/dev/DynamicDependency/API/MsixDynamicDependency.h @@ -192,8 +192,8 @@ STDAPI MddAddPackageDependency( STDAPI_(void) MddRemovePackageDependency( _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext) noexcept; -/// Return the package full name that would be used if the -/// PackageDependency were to be resolved. Does not add the +/// Return the package full name to which the +/// PackageDependency has been resolved. Does not add the /// package to the process graph. /// /// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. @@ -203,6 +203,15 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency( _In_ PCWSTR packageDependencyId, _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; +/// Resolve the PackageDependency (if not already resolved). +/// +/// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. +/// If the package dependency cannot be resolved the function +/// succeeds but packageFullName is nullptr. +STDAPI MddResolvePackageFullNameForPackageDependency( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; + /// Return the package dependency for the context. /// /// @param packageDependencyId allocated via HeapAlloc; use HeapFree to deallocate. diff --git a/dev/DynamicDependency/API/PackageGraph.cpp b/dev/DynamicDependency/API/PackageGraph.cpp index 5bf3219756..baa27c36a9 100644 --- a/dev/DynamicDependency/API/PackageGraph.cpp +++ b/dev/DynamicDependency/API/PackageGraph.cpp @@ -109,6 +109,27 @@ HRESULT MddCore::PackageGraph::Add( return S_OK; } +HRESULT MddCore::PackageGraph::GetResolvedPackageDependency( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) noexcept try +{ + packageFullName.reset(); + + // Get the package dependency + auto foundPackageDependency{ MddCore::PackageDependencyManager::GetPackageDependency(packageDependencyId) }; + THROW_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_FOUND), !foundPackageDependency); + + // Is the package dependency already resolved? + const auto& packageDependency{ *foundPackageDependency }; + if (!packageDependency.PackageFullName().empty()) + { + // Gotcha! + packageFullName = wil::make_process_heap_string(packageDependency.PackageFullName().c_str()); + } + return S_OK; +} +CATCH_RETURN(); + HRESULT MddCore::PackageGraph::ResolvePackageDependency( PCWSTR packageDependencyId, MddAddPackageDependencyOptions options, @@ -128,7 +149,7 @@ HRESULT MddCore::PackageGraph::ResolvePackageDependency( return S_OK; } - // Rewsolve it + // Resolve it return ResolvePackageDependency(packageDependency, options, packageFullName); } CATCH_RETURN(); diff --git a/dev/DynamicDependency/API/PackageGraph.h b/dev/DynamicDependency/API/PackageGraph.h index 89ae0d3956..8eca630079 100644 --- a/dev/DynamicDependency/API/PackageGraph.h +++ b/dev/DynamicDependency/API/PackageGraph.h @@ -34,6 +34,15 @@ class PackageGraph _In_ PCWSTR packageDependencyId, MDD_PACKAGEDEPENDENCY_CONTEXT& context); +public: + HRESULT GetResolvedPackageDependency( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) noexcept; + + static HRESULT GetResolvedPackageDependency( + const MddCore::PackageDependency& packageDependency, + wil::unique_process_heap_string& packageFullName); + public: HRESULT ResolvePackageDependency( PCWSTR packageDependencyId, diff --git a/dev/DynamicDependency/API/PackageGraphManager.cpp b/dev/DynamicDependency/API/PackageGraphManager.cpp index 16195fe20a..6676c8b4f2 100644 --- a/dev/DynamicDependency/API/PackageGraphManager.cpp +++ b/dev/DynamicDependency/API/PackageGraphManager.cpp @@ -26,6 +26,15 @@ UINT32 MddCore::PackageGraphManager::SetPackageGraphRevisionId(const UINT32 valu return static_cast(InterlockedExchange(&s_packageGraphRevisionId, value)); } +HRESULT MddCore::PackageGraphManager::GetResolvedPackageDependency( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) +{ + std::unique_lock lock(s_lock); + + return s_packageGraph.GetResolvedPackageDependency(packageDependencyId, packageFullName); +} + HRESULT MddCore::PackageGraphManager::ResolvePackageDependency( PCWSTR packageDependencyId, MddAddPackageDependencyOptions options, diff --git a/dev/DynamicDependency/API/PackageGraphManager.h b/dev/DynamicDependency/API/PackageGraphManager.h index f0eb427552..45efca5264 100644 --- a/dev/DynamicDependency/API/PackageGraphManager.h +++ b/dev/DynamicDependency/API/PackageGraphManager.h @@ -20,6 +20,10 @@ class PackageGraphManager static UINT32 SetPackageGraphRevisionId(const UINT32 value); public: + static HRESULT GetResolvedPackageDependency( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName); + static HRESULT ResolvePackageDependency( PCWSTR packageDependencyId, MddAddPackageDependencyOptions options, diff --git a/test/DynamicDependency/Test_Win32/Test_Win32.cpp b/test/DynamicDependency/Test_Win32/Test_Win32.cpp index 0808e88b14..7fa5597d77 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32.cpp @@ -10,6 +10,8 @@ #include "Test_Win32.h" +#include + namespace TF = ::Test::FileSystem; namespace TP = ::Test::Packages; @@ -243,6 +245,7 @@ void Test::DynamicDependency::Test_Win32::VerifyPackageDependency( } else { + VERIFY_IS_NOT_NULL(packageFullName, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); VERIFY_ARE_EQUAL(std::wstring(packageFullName.get()), std::wstring(expectedPackageFullName)); } } @@ -257,6 +260,12 @@ void Test::DynamicDependency::Test_Win32::VerifyPackageDependency( void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring expectedPath{ path }; std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -264,6 +273,12 @@ void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -271,6 +286,12 @@ void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path2, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path2 + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -278,6 +299,12 @@ void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_Win32::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path2, PCWSTR path3, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path2 + L";" + path3 + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); From 8df2747a427db3964f11f5bdc7753bf5334848e4 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 3 Nov 2023 02:20:19 -0700 Subject: [PATCH 11/18] Added GetResolvedPackageFullNameForPackageDependency2. Fixed up tests --- dev/DynamicDependency/API/MddWin11.h | 61 +++++++++++++------ .../API/MsixDynamicDependency.cpp | 26 ++++++++ .../API/MsixDynamicDependency.h | 13 ++++ dev/DynamicDependency/API/PackageGraph.cpp | 22 +++++++ dev/DynamicDependency/API/PackageGraph.h | 9 +++ .../API/PackageGraphManager.cpp | 9 +++ .../API/PackageGraphManager.h | 4 ++ .../WindowsAppRuntime.def | 1 + .../Test_Win32/Test_Win32.cpp | 43 ++++++++++--- .../Test_Win32/Test_Win32_Add_Rank_A0_B10.cpp | 4 +- .../Test_Win32_Add_Rank_B-10_A0.cpp | 4 +- .../Test_Win32_Add_Rank_B0prepend_A0.cpp | 4 +- ...Win32_Create_Add_Architectures_Current.cpp | 4 +- ...in32_Create_Add_Architectures_Explicit.cpp | 4 +- ...Create_DoNotVerifyDependencyResolution.cpp | 2 +- ...ifecycle_FilePathLifetime_Frameworks_2.cpp | 4 +- ...Lifecycle_ProcessLifetime_Frameworks_2.cpp | 4 +- ...ifecycle_RegistryLifetime_Frameworks_2.cpp | 4 +- .../Test_Win32/Test_Win32_WinRTReentrancy.cpp | 4 +- 19 files changed, 182 insertions(+), 44 deletions(-) diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index d223863f54..4dbfbd0672 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -21,8 +21,9 @@ namespace MddCore::Win11 __declspec(selectany) decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; - //TODO:Resolve __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; + __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; //TODO:Resolve __declspec(selectany) decltype(&::ResolvePackageFullNameForPackageDependency) g_win11ResolvePackageFullNameForPackageDependency{}; + //TODO:GetResolved2 __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency2) g_win11GetResolvedPackageFullNameForPackageDependency2{}; __declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; @@ -70,6 +71,11 @@ namespace MddCore::Win11 return MddCore::Win11::details::g_isSupported; } + inline bool IsGetResolvedPackageFullNameForPackageDependency2Supported() + { + return IsSupported() && MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7; + } + inline HRESULT TryCreatePackageDependency( PSID user, _In_ PCWSTR packageFamilyName, @@ -141,15 +147,15 @@ namespace MddCore::Win11 #endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) inline void DeletePackageDependency( - const winrt::hstring& packageDependencyId) + _In_ PCWSTR packageDependencyId) { - DeletePackageDependency(packageDependencyId.c_str()); + (void)LOG_IF_FAILED(MddCore::Win11::details::g_win11DeletePackageDependency(packageDependencyId)); } inline void DeletePackageDependency( - _In_ PCWSTR packageDependencyId) + const winrt::hstring& packageDependencyId) { - (void)LOG_IF_FAILED(MddCore::Win11::details::g_win11DeletePackageDependency(packageDependencyId)); + DeletePackageDependency(packageDependencyId.c_str()); } inline HRESULT AddPackageDependency( @@ -217,6 +223,16 @@ namespace MddCore::Win11 return S_OK; } + inline HRESULT GetResolvedPackageFullNameForPackageDependency2( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) + { + //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), g_win11GetResolvedPackageFullNameForPackageDependency2); + //TODO:GetResolved2 RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2(packageDependencyId, packageFullName)); + //TODO:GetResolved2 return S_OK; + RETURN_WIN32(ERROR_NOT_SUPPORTED); + } + inline HRESULT ResolvePackageFullNameForPackageDependency( _In_ PCWSTR packageDependencyId, _Outptr_result_maybenull_ PWSTR* packageFullName) @@ -268,14 +284,24 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); // - //TODO:Resolve HMODULE dllApisetAppmodelRuntime_1_7{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-7.dll", nullptr, 0) }; - //TODO:Resolve FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_7); - //TODO:Resolve - //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; - //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); + //TODO:GetResolved2 decltype(&::GetResolvedPackageFullNameForPackageDependency2) win11GetResolvedPackageFullNameForPackageDependency2{}; + HMODULE dllApisetAppmodelRuntime_1_7{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-7.dll", nullptr, 0) }; + if (dllApisetAppmodelRuntime_1_7 == nullptr) + { + const auto rc{ GetLastError() }; + RETURN_HR_IF(HRESULT_FROM_WIN32(rc), rc != ERROR_MOD_NOT_FOUND); + } + else + { + //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; + //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); + //TODO:GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); + //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); + } - //TODO:Resolve MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = win11ResolvePackageFullNameForPackageDependency; + //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = win11GetResolvedPackageFullNameForPackageDependency2; // MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; MddCore::Win11::details::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; @@ -290,12 +316,13 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept inline HRESULT WINAPI MddWin11Shutdown() noexcept { - //TODO:Resolve if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7) - //TODO:Resolve { - //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = nullptr; - //TODO:Resolve FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7); - //TODO:Resolve MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = nullptr; - //TODO:Resolve } + if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7) + { + //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = nullptr; + //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = nullptr; + FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7); + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = nullptr; + } if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6) { diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.cpp b/dev/DynamicDependency/API/MsixDynamicDependency.cpp index cefb83bf54..0ad3326234 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.cpp +++ b/dev/DynamicDependency/API/MsixDynamicDependency.cpp @@ -128,6 +128,32 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency( } CATCH_RETURN(); +STDAPI MddGetResolvedPackageFullNameForPackageDependency2( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept try +{ + *packageFullName = nullptr; + + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + RETURN_IF_FAILED(MddCore::Win11::GetResolvedPackageFullNameForPackageDependency2(packageDependencyId, packageFullName)); + return S_OK; + } + + // WinAppSDK's Dynamic Dependencies requires a non-packaged process + RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); + + RETURN_HR_IF(E_INVALIDARG, !packageDependencyId || (packageDependencyId[0] == L'\0')); + + wil::unique_process_heap_string fullName; + RETURN_IF_FAILED(MddCore::PackageGraphManager::GetResolvedPackageDependency2(packageDependencyId, fullName)); + + *packageFullName = fullName.release(); + return S_OK; +} +CATCH_RETURN(); + STDAPI MddResolvePackageFullNameForPackageDependency( _In_ PCWSTR packageDependencyId, _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept try diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.h b/dev/DynamicDependency/API/MsixDynamicDependency.h index ec3e1fde98..5a008f624d 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.h +++ b/dev/DynamicDependency/API/MsixDynamicDependency.h @@ -199,10 +199,23 @@ STDAPI_(void) MddRemovePackageDependency( /// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. /// If the package dependency cannot be resolved the function /// succeeds but packageFullName is nullptr. +/// @note An unknown packageDependencyId returns S_OK and packageFullName=null. STDAPI MddGetResolvedPackageFullNameForPackageDependency( _In_ PCWSTR packageDependencyId, _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; +/// Return the package full name to which the +/// PackageDependency has been resolved. Does not add the +/// package to the process graph. +/// +/// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. +/// If the package dependency cannot be resolved the function +/// succeeds but packageFullName is nullptr. +/// @note An unknown packageDependencyId returns HRESULT_FROM_WIN32(ERROR_NOT_FOUND). +STDAPI MddGetResolvedPackageFullNameForPackageDependency2( + _In_ PCWSTR packageDependencyId, + _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; + /// Resolve the PackageDependency (if not already resolved). /// /// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. diff --git a/dev/DynamicDependency/API/PackageGraph.cpp b/dev/DynamicDependency/API/PackageGraph.cpp index baa27c36a9..3c8af19531 100644 --- a/dev/DynamicDependency/API/PackageGraph.cpp +++ b/dev/DynamicDependency/API/PackageGraph.cpp @@ -115,6 +115,28 @@ HRESULT MddCore::PackageGraph::GetResolvedPackageDependency( { packageFullName.reset(); + // Get the package dependency + auto foundPackageDependency{ MddCore::PackageDependencyManager::GetPackageDependency(packageDependencyId) }; + if (foundPackageDependency) + { + // Is the package dependency already resolved? + const auto& packageDependency{ *foundPackageDependency }; + if (!packageDependency.PackageFullName().empty()) + { + // Gotcha! + packageFullName = wil::make_process_heap_string(packageDependency.PackageFullName().c_str()); + } + } + return S_OK; +} +CATCH_RETURN(); + +HRESULT MddCore::PackageGraph::GetResolvedPackageDependency2( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) noexcept try +{ + packageFullName.reset(); + // Get the package dependency auto foundPackageDependency{ MddCore::PackageDependencyManager::GetPackageDependency(packageDependencyId) }; THROW_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_FOUND), !foundPackageDependency); diff --git a/dev/DynamicDependency/API/PackageGraph.h b/dev/DynamicDependency/API/PackageGraph.h index 8eca630079..d92bfa22ee 100644 --- a/dev/DynamicDependency/API/PackageGraph.h +++ b/dev/DynamicDependency/API/PackageGraph.h @@ -43,6 +43,15 @@ class PackageGraph const MddCore::PackageDependency& packageDependency, wil::unique_process_heap_string& packageFullName); +public: + HRESULT GetResolvedPackageDependency2( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) noexcept; + + static HRESULT GetResolvedPackageDependency2( + const MddCore::PackageDependency& packageDependency, + wil::unique_process_heap_string& packageFullName); + public: HRESULT ResolvePackageDependency( PCWSTR packageDependencyId, diff --git a/dev/DynamicDependency/API/PackageGraphManager.cpp b/dev/DynamicDependency/API/PackageGraphManager.cpp index 6676c8b4f2..e1bee31d9b 100644 --- a/dev/DynamicDependency/API/PackageGraphManager.cpp +++ b/dev/DynamicDependency/API/PackageGraphManager.cpp @@ -35,6 +35,15 @@ HRESULT MddCore::PackageGraphManager::GetResolvedPackageDependency( return s_packageGraph.GetResolvedPackageDependency(packageDependencyId, packageFullName); } +HRESULT MddCore::PackageGraphManager::GetResolvedPackageDependency2( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName) +{ + std::unique_lock lock(s_lock); + + return s_packageGraph.GetResolvedPackageDependency2(packageDependencyId, packageFullName); +} + HRESULT MddCore::PackageGraphManager::ResolvePackageDependency( PCWSTR packageDependencyId, MddAddPackageDependencyOptions options, diff --git a/dev/DynamicDependency/API/PackageGraphManager.h b/dev/DynamicDependency/API/PackageGraphManager.h index 45efca5264..74805fa425 100644 --- a/dev/DynamicDependency/API/PackageGraphManager.h +++ b/dev/DynamicDependency/API/PackageGraphManager.h @@ -24,6 +24,10 @@ class PackageGraphManager PCWSTR packageDependencyId, wil::unique_process_heap_string& packageFullName); + static HRESULT GetResolvedPackageDependency2( + PCWSTR packageDependencyId, + wil::unique_process_heap_string& packageFullName); + static HRESULT ResolvePackageDependency( PCWSTR packageDependencyId, MddAddPackageDependencyOptions options, diff --git a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime.def b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime.def index 83d91290dc..de435f0404 100644 --- a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime.def +++ b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime.def @@ -10,6 +10,7 @@ EXPORTS MddDeletePackageDependency MddGetIdForPackageDependencyContext MddGetResolvedPackageFullNameForPackageDependency + MddGetResolvedPackageFullNameForPackageDependency2 MddRemovePackageDependency MddTryCreatePackageDependency MddLifetimeManagementGC diff --git a/test/DynamicDependency/Test_Win32/Test_Win32.cpp b/test/DynamicDependency/Test_Win32/Test_Win32.cpp index 7fa5597d77..d9489ca479 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32.cpp @@ -136,7 +136,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); VerifyPackageGraphRevisionId(1); // -- Add @@ -185,7 +185,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); VerifyPackageGraphRevisionId(3); // -- Delete @@ -237,16 +237,43 @@ void Test::DynamicDependency::Test_Win32::VerifyPackageDependency( const HRESULT expectedHR, PCWSTR expectedPackageFullName) { - wil::unique_process_heap_string packageFullName; - VERIFY_ARE_EQUAL(expectedHR, MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName)); - if (!expectedPackageFullName) + // Given an unknown/undefined packageDependencyId our caller specifies expectedHR=HRESULT_FROM_WIN32(ERROR_NOT_FOUND). + // Handle the condition appropriately: + // + // API | HRESULT | packageFullName + // -------------------------------------------------------------------|-----------------------------------------|---------------- + // MddGetResolvedPackageFullNameForPackageDependency | S_OK | NULL + // MddGetResolvedPackageFullNameForPackageDependency2 (Supported) | HRESULT_FROM_WIN32(ERROR_NOT_FOUND) | NULL + // MddGetResolvedPackageFullNameForPackageDependency2 (not Supported) | HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) | NULL + + const HRESULT expectedHR1{ (expectedHR == HRESULT_FROM_WIN32(ERROR_NOT_FOUND)) ? S_OK : expectedHR }; + const HRESULT expectedHR2{ + MddCore::Win11::IsSupported() && !MddCore::Win11::IsGetResolvedPackageFullNameForPackageDependency2Supported() ? + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) : + expectedHR }; + + wil::unique_process_heap_string packageFullName1; + VERIFY_ARE_EQUAL(expectedHR1, MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName1)); + if (FAILED(expectedHR1) || !expectedPackageFullName) + { + VERIFY_IS_NULL(packageFullName1); + } + else + { + VERIFY_IS_NOT_NULL(packageFullName1, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); + VERIFY_ARE_EQUAL(std::wstring(packageFullName1.get()), std::wstring(expectedPackageFullName)); + } + + wil::unique_process_heap_string packageFullName2; + VERIFY_ARE_EQUAL(expectedHR2, MddGetResolvedPackageFullNameForPackageDependency2(packageDependencyId, &packageFullName2)); + if (FAILED(expectedHR2) || !expectedPackageFullName) { - VERIFY_IS_TRUE(!packageFullName); + VERIFY_IS_NULL(packageFullName2); } else { - VERIFY_IS_NOT_NULL(packageFullName, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); - VERIFY_ARE_EQUAL(std::wstring(packageFullName.get()), std::wstring(expectedPackageFullName)); + VERIFY_IS_NOT_NULL(packageFullName2, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); + VERIFY_ARE_EQUAL(std::wstring(packageFullName2.get()), std::wstring(expectedPackageFullName)); } } diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_A0_B10.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_A0_B10.cpp index 0c6c2747c5..28c460c74d 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_A0_B10.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_A0_B10.cpp @@ -33,7 +33,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_A0_B10() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -77,7 +77,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_A0_B10() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B-10_A0.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B-10_A0.cpp index 081c385c6d..caf732366a 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B-10_A0.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B-10_A0.cpp @@ -33,7 +33,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_Bneg10_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -77,7 +77,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_Bneg10_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B0prepend_A0.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B0prepend_A0.cpp index 888061f25d..fcb1bc721e 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B0prepend_A0.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Add_Rank_B0prepend_A0.cpp @@ -33,7 +33,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_B0prepend_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -77,7 +77,7 @@ void Test::DynamicDependency::Test_Win32::Add_Rank_B0prepend_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Current.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Current.cpp index c79a286501..a172915020 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Current.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Current.cpp @@ -37,7 +37,7 @@ void Test::DynamicDependency::Test_Win32::Create_Add_Architectures_Current() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -80,7 +80,7 @@ void Test::DynamicDependency::Test_Win32::Create_Add_Architectures_Current() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Explicit.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Explicit.cpp index 03be29e249..107272b7de 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Explicit.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Create_Add_Architectures_Explicit.cpp @@ -43,7 +43,7 @@ void Test::DynamicDependency::Test_Win32::Create_Add_Architectures_Explicit() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -86,7 +86,7 @@ void Test::DynamicDependency::Test_Win32::Create_Add_Architectures_Explicit() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_Create_DoNotVerifyDependencyResolution.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_Create_DoNotVerifyDependencyResolution.cpp index fad858ee69..97652acc76 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_Create_DoNotVerifyDependencyResolution.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_Create_DoNotVerifyDependencyResolution.cpp @@ -83,7 +83,7 @@ void Test::DynamicDependency::Test_Win32::Create_DoNotVerifyDependencyResolution VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_FilePathLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_FilePathLifetime_Frameworks_2.cpp index ac4853e0aa..f780b20978 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_FilePathLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_FilePathLifetime_Frameworks_2.cpp @@ -38,7 +38,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_FilePathLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -103,7 +103,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_FilePathLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_ProcessLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_ProcessLifetime_Frameworks_2.cpp index 4aff89ff12..7e4e6f6693 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_ProcessLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_ProcessLifetime_Frameworks_2.cpp @@ -33,7 +33,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -76,7 +76,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_RegistryLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_RegistryLifetime_Frameworks_2.cpp index 605c7dda7d..d7bbfb003b 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_RegistryLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_FullLifecycle_RegistryLifetime_Frameworks_2.cpp @@ -38,7 +38,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_RegistryLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Add @@ -101,7 +101,7 @@ void Test::DynamicDependency::Test_Win32::FullLifecycle_RegistryLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd.get(), S_OK, nullptr); // -- Delete diff --git a/test/DynamicDependency/Test_Win32/Test_Win32_WinRTReentrancy.cpp b/test/DynamicDependency/Test_Win32/Test_Win32_WinRTReentrancy.cpp index 95f5046b80..ae7396cc59 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32_WinRTReentrancy.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32_WinRTReentrancy.cpp @@ -36,7 +36,7 @@ void Test::DynamicDependency::Test_Win32::WinRTReentrancy() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkWidgets, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkWidgets.get(), S_OK, expectedPackageFullName_FrameworkWidgets); + VerifyPackageDependency(packageDependencyId_FrameworkWidgets.get(), S_OK, nullptr); // -- Add @@ -110,7 +110,7 @@ void Test::DynamicDependency::Test_Win32::WinRTReentrancy() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkWidgets, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkWidgets.get(), S_OK, expectedPackageFullName_FrameworkWidgets); + VerifyPackageDependency(packageDependencyId_FrameworkWidgets.get(), S_OK, nullptr); // -- Delete From 5a907786dbbf292de1e79115a9e5479fd9a3becb Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Fri, 3 Nov 2023 21:32:10 -0700 Subject: [PATCH 12/18] Test_Win32* all pass! --- test/DynamicDependency/Test_Win32/Test_Win32.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/DynamicDependency/Test_Win32/Test_Win32.cpp b/test/DynamicDependency/Test_Win32/Test_Win32.cpp index d9489ca479..a383ace6d4 100644 --- a/test/DynamicDependency/Test_Win32/Test_Win32.cpp +++ b/test/DynamicDependency/Test_Win32/Test_Win32.cpp @@ -210,7 +210,8 @@ void Test::DynamicDependency::Test_Win32::GetResolvedPackageFullName_NotFound() { PCWSTR packageDependencyId{ L"This.Does.Not.Exist" }; wil::unique_process_heap_string packageFullName; - VERIFY_ARE_EQUAL(HRESULT_FROM_WIN32(ERROR_NOT_FOUND), MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName)); + VERIFY_SUCCEEDED(MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName)); + VERIFY_IS_NULL(packageFullName); } void Test::DynamicDependency::Test_Win32::GetIdForPackageDependencyContext_Null() From dfe67c6a53dfb12b93e08f472405751abab2abb7 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Sun, 5 Nov 2023 19:41:29 -0800 Subject: [PATCH 13/18] Update WinRT API to support delegating to Win11 (caveat: see GetFromId()). Updated tests. --- .../API/M.AM.DD.PackageDependency.cpp | 34 +++++-- .../DynamicDependency_Test_WinRT.vcxproj | 12 +-- .../Test_WinRT/Test_WinRT.cpp | 88 +++++++++++++++++-- .../Test_WinRT/Test_WinRT_Add_Rank_A0_B10.cpp | 6 +- .../Test_WinRT_Add_Rank_B-10_A0.cpp | 6 +- .../Test_WinRT_Add_Rank_B0prepend_A0.cpp | 6 +- ...WinRT_Create_Add_Architectures_Current.cpp | 4 +- ...inRT_Create_Add_Architectures_Explicit.cpp | 6 +- ...Create_DoNotVerifyDependencyResolution.cpp | 2 +- ...ifecycle_FilePathLifetime_Frameworks_2.cpp | 6 +- ...Lifecycle_ProcessLifetime_Frameworks_2.cpp | 6 +- ...ifecycle_RegistryLifetime_Frameworks_2.cpp | 6 +- test/DynamicDependency/Test_WinRT/pch.h | 2 + 13 files changed, 137 insertions(+), 47 deletions(-) diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp index 3b7318c791..420659bc65 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -16,6 +16,8 @@ #include +#include "MddWin11.h" + namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implementation { PackageDependency::PackageDependency(hstring const& id) : @@ -25,21 +27,37 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem winrt::PackageDependency PackageDependency::GetFromId(hstring const& id) { - auto tokenUser{ wil::get_token_information(GetCurrentThreadEffectiveToken()) }; - auto exists{ MddCore::PackageDependencyManager::ExistsPackageDependency(tokenUser->User.Sid, id.c_str()) }; - if (!exists) + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + //TODO GetPackageDependencyInfo(userSid, id.c_str(), &packageDependencyInfo) + } + else { - return nullptr; + auto tokenUser{ wil::get_token_information(GetCurrentThreadEffectiveToken()) }; + auto exists{ MddCore::PackageDependencyManager::ExistsPackageDependency(tokenUser->User.Sid, id.c_str()) }; + if (!exists) + { + return nullptr; + } } return winrt::make(id); } winrt::PackageDependency PackageDependency::GetFromIdForSystem(hstring const& id) { - auto exists{ MddCore::PackageDependencyManager::ExistsPackageDependency(nullptr, id.c_str()) }; - if (!exists) + // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) + if (MddCore::Win11::IsSupported()) + { + //TODO GetPackageDependencyInfo(userSid, id.c_str(), &packageDependencyInfo) + } + else { - return nullptr; + auto exists{ MddCore::PackageDependencyManager::ExistsPackageDependency(nullptr, id.c_str()) }; + if (!exists) + { + return nullptr; + } } return winrt::make(id); } diff --git a/test/DynamicDependency/Test_WinRT/DynamicDependency_Test_WinRT.vcxproj b/test/DynamicDependency/Test_WinRT/DynamicDependency_Test_WinRT.vcxproj index c3a8916b28..897389e5f1 100644 --- a/test/DynamicDependency/Test_WinRT/DynamicDependency_Test_WinRT.vcxproj +++ b/test/DynamicDependency/Test_WinRT/DynamicDependency_Test_WinRT.vcxproj @@ -110,7 +110,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common WIN32;NDEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h @@ -125,7 +125,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common WIN32;_DEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h @@ -140,7 +140,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common _DEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h @@ -155,7 +155,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common _DEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h @@ -170,7 +170,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common NDEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h @@ -185,7 +185,7 @@ Use - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;$(OutDir)\..\Framework.Math.Add;$(OutDir)\..\Framework.Math.Multiply;$(RepoRoot)\dev\common NDEBUG;%(PreprocessorDefinitions);PRTEST_MODE_UWP=0 true pch.h diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT.cpp index 142ebb465a..bb96ae9591 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT.cpp @@ -10,6 +10,8 @@ #include "Test_WinRT.h" +#include + #include namespace TF = ::Test::FileSystem; @@ -96,14 +98,30 @@ void Test::DynamicDependency::Test_WinRT::GetFromId_Empty() { winrt::hstring packageDependencyId; auto packageDependency{ winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependency::GetFromId(packageDependencyId) }; - VERIFY_IS_TRUE(!packageDependency); + if (MddCore::Win11::IsSupported()) + { + //TODO Remove once GetFromId() fails for no-such-id + VERIFY_IS_TRUE(!!packageDependency); + } + else + { + VERIFY_IS_TRUE(!packageDependency); + } } void Test::DynamicDependency::Test_WinRT::GetFromId_NotFound() { winrt::hstring packageDependencyId{ L"This.Does.Not.Exist" }; auto packageDependency{ winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependency::GetFromId(packageDependencyId) }; - VERIFY_IS_TRUE(!packageDependency); + if (MddCore::Win11::IsSupported()) + { + //TODO Remove once GetFromId() fails for no-such-id + VERIFY_IS_TRUE(!!packageDependency); + } + else + { + VERIFY_IS_TRUE(!packageDependency); + } } void Test::DynamicDependency::Test_WinRT::FullLifecycle_ProcessLifetime_Framework_WindowsAppRuntime() @@ -133,7 +151,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependency_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependency_FrameworkMathAdd, S_OK, winrt::hstring()); VerifyGenerationId(1); // -- Add @@ -180,7 +198,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); VerifyGenerationId(3); // -- Delete @@ -241,15 +259,43 @@ void Test::DynamicDependency::Test_WinRT::VerifyPackageDependency( const HRESULT expectedHR, PCWSTR expectedPackageFullName) { - wil::unique_process_heap_string packageFullName; - VERIFY_ARE_EQUAL(expectedHR, MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName)); - if (!expectedPackageFullName) + // Given an unknown/undefined packageDependencyId our caller specifies expectedHR=HRESULT_FROM_WIN32(ERROR_NOT_FOUND). + // Handle the condition appropriately: + // + // API | HRESULT | packageFullName + // -------------------------------------------------------------------|-----------------------------------------|---------------- + // MddGetResolvedPackageFullNameForPackageDependency | S_OK | NULL + // MddGetResolvedPackageFullNameForPackageDependency2 (Supported) | HRESULT_FROM_WIN32(ERROR_NOT_FOUND) | NULL + // MddGetResolvedPackageFullNameForPackageDependency2 (not Supported) | HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) | NULL + + const HRESULT expectedHR1{ (expectedHR == HRESULT_FROM_WIN32(ERROR_NOT_FOUND)) ? S_OK : expectedHR }; + const HRESULT expectedHR2{ + MddCore::Win11::IsSupported() && !MddCore::Win11::IsGetResolvedPackageFullNameForPackageDependency2Supported() ? + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) : + expectedHR }; + + wil::unique_process_heap_string packageFullName1; + VERIFY_ARE_EQUAL(expectedHR1, MddGetResolvedPackageFullNameForPackageDependency(packageDependencyId, &packageFullName1)); + if (FAILED(expectedHR1) || !expectedPackageFullName || (expectedPackageFullName[0] == L'\0')) + { + VERIFY_IS_NULL(packageFullName1); + } + else { - VERIFY_IS_TRUE(!packageFullName); + VERIFY_IS_NOT_NULL(packageFullName1, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); + VERIFY_ARE_EQUAL(std::wstring(packageFullName1.get()), std::wstring(expectedPackageFullName)); + } + + wil::unique_process_heap_string packageFullName2; + VERIFY_ARE_EQUAL(expectedHR2, MddGetResolvedPackageFullNameForPackageDependency2(packageDependencyId, &packageFullName2)); + if (FAILED(expectedHR2) || !expectedPackageFullName || (expectedPackageFullName[0] == L'\0')) + { + VERIFY_IS_NULL(packageFullName2); } else { - VERIFY_ARE_EQUAL(std::wstring(packageFullName.get()), std::wstring(expectedPackageFullName)); + VERIFY_IS_NOT_NULL(packageFullName2, WEX::Common::String().Format(L"PackageFullName=null Expected=%s", expectedPackageFullName)); + VERIFY_ARE_EQUAL(std::wstring(packageFullName2.get()), std::wstring(expectedPackageFullName)); } } @@ -293,6 +339,12 @@ void Test::DynamicDependency::Test_WinRT::VerifyPackageDependency( void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring expectedPath{ path }; std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -300,6 +352,12 @@ void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -307,6 +365,12 @@ void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path2, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path2 + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); @@ -314,6 +378,12 @@ void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR p void Test::DynamicDependency::Test_WinRT::VerifyPathEnvironmentVariable(PCWSTR path1, PCWSTR path2, PCWSTR path3, PCWSTR path) { + // N/A when DynamicDependency delegates to the Win11 OS API + if (MddCore::Win11::IsSupported()) + { + return; + } + std::wstring pathEnvironmentVariable{ wil::TryGetEnvironmentVariableW(L"PATH").get() }; std::wstring expectedPath{ std::wstring(path1) + L";" + path2 + L";" + path3 + L";" + path }; VERIFY_ARE_EQUAL(expectedPath, pathEnvironmentVariable); diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_A0_B10.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_A0_B10.cpp index a25682aac0..9e15cdc4e6 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_A0_B10.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_A0_B10.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -36,7 +36,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_A0_B10() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -79,7 +79,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_A0_B10() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B-10_A0.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B-10_A0.cpp index b27550055a..e1b27205ed 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B-10_A0.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B-10_A0.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -36,7 +36,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_Bneg10_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -79,7 +79,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_Bneg10_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B0prepend_A0.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B0prepend_A0.cpp index 29858786ce..ea9b4ec2fa 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B0prepend_A0.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Add_Rank_B0prepend_A0.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -36,7 +36,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_B0prepend_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -79,7 +79,7 @@ void Test::DynamicDependency::Test_WinRT::Add_Rank_B0prepend_A0() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Current.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Current.cpp index a19c49df9e..b228eaa1d2 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Current.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Current.cpp @@ -40,7 +40,7 @@ void Test::DynamicDependency::Test_WinRT::Create_Add_Architectures_Current() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -81,7 +81,7 @@ void Test::DynamicDependency::Test_WinRT::Create_Add_Architectures_Current() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Explicit.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Explicit.cpp index 4659d3a041..e73a830afa 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Explicit.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_Add_Architectures_Explicit.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -46,7 +46,7 @@ void Test::DynamicDependency::Test_WinRT::Create_Add_Architectures_Explicit() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -87,7 +87,7 @@ void Test::DynamicDependency::Test_WinRT::Create_Add_Architectures_Explicit() VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_DoNotVerifyDependencyResolution.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_DoNotVerifyDependencyResolution.cpp index 1e1c06c901..d7996a06dd 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_DoNotVerifyDependencyResolution.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_Create_DoNotVerifyDependencyResolution.cpp @@ -85,7 +85,7 @@ void Test::DynamicDependency::Test_WinRT::Create_DoNotVerifyDependencyResolution VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_FilePathLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_FilePathLifetime_Frameworks_2.cpp index ddb2312240..11fa7f6f4a 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_FilePathLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_FilePathLifetime_Frameworks_2.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -43,7 +43,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_FilePathLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -108,7 +108,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_FilePathLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_ProcessLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_ProcessLifetime_Frameworks_2.cpp index 185077f2e8..328e016979 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_ProcessLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_ProcessLifetime_Frameworks_2.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. +// Copyright (c) Microsoft Corporation and Contributors. // Licensed under the MIT License. #include "pch.h" @@ -36,7 +36,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -77,7 +77,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_ProcessLifetime_Framewor VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_RegistryLifetime_Frameworks_2.cpp b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_RegistryLifetime_Frameworks_2.cpp index e3d7235424..f48066607b 100644 --- a/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_RegistryLifetime_Frameworks_2.cpp +++ b/test/DynamicDependency/Test_WinRT/Test_WinRT_FullLifecycle_RegistryLifetime_Frameworks_2.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation and Contributors. All rights reserved. +// Copyright (c) Microsoft Corporation and Contributors. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. #include "pch.h" @@ -43,7 +43,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_RegistryLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Add @@ -104,7 +104,7 @@ void Test::DynamicDependency::Test_WinRT::FullLifecycle_RegistryLifetime_Framewo VerifyPackageInPackageGraph(expectedPackageFullName_WindowsAppRuntimeFramework, S_OK); VerifyPackageNotInPackageGraph(expectedPackageFullName_FrameworkMathAdd, S_OK); VerifyPathEnvironmentVariable(packagePath_WindowsAppRuntimeFramework, pathEnvironmentVariable.c_str()); - VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, expectedPackageFullName_FrameworkMathAdd); + VerifyPackageDependency(packageDependencyId_FrameworkMathAdd, S_OK, winrt::hstring()); // -- Delete diff --git a/test/DynamicDependency/Test_WinRT/pch.h b/test/DynamicDependency/Test_WinRT/pch.h index ede2c26370..c831e6e1cc 100644 --- a/test/DynamicDependency/Test_WinRT/pch.h +++ b/test/DynamicDependency/Test_WinRT/pch.h @@ -37,6 +37,8 @@ #include +#include + #include "TestFilesystem.h" #include "TestPackages.h" From fd837cda4194b471f4d00bc7f8cd7ab307648034 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 7 Nov 2023 18:41:45 -0800 Subject: [PATCH 14/18] Did the work to support Win11 21H2 but the OS may not fully support it. Left IsSupported() unchanged (Win11 >=22H2) for now while I investigate further --- dev/DynamicDependency/API/MddWin11.h | 129 +++++++++++++++++++-------- 1 file changed, 94 insertions(+), 35 deletions(-) diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index 4dbfbd0672..8314e4d59b 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -12,13 +12,30 @@ namespace MddCore::Win11 { namespace details { - __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_6{}; + // GetCurrentPackageInfo3 is documented but not in appmodel.h + // See https://learn.microsoft.com/windows/win32/appxpkg/appmodel/nf-appmodel-getcurrentpackageinfo3 + enum PackageInfo3Type + { + PackageInfo3Type_PackageInfoGeneration = 16, + }; + // + WINBASEAPI HRESULT WINAPI GetCurrentPackageInfo3( + _In_ UINT32 flags, + _In_ MddCore::Win11::details::PackageInfo3Type packageInfoType, + _Inout_ UINT32* bufferLength, + _Out_writes_bytes_opt_(*bufferLength) void* buffer, + _Out_opt_ UINT32* count); + + __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_5{}; __declspec(selectany) decltype(&::TryCreatePackageDependency) g_win11TryCreatePackageDependency{}; __declspec(selectany) decltype(&::DeletePackageDependency) g_win11DeletePackageDependency{}; __declspec(selectany) decltype(&::AddPackageDependency) g_win11AddPackageDependency{}; __declspec(selectany) decltype(&::RemovePackageDependency) g_win11RemovePackageDependency{}; __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency) g_win11GetResolvedPackageFullNameForPackageDependency{}; __declspec(selectany) decltype(&::GetIdForPackageDependencyContext) g_win11GetIdForPackageDependencyContext{}; + __declspec(selectany) decltype(&MddCore::Win11::details::GetCurrentPackageInfo3) g_win11GetCurrentPackageInfo3{}; + + __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_6{}; __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; @@ -50,6 +67,17 @@ namespace MddCore::Win11 }; } #endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) + + inline HRESULT Load(PCWSTR moduleName, HMODULE& hmodule) + { + hmodule = LoadLibraryExW(moduleName, nullptr, 0); + if (hmodule == nullptr) + { + const auto rc{ GetLastError() }; + RETURN_HR_IF_MSG(HRESULT_FROM_WIN32(rc), rc != ERROR_MOD_NOT_FOUND, "%ls", moduleName); + } + return S_OK; + } } #if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) @@ -224,8 +252,8 @@ namespace MddCore::Win11 } inline HRESULT GetResolvedPackageFullNameForPackageDependency2( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName) + _In_ PCWSTR /*packageDependencyId*/, + _Outptr_result_maybenull_ PWSTR* /*packageFullName*/) { //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), g_win11GetResolvedPackageFullNameForPackageDependency2); //TODO:GetResolved2 RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2(packageDependencyId, packageFullName)); @@ -234,8 +262,8 @@ namespace MddCore::Win11 } inline HRESULT ResolvePackageFullNameForPackageDependency( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName) + _In_ PCWSTR /*packageDependencyId*/, + _Outptr_result_maybenull_ PWSTR* /*packageFullName*/) { //TODO:Resolve RETURN_IF_FAILED(MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency(packageDependencyId, packageFullName)); //TODO:Resolve return S_OK; @@ -255,7 +283,23 @@ namespace MddCore::Win11 inline UINT32 GetPackageGraphRevisionId() { - return MddCore::Win11::details::g_win11GetPackageGraphRevisionId(); + if (MddCore::Win11::details::g_win11GetPackageGraphRevisionId()) + { + return MddCore::Win11::details::g_win11GetPackageGraphRevisionId(); + } + else + { + UINT32 revisionId{}; + UINT32 bufferLength{ sizeof(revisionId) }; + const HRESULT hr{ MddCore::Win11::details::g_win11GetCurrentPackageInfo3(0, MddCore::Win11::details::PackageInfo3Type_PackageInfoGeneration, &bufferLength, &revisionId, nullptr) }; + if (hr == HRESULT_FROM_WIN32(APPMODEL_ERROR_NO_PACKAGE)) + { + // No package graph + return 0; + } + LOG_IF_FAILED_MSG(hr, "GetCurrentPackageInfo3 failed!"); + return revisionId; + } } } @@ -266,51 +310,59 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept return S_OK; } - HMODULE dllApisetAppmodelRuntime_1_6{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-6.dll", nullptr, 0) }; - FAIL_FAST_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_6); + //TODO:GetResolved2 auto win11GetResolvedPackageFullNameForPackageDependency2{ static_cast(nullptr) }; + HMODULE dllApisetAppmodelRuntime_1_7{}; + RETURN_IF_FAILED(MddCore::Win11::details::Load(L"api-ms-win-appmodel-runtime-l1-1-7.dll", dllApisetAppmodelRuntime_1_7)); + if (dllApisetAppmodelRuntime_1_7) + { + //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; + //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); + //TODO:GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); + //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); + } - auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, TryCreatePackageDependency) }; + auto win11GetPackageGraphRevisionId{ static_cast(nullptr) }; + HMODULE dllApisetAppmodelRuntime_1_6{}; + RETURN_IF_FAILED(MddCore::Win11::details::Load(L"api-ms-win-appmodel-runtime-l1-1-6.dll", dllApisetAppmodelRuntime_1_6)); + if (dllApisetAppmodelRuntime_1_6) + { + win11GetPackageGraphRevisionId = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId); + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); + } + + HMODULE dllApisetAppmodelRuntime_1_5{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-5.dll", nullptr, 0) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), dllApisetAppmodelRuntime_1_5); + auto win11TryCreatePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, TryCreatePackageDependency) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11TryCreatePackageDependency); - auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, DeletePackageDependency) }; + auto win11DeletePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, DeletePackageDependency) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11DeletePackageDependency); - auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, AddPackageDependency) }; + auto win11AddPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, AddPackageDependency) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11AddPackageDependency); - auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, RemovePackageDependency) }; + auto win11RemovePackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, RemovePackageDependency) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11RemovePackageDependency); - auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetResolvedPackageFullNameForPackageDependency) }; + auto win11GetResolvedPackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, GetResolvedPackageFullNameForPackageDependency) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency); - auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetIdForPackageDependencyContext) }; + auto win11GetIdForPackageDependencyContext{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_5, GetIdForPackageDependencyContext) }; RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetIdForPackageDependencyContext); - auto win11GetPackageGraphRevisionId{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_6, GetPackageGraphRevisionId) }; - RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetPackageGraphRevisionId); - // - //TODO:GetResolved2 decltype(&::GetResolvedPackageFullNameForPackageDependency2) win11GetResolvedPackageFullNameForPackageDependency2{}; - HMODULE dllApisetAppmodelRuntime_1_7{ LoadLibraryExW(L"api-ms-win-appmodel-runtime-l1-1-7.dll", nullptr, 0) }; - if (dllApisetAppmodelRuntime_1_7 == nullptr) - { - const auto rc{ GetLastError() }; - RETURN_HR_IF(HRESULT_FROM_WIN32(rc), rc != ERROR_MOD_NOT_FOUND); - } - else - { - //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; - //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); - //TODO:GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); - //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); - } + auto win11GetCurrentPackageInfo3{ reinterpret_cast(GetProcAddress(dllApisetAppmodelRuntime_1_5, "GetCurrentPackageInfo3")) }; + RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetCurrentPackageInfo3); + // Success MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = win11ResolvePackageFullNameForPackageDependency; //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = win11GetResolvedPackageFullNameForPackageDependency2; // MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; + MddCore::Win11::details::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; + // + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_5 = dllApisetAppmodelRuntime_1_5; MddCore::Win11::details::g_win11TryCreatePackageDependency = win11TryCreatePackageDependency; MddCore::Win11::details::g_win11DeletePackageDependency = win11DeletePackageDependency; MddCore::Win11::details::g_win11AddPackageDependency = win11AddPackageDependency; MddCore::Win11::details::g_win11RemovePackageDependency = win11RemovePackageDependency; MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency = win11GetResolvedPackageFullNameForPackageDependency; MddCore::Win11::details::g_win11GetIdForPackageDependencyContext = win11GetIdForPackageDependencyContext; - MddCore::Win11::details::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; + MddCore::Win11::details::g_win11GetCurrentPackageInfo3 = win11GetCurrentPackageInfo3; return S_OK; } @@ -325,6 +377,13 @@ inline HRESULT WINAPI MddWin11Shutdown() noexcept } if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6) + { + MddCore::Win11::details::g_win11GetPackageGraphRevisionId = nullptr; + FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6); + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = nullptr; + } + + if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_5) { MddCore::Win11::details::g_win11TryCreatePackageDependency = nullptr; MddCore::Win11::details::g_win11DeletePackageDependency = nullptr; @@ -332,9 +391,9 @@ inline HRESULT WINAPI MddWin11Shutdown() noexcept MddCore::Win11::details::g_win11RemovePackageDependency = nullptr; MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency = nullptr; MddCore::Win11::details::g_win11GetIdForPackageDependencyContext = nullptr; - MddCore::Win11::details::g_win11GetPackageGraphRevisionId = nullptr; - FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6); - MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = nullptr; + MddCore::Win11::details::g_win11GetCurrentPackageInfo3 = nullptr; + FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_5); + MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_5 = nullptr; } return S_OK; } From db74f0ad7c37ac19fa3517658706c24f0c74e414 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 8 Nov 2023 14:00:08 -0800 Subject: [PATCH 15/18] Increase test timeout to 120m --- .../WindowsAppSDK-RunTestsInPipeline-Job.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/AzurePipelinesTemplates/WindowsAppSDK-RunTestsInPipeline-Job.yml b/build/AzurePipelinesTemplates/WindowsAppSDK-RunTestsInPipeline-Job.yml index 1adb59d903..2fd0582339 100644 --- a/build/AzurePipelinesTemplates/WindowsAppSDK-RunTestsInPipeline-Job.yml +++ b/build/AzurePipelinesTemplates/WindowsAppSDK-RunTestsInPipeline-Job.yml @@ -105,7 +105,7 @@ jobs: ${{ if parameters.isArm64Platfrom }}: name: 'WinAppSDK-Test-Pool-Arm64' demands: ImageOverride -equals $(imageName) - timeoutInMinutes: 60 + timeoutInMinutes: 120 variables: testPayloadArtifactDir: $(Build.SourcesDirectory)\BuildOutput\$(buildConfiguration)\$(buildPlatform) steps: From c76cf1b583305075ef278b99327941feba9fcf67 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 15 Nov 2023 14:13:19 -0800 Subject: [PATCH 16/18] Cleaned up debugging code --- .../API/M.AM.DD.PackageDependency.cpp | 10 +- .../API/M.AM.DD.PackageDependency.h | 1 - .../API/M.AM.DynamicDependency.idl | 13 --- dev/DynamicDependency/API/MddWin11.h | 96 +++++++++++-------- .../API/MsixDynamicDependency.cpp | 26 ----- .../API/MsixDynamicDependency.h | 9 -- .../MddBootstrap.cpp | 6 -- 7 files changed, 56 insertions(+), 105 deletions(-) diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp index 420659bc65..fc72392309 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp @@ -30,7 +30,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - //TODO GetPackageDependencyInfo(userSid, id.c_str(), &packageDependencyInfo) + //TODO:GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) } else { @@ -49,7 +49,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - //TODO GetPackageDependencyInfo(userSid, id.c_str(), &packageDependencyInfo) + //TODO:GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) } else { @@ -136,12 +136,6 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem return context; } - winrt::PackageDependencyContext PackageDependency::Resolve() - { - //TODO:Resolve - throw winrt::hresult_not_implemented(); - } - winrt::PackageDependency PackageDependency::Create( PSID userSid, PCWSTR packageFamilyName, diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h index ba34db6550..eacce8a1e5 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.h @@ -26,7 +26,6 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem void Delete(); winrt::PackageDependencyContext Add(); winrt::PackageDependencyContext Add(Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options); - winrt::PackageDependencyContext Resolve(); private: static winrt::PackageDependency Create( diff --git a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl index f8ac5187a8..d39e09fba1 100644 --- a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl +++ b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl @@ -246,7 +246,6 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency /// Successful calls change the package graph's current revision id. /// /// @see PackageGraphRevisionId - /// @see Resolve PackageDependencyContext Add(); /// Resolve a previously pinned PackageDependency to a specific package and @@ -286,20 +285,8 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency /// Successful calls change the package graph's current revision id. /// /// @see PackageGraphRevisionId - /// @see Resolve PackageDependencyContext Add(AddPackageDependencyOptions options); - /// Resolve a previously pinned PackageDependency to a specific package. - /// - /// @note This does NOT update the calling process' package graph. - /// - /// Package resolution is specific to a user. The same package dependency can - /// resolve to different packages for different users on a system. - /// - /// @see Add - [contract(DynamicDependencyContract, 3)] - PackageDependencyContext Resolve(); - /// Return the package graph's current revision id. [contract(DynamicDependencyContract, 2)] static UInt32 PackageGraphRevisionId{ get; }; diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index 8314e4d59b..e18a59eecf 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -39,7 +39,6 @@ namespace MddCore::Win11 __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; - //TODO:Resolve __declspec(selectany) decltype(&::ResolvePackageFullNameForPackageDependency) g_win11ResolvePackageFullNameForPackageDependency{}; //TODO:GetResolved2 __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency2) g_win11GetResolvedPackageFullNameForPackageDependency2{}; __declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; @@ -137,39 +136,69 @@ namespace MddCore::Win11 } #if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) -//TODO reimplement over above - inline HRESULT TryCreatePackageDependency( + inline HRESULT _TryCreatePackageDependency( PSID user, const winrt::hstring& packageFamilyName, const winrt::Windows::ApplicationModel::PackageVersion& minVersion, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + const MddCreatePackageDependencyOptions initialOptions, _Outptr_result_maybenull_ PWSTR* packageDependencyId) { - PCWSTR win11PackageFamilyName{ packageFamilyName.c_str() }; + PCWSTR mddPackageFamilyName{ packageFamilyName.c_str() }; const ::AppModel::Identity::PackageVersion minPackageVersion{ minVersion }; - const PACKAGE_VERSION win11MinVersion{ minPackageVersion }; + const PACKAGE_VERSION mddMinVersion{ minPackageVersion }; - auto win11PackageDependencyProcessorArchitectures{ PackageDependencyProcessorArchitectures_None }; - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Neutral, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Neutral)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_Arm64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::Arm64)); - WI_SetFlagIf(win11PackageDependencyProcessorArchitectures, PackageDependencyProcessorArchitectures_X86A64, WI_IsFlagSet(packageDependencyProcessorArchitectures, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures::X86OnArm64)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_Neutral) == static_cast(MddPackageDependencyProcessorArchitectures::Neutral)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_X86) == static_cast(MddPackageDependencyProcessorArchitectures::X86)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_X64) == static_cast(MddPackageDependencyProcessorArchitectures::X64)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_Arm) == static_cast(MddPackageDependencyProcessorArchitectures::Arm)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_Arm64) == static_cast(MddPackageDependencyProcessorArchitectures::Arm64)); + static_assert(static_cast(PackageDependencyProcessorArchitectures_X86A64) == static_cast(MddPackageDependencyProcessorArchitectures::X86OnArm64)); + const auto mddPackageDependencyProcessorArchitectures{ static_cast(packageDependencyProcessorArchitectures) }; - const auto win11LifetimeKind{ MddCore::Win11::details::ToLifetimeKind(options.LifetimeArtifactKind()) }; + static_assert(static_cast(MddPackageDependencyLifetimeKind::Process) == static_cast(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::Process)); + static_assert(static_cast(MddPackageDependencyLifetimeKind::FilePath) == static_cast(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::FilePath)); + static_assert(static_cast(MddPackageDependencyLifetimeKind::RegistryKey) == static_cast(winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyLifetimeArtifactKind::RegistryKey)); + const auto mddLifetimeKind{ static_cast(options.LifetimeArtifactKind()) }; - PCWSTR win11LifetimeArtifact{ options.LifetimeArtifact().c_str() }; + PCWSTR mddLifetimeArtifact{ options.LifetimeArtifact().c_str() }; - auto win11Options{ CreatePackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, CreatePackageDependencyOptions_DoNotVerifyDependencyResolution, !options.VerifyDependencyResolution()); - //TODO CreatePackageDependencyOptions_ScopeIsSystem + auto mddOptions{ initialOptions }; + WI_SetFlagIf(mddOptions, MddCreatePackageDependencyOptions::DoNotVerifyDependencyResolution, !options.VerifyDependencyResolution()); + // NOTE: ScopeIsSystem is handled by the caller via initialOptions - RETURN_IF_FAILED(MddCore::Win11::details::g_win11TryCreatePackageDependency(user, win11PackageFamilyName, win11MinVersion, - win11PackageDependencyProcessorArchitectures, win11LifetimeKind, win11LifetimeArtifact, - win11Options, packageDependencyId)); + RETURN_IF_FAILED(TryCreatePackageDependency(user, mddPackageFamilyName, mddMinVersion, + mddPackageDependencyProcessorArchitectures, mddLifetimeKind, mddLifetimeArtifact, mddOptions, packageDependencyId)); + return S_OK; + } + + inline HRESULT TryCreatePackageDependency( + PSID user, + const winrt::hstring& packageFamilyName, + const winrt::Windows::ApplicationModel::PackageVersion& minVersion, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) + { + RETURN_IF_FAILED(_TryCreatePackageDependency(user, packageFamilyName, minVersion, + packageDependencyProcessorArchitectures, options, + MddCreatePackageDependencyOptions::None, packageDependencyId)); + return S_OK; + } + + inline HRESULT TryCreatePackageDependencyForSystem( + PSID user, + const winrt::hstring& packageFamilyName, + const winrt::Windows::ApplicationModel::PackageVersion& minVersion, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::PackageDependencyProcessorArchitectures packageDependencyProcessorArchitectures, + winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::CreatePackageDependencyOptions const& options, + _Outptr_result_maybenull_ PWSTR* packageDependencyId) + { + RETURN_IF_FAILED(_TryCreatePackageDependency(user, packageFamilyName, minVersion, + packageDependencyProcessorArchitectures, options, + MddCreatePackageDependencyOptions::ScopeIsSystem, packageDependencyId)); return S_OK; } #endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) @@ -204,24 +233,20 @@ namespace MddCore::Win11 } #if defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) -//TODO reimplement over above inline HRESULT AddPackageDependency( const winrt::hstring& packageDependencyId, winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::AddPackageDependencyOptions const& options, _Out_ MDD_PACKAGEDEPENDENCY_CONTEXT* packageDependencyContext, _Outptr_opt_result_maybenull_ PWSTR* packageFullName) { - PCWSTR win11PackageDependencyId{ packageDependencyId.c_str() }; + PCWSTR mddPackageDependencyId{ packageDependencyId.c_str() }; - const auto win11Rank{ options.Rank() }; + const auto mddRank{ options.Rank() }; - auto win11Options{ AddPackageDependencyOptions_None }; - WI_SetFlagIf(win11Options, AddPackageDependencyOptions_PrependIfRankCollision, options.PrependIfRankCollision()); + auto mddOptions{ MddAddPackageDependencyOptions::None }; + WI_SetFlagIf(mddOptions, MddAddPackageDependencyOptions::PrependIfRankCollision, options.PrependIfRankCollision()); - static_assert(sizeof(MDD_PACKAGEDEPENDENCY_CONTEXT) == sizeof(PACKAGEDEPENDENCY_CONTEXT)); - auto win11PackageDependencyContext{ reinterpret_cast(packageDependencyContext) }; - - RETURN_IF_FAILED(MddCore::Win11::details::g_win11AddPackageDependency(win11PackageDependencyId, win11Rank, win11Options, win11PackageDependencyContext, packageFullName)); + RETURN_IF_FAILED(AddPackageDependency(mddPackageDependencyId, mddRank, mddOptions, packageDependencyContext, packageFullName)); return S_OK; } #endif // defined(WINRT_Microsoft_Windows_ApplicationModel_DynamicDependency_H) @@ -261,15 +286,6 @@ namespace MddCore::Win11 RETURN_WIN32(ERROR_NOT_SUPPORTED); } - inline HRESULT ResolvePackageFullNameForPackageDependency( - _In_ PCWSTR /*packageDependencyId*/, - _Outptr_result_maybenull_ PWSTR* /*packageFullName*/) - { - //TODO:Resolve RETURN_IF_FAILED(MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency(packageDependencyId, packageFullName)); - //TODO:Resolve return S_OK; - RETURN_HR(E_NOTIMPL); - } - inline HRESULT GetIdForPackageDependencyContext( _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, _Outptr_result_maybenull_ PWSTR* packageDependencyId) @@ -315,8 +331,6 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept RETURN_IF_FAILED(MddCore::Win11::details::Load(L"api-ms-win-appmodel-runtime-l1-1-7.dll", dllApisetAppmodelRuntime_1_7)); if (dllApisetAppmodelRuntime_1_7) { - //TODO:Resolve auto win11ResolvePackageFullNameForPackageDependency{ GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, ResolvePackageFullNameForPackageDependency) }; - //TODO:Resolve RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11ResolvePackageFullNameForPackageDependency); //TODO:GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); } @@ -349,7 +363,6 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept // Success MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; - //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = win11ResolvePackageFullNameForPackageDependency; //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = win11GetResolvedPackageFullNameForPackageDependency2; // MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; @@ -370,7 +383,6 @@ inline HRESULT WINAPI MddWin11Shutdown() noexcept { if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7) { - //TODO:Resolve MddCore::Win11::details::g_win11ResolvePackageFullNameForPackageDependency = nullptr; //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = nullptr; FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7); MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = nullptr; diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.cpp b/dev/DynamicDependency/API/MsixDynamicDependency.cpp index 0ad3326234..79cff8e7d9 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.cpp +++ b/dev/DynamicDependency/API/MsixDynamicDependency.cpp @@ -154,32 +154,6 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency2( } CATCH_RETURN(); -STDAPI MddResolvePackageFullNameForPackageDependency( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept try -{ - *packageFullName = nullptr; - - // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) - if (MddCore::Win11::IsSupported()) - { - RETURN_IF_FAILED(MddCore::Win11::ResolvePackageFullNameForPackageDependency(packageDependencyId, packageFullName)); - return S_OK; - } - - // WinAppSDK's Dynamic Dependencies requires a non-packaged process - RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), AppModel::Identity::IsPackagedProcess()); - - RETURN_HR_IF(E_INVALIDARG, !packageDependencyId || (packageDependencyId[0] == L'\0')); - - wil::unique_process_heap_string fullName; - RETURN_IF_FAILED(MddCore::PackageGraphManager::ResolvePackageDependency(packageDependencyId, MddAddPackageDependencyOptions::None, fullName)); - - *packageFullName = fullName.release(); - return S_OK; -} -CATCH_RETURN(); - STDAPI MddGetIdForPackageDependencyContext( _In_ MDD_PACKAGEDEPENDENCY_CONTEXT packageDependencyContext, _Outptr_result_maybenull_ PWSTR* packageDependencyId) noexcept try diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.h b/dev/DynamicDependency/API/MsixDynamicDependency.h index 5a008f624d..15a35fd705 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.h +++ b/dev/DynamicDependency/API/MsixDynamicDependency.h @@ -216,15 +216,6 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency2( _In_ PCWSTR packageDependencyId, _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; -/// Resolve the PackageDependency (if not already resolved). -/// -/// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. -/// If the package dependency cannot be resolved the function -/// succeeds but packageFullName is nullptr. -STDAPI MddResolvePackageFullNameForPackageDependency( - _In_ PCWSTR packageDependencyId, - _Outptr_result_maybenull_ PWSTR* packageFullName) noexcept; - /// Return the package dependency for the context. /// /// @param packageDependencyId allocated via HeapAlloc; use HeapFree to deallocate. diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp index e11d84189d..4d947c0db3 100644 --- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp +++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrap.cpp @@ -364,13 +364,10 @@ void FirstTimeInitialization( const std::wstring packageVersionTag{ !versionTag ? L"" : versionTag }; // Use the Win11 APIs if available (instead of WinAppSDK's implementation) -//TODO optimize common code if (MddCore::Win11::IsSupported()) { // Add the framework package to the package graph const std::wstring frameworkPackageFamilyName{ GetFrameworkPackageFamilyName(majorMinorVersion, packageVersionTag.c_str()) }; - - // Add the framework package to the package graph const MddPackageDependencyProcessorArchitectures architectureFilter{}; const auto lifetimeKind{ MddPackageDependencyLifetimeKind::Process }; const MddCreatePackageDependencyOptions createOptions{}; @@ -397,9 +394,6 @@ void FirstTimeInitialization( } // Track our initialized state - //TODO g_lifetimeManager = lifetimeManager.detach(); - //TODO g_endTheLifetimeManagerEvent = std::move(endTheLifetimeManagerEvent); - //TODO g_windowsAppRuntimeDll = std::move(windowsAppRuntimeDll); g_packageDependencyId = std::move(packageDependencyId); g_packageDependencyContext = packageDependencyContext; // From d5044a33bb057fbfb3526279b55f446897716a77 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 15 Nov 2023 14:29:50 -0800 Subject: [PATCH 17/18] Removed the unnecessary WinRT contract version change --- dev/DynamicDependency/API/M.AM.DynamicDependency.idl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl index d39e09fba1..140bf1a167 100644 --- a/dev/DynamicDependency/API/M.AM.DynamicDependency.idl +++ b/dev/DynamicDependency/API/M.AM.DynamicDependency.idl @@ -3,7 +3,7 @@ namespace Microsoft.Windows.ApplicationModel.DynamicDependency { - [contractversion(3)] + [contractversion(2)] apicontract DynamicDependencyContract{}; /// CPU architectures to optionally filter available packages against a package dependency. From 1b316b1fdb69cb146c7d929dd2399fc8870a3d18 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Mon, 27 Nov 2023 12:58:23 -0800 Subject: [PATCH 18/18] Incorporated feedback --- .../API/M.AM.DD.PackageDependency.cpp | 4 ++-- dev/DynamicDependency/API/MddWin11.h | 18 +++++++++--------- .../API/MsixDynamicDependency.h | 2 -- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp index fc72392309..08a157b823 100644 --- a/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp +++ b/dev/DynamicDependency/API/M.AM.DD.PackageDependency.cpp @@ -30,7 +30,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - //TODO:GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) + //TODO:47775758 GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) } else { @@ -49,7 +49,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::DynamicDependency::implem // Use the Win11 APIs if available (instead of Detour'ing to our own implementation) if (MddCore::Win11::IsSupported()) { - //TODO:GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) + //TODO:47775758 GetResolved2 GetPackageDependencyInfo2(userSid, id.c_str(), &packageDependencyInfo) } else { diff --git a/dev/DynamicDependency/API/MddWin11.h b/dev/DynamicDependency/API/MddWin11.h index e18a59eecf..79e7d63064 100644 --- a/dev/DynamicDependency/API/MddWin11.h +++ b/dev/DynamicDependency/API/MddWin11.h @@ -39,7 +39,7 @@ namespace MddCore::Win11 __declspec(selectany) decltype(&::GetPackageGraphRevisionId) g_win11GetPackageGraphRevisionId{}; __declspec(selectany) HMODULE g_dllApisetAppmodelRuntime_1_7{}; - //TODO:GetResolved2 __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency2) g_win11GetResolvedPackageFullNameForPackageDependency2{}; + //TODO:47775758 GetResolved2 __declspec(selectany) decltype(&::GetResolvedPackageFullNameForPackageDependency2) g_win11GetResolvedPackageFullNameForPackageDependency2{}; __declspec(selectany) bool g_isSupported{ WindowsVersion::IsWindows11_22H2OrGreater() }; @@ -280,9 +280,9 @@ namespace MddCore::Win11 _In_ PCWSTR /*packageDependencyId*/, _Outptr_result_maybenull_ PWSTR* /*packageFullName*/) { - //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), g_win11GetResolvedPackageFullNameForPackageDependency2); - //TODO:GetResolved2 RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2(packageDependencyId, packageFullName)); - //TODO:GetResolved2 return S_OK; + //TODO:47775758 GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), g_win11GetResolvedPackageFullNameForPackageDependency2); + //TODO:47775758 GetResolved2 RETURN_IF_FAILED(MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2(packageDependencyId, packageFullName)); + //TODO:47775758 GetResolved2 return S_OK; RETURN_WIN32(ERROR_NOT_SUPPORTED); } @@ -326,13 +326,13 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept return S_OK; } - //TODO:GetResolved2 auto win11GetResolvedPackageFullNameForPackageDependency2{ static_cast(nullptr) }; + //TODO:47775758 GetResolved2 auto win11GetResolvedPackageFullNameForPackageDependency2{ static_cast(nullptr) }; HMODULE dllApisetAppmodelRuntime_1_7{}; RETURN_IF_FAILED(MddCore::Win11::details::Load(L"api-ms-win-appmodel-runtime-l1-1-7.dll", dllApisetAppmodelRuntime_1_7)); if (dllApisetAppmodelRuntime_1_7) { - //TODO:GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); - //TODO:GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); + //TODO:47775758 GetResolved2 win11GetResolvedPackageFullNameForPackageDependency2 = GetProcAddressByFunctionDeclaration(dllApisetAppmodelRuntime_1_7, GetResolvedPackageFullNameForPackageDependency); + //TODO:47775758 GetResolved2 RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(GetLastError()), win11GetResolvedPackageFullNameForPackageDependency2); } auto win11GetPackageGraphRevisionId{ static_cast(nullptr) }; @@ -363,7 +363,7 @@ inline HRESULT WINAPI MddWin11Initialize() noexcept // Success MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = dllApisetAppmodelRuntime_1_7; - //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = win11GetResolvedPackageFullNameForPackageDependency2; + //TODO:47775758 GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = win11GetResolvedPackageFullNameForPackageDependency2; // MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_6 = dllApisetAppmodelRuntime_1_6; MddCore::Win11::details::g_win11GetPackageGraphRevisionId = win11GetPackageGraphRevisionId; @@ -383,7 +383,7 @@ inline HRESULT WINAPI MddWin11Shutdown() noexcept { if (MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7) { - //TODO:GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = nullptr; + //TODO:47775758 GetResolved2 MddCore::Win11::details::g_win11GetResolvedPackageFullNameForPackageDependency2 = nullptr; FreeLibrary(MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7); MddCore::Win11::details::g_dllApisetAppmodelRuntime_1_7 = nullptr; } diff --git a/dev/DynamicDependency/API/MsixDynamicDependency.h b/dev/DynamicDependency/API/MsixDynamicDependency.h index 15a35fd705..fb3365e37c 100644 --- a/dev/DynamicDependency/API/MsixDynamicDependency.h +++ b/dev/DynamicDependency/API/MsixDynamicDependency.h @@ -209,8 +209,6 @@ STDAPI MddGetResolvedPackageFullNameForPackageDependency( /// package to the process graph. /// /// @param packageFullName allocated via HeapAlloc; use HeapFree to deallocate. -/// If the package dependency cannot be resolved the function -/// succeeds but packageFullName is nullptr. /// @note An unknown packageDependencyId returns HRESULT_FROM_WIN32(ERROR_NOT_FOUND). STDAPI MddGetResolvedPackageFullNameForPackageDependency2( _In_ PCWSTR packageDependencyId,