Skip to content

Commit

Permalink
PackageDeploymentManager/PackageRuntimeManager v0 (experimental) (mic…
Browse files Browse the repository at this point in the history
…rosoft#3820)

Also

* Manually update DevChcek (awaiting Maestro to automate that thing it's supposed to be doing. Oh, Will...)
* Update TAEF from 10.75.221207001 to 10.82.230714001. Update C++/WinRT from 2.0.221121.5 to 2.0.230706.1
* Something weird's failing in the ARM64 tests. Disabling ARM64 temporarily
  • Loading branch information
DrusTheAxe authored Sep 5, 2023
1 parent 2e6a398 commit 874d66a
Show file tree
Hide file tree
Showing 164 changed files with 6,999 additions and 121 deletions.
167 changes: 167 additions & 0 deletions WindowsAppRuntime.sln

Large diffs are not rendered by default.

136 changes: 135 additions & 1 deletion dev/Common/AppModel.Identity.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// Copyright (c) Microsoft Corporation and Contributors.
// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

#ifndef __APPMODEL_IDENTITY_H
#define __APPMODEL_IDENTITY_H

#include <appmodel.h>

#include <memory>
#include <stdint.h>

namespace AppModel::Identity
{
inline bool IsPackagedProcess()
Expand Down Expand Up @@ -46,6 +49,34 @@ constexpr PCWSTR GetCurrentArchitectureAsString()
#endif
}

constexpr PCWSTR GetArchitectureAsString(const std::uint32_t architecture)
{
switch (architecture)
{
case PROCESSOR_ARCHITECTURE_AMD64: return L"x64";
case PROCESSOR_ARCHITECTURE_ARM: return L"arm";
case PROCESSOR_ARCHITECTURE_ARM64: return L"arm64";
case PROCESSOR_ARCHITECTURE_IA32_ON_ARM64: return L"x86onArm64";
case PROCESSOR_ARCHITECTURE_INTEL: return L"x86";
case PROCESSOR_ARCHITECTURE_NEUTRAL: return L"neutral";
case PROCESSOR_ARCHITECTURE_UNKNOWN: return L"unknown";
default: THROW_HR_MSG(E_UNEXPECTED, "Unknown architecture 0x%X", architecture);
}
}

constexpr PCWSTR GetArchitectureAsString(const winrt::Windows::System::ProcessorArchitecture architecture)
{
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Arm) == static_cast<int>(PROCESSOR_ARCHITECTURE_ARM), "winrt::Windows::System::ProcessorArchitecture::Arm != PROCESSOR_ARCHITECTURE_ARM");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Arm64) == static_cast<int>(PROCESSOR_ARCHITECTURE_ARM64), "winrt::Windows::System::ProcessorArchitecture::Arm64 != PROCESSOR_ARCHITECTURE_ARM64");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Neutral) == static_cast<int>(PROCESSOR_ARCHITECTURE_NEUTRAL), "winrt::Windows::System::ProcessorArchitecture::Neutral != PROCESSOR_ARCHITECTURE_NEUTRAL");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::Unknown) == static_cast<int>(PROCESSOR_ARCHITECTURE_UNKNOWN), "winrt::Windows::System::ProcessorArchitecture::Unknown != PROCESSOR_ARCHITECTURE_UNKNOWN");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X64) == static_cast<int>(PROCESSOR_ARCHITECTURE_AMD64), "winrt::Windows::System::ProcessorArchitecture::X64 != PROCESSOR_ARCHITECTURE_AMD64");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X86) == static_cast<int>(PROCESSOR_ARCHITECTURE_INTEL), "winrt::Windows::System::ProcessorArchitecture::X86 != PROCESSOR_ARCHITECTURE_INTEL");
static_assert(static_cast<int>(winrt::Windows::System::ProcessorArchitecture::X86OnArm64) == static_cast<int>(PROCESSOR_ARCHITECTURE_IA32_ON_ARM64), "winrt::Windows::System::ProcessorArchitecture::X86OnArm64 != PROCESSOR_ARCHITECTURE_IA32_ON_ARM64");

return GetArchitectureAsString(static_cast<std::uint32_t>(architecture));
}

inline winrt::Windows::System::ProcessorArchitecture ParseArchitecture(_In_ PCWSTR architecture)
{
if (CompareStringOrdinal(architecture, -1, L"x64", -1, TRUE) == CSTR_EQUAL)
Expand Down Expand Up @@ -109,6 +140,109 @@ inline winrt::Windows::System::ProcessorArchitecture ParseShortArchitecture(_In_
}
}

class PackageVersion : public PACKAGE_VERSION
{
public:
PackageVersion(const PackageVersion&) = default;

// Create an instance with the value `major.minor.build.revision`.
PackageVersion(std::uint16_t major, std::uint16_t minor = 0, std::uint16_t build = 0, std::uint16_t revision = 0) :
PACKAGE_VERSION()
{
Major = major;
Minor = minor;
Build = build;
Revision = revision;
}

// Create an instance from a version as a uint64.
PackageVersion(std::uint64_t version = 0)
{
Version = version;
}

template<typename TVersion>
PackageVersion(TVersion const& t) :
PackageVersion(t.Major, t.Minor, t.Build, t.Revision)
{
}

#if defined(WINRT_Windows_ApplicationModel_2_H)
PackageVersion(winrt::Windows::ApplicationModel::PackageVersion packageVersion) :
PACKAGE_VERSION()
{
Major = packageVersion.Major;
Minor = packageVersion.Minor;
Build = packageVersion.Build;
Revision = packageVersion.Revision;
}
#endif // defined(WINRT_Windows_ApplicationModel_2_H)

PackageVersion& operator=(const PackageVersion&) = default;

// Return the version as a uint64.
std::uint64_t ToVersion() const
{
return Version;
}

#if defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__)
ABI::Windows::ApplicationModel::PackageVersion ToPackageVersion() const
{
return ABI::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision };
}
#endif // defined(____x_ABI_CWindows_CApplicationModel_CIPackageId_INTERFACE_DEFINED__)

#if defined(WINRT_Windows_ApplicationModel_2_H)
winrt::Windows::ApplicationModel::PackageVersion ToWinrtPackageVersion() const
{
return winrt::Windows::ApplicationModel::PackageVersion{ Major, Minor, Build, Revision };
}
#endif // defined(WINRT_Windows_ApplicationModel_2_H)

#if defined(_XSTRING_)
// Return the string as a formatted value "major.minor.build.revision".
std::wstring ToString() const
{
return ToString(Major, Minor, Build, Revision);
}

static std::wstring ToString(std::uint16_t major, std::uint16_t minor, std::uint16_t build, std::uint16_t revision)
{
#if (__cplusplus >= 202002L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
return std::format(L"{}.{}.{}.{}", major, minor, build, revision);
#else
return std::to_wstring(major) + L"." + std::to_wstring(minor) + L"." + std::to_wstring(build) + L"." + std::to_wstring(revision);
#endif
}
#endif defined(_XSTRING_)
};

inline bool operator==(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version == packageVersion2.Version;
}
inline bool operator!=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version != packageVersion2.Version;
}
inline bool operator<(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version < packageVersion2.Version;
}
inline bool operator<=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version <= packageVersion2.Version;
}
inline bool operator>(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version > packageVersion2.Version;
}
inline bool operator>=(const PackageVersion& packageVersion1, const PackageVersion& packageVersion2)
{
return packageVersion1.Version >= packageVersion2.Version;
}

inline bool IsValidVersionShortTag(
const std::wstring& versionShortTag)
{
Expand Down
29 changes: 28 additions & 1 deletion dev/Common/AppModel.Package.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// Copyright (c) Microsoft Corporation and Contributors.
// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

#ifndef __APPMODEL_PACKAGE_H
#define __APPMODEL_PACKAGE_H

#include <appmodel.h>

#include <AppModel.Identity.h>

namespace AppModel::Package
{
/// Find all Main+Framework packages in a package family registered to the current user
Expand Down Expand Up @@ -52,6 +54,31 @@ inline PACKAGE_VERSION ToPackageVersion(winrt::Windows::ApplicationModel::Packag
to.Revision = from.Revision;
return to;
}

inline std::tuple<std::wstring, PACKAGE_VERSION, std::uint32_t, std::wstring, std::wstring, std::wstring> ParsePackageFullName(PCWSTR packageFullName)
{
BYTE buffer[
sizeof(PACKAGE_ID) +
sizeof(WCHAR) * (PACKAGE_NAME_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_VERSION_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_ARCHITECTURE_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_RESOURCEID_MAX_LENGTH + 1) +
sizeof(WCHAR) * (PACKAGE_PUBLISHERID_MAX_LENGTH + 1)]{};
UINT32 bufferLength{ ARRAYSIZE(buffer) };
THROW_IF_WIN32_ERROR_MSG(::PackageIdFromFullName(packageFullName, PACKAGE_INFORMATION_BASIC, &bufferLength, buffer), "%ls", packageFullName);
const auto& packageId{ *reinterpret_cast<PACKAGE_ID*>(buffer) };

WCHAR packageFamilyName[PACKAGE_FAMILY_NAME_MAX_LENGTH + 1]{};
UINT32 packageFamilyNameLength{ ARRAYSIZE(packageFamilyName) };
THROW_IF_WIN32_ERROR_MSG(::PackageFamilyNameFromId(&packageId, &packageFamilyNameLength, packageFamilyName), "%ls", packageFullName);

return { std::wstring(packageId.name), packageId.version, packageId.processorArchitecture, std::wstring(packageId.resourceId ? packageId.resourceId : L""), std::wstring(packageId.publisherId), std::wstring(packageFamilyName) };
}

inline std::tuple<std::wstring, PACKAGE_VERSION, std::uint32_t, std::wstring, std::wstring, std::wstring> ParsePackageFullName(const std::wstring& packageFullName)
{
return ParsePackageFullName(packageFullName.c_str());
}
}

#endif // __APPMODEL_PACKAGE_H
32 changes: 32 additions & 0 deletions dev/Common/TerminalVelocityFeatures-PackageManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.

// THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT IT

// INPUT FILE: dev\common\TerminalVelocityFeatures-PackageManager.xml
// OPTIONS: -Channel Experimental -Language C++ -Namespace Microsoft.Windows.Management.Deployment -Path dev\common\TerminalVelocityFeatures-PackageManager.xml -Output dev\common\TerminalVelocityFeatures-PackageManager.h

#if defined(__midlrt)
namespace features
{
feature_name Feature_PackageManager = { DisabledByDefault, FALSE };
}
#endif // defined(__midlrt)

// Feature constants
#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED 1

#if defined(__cplusplus)

namespace Microsoft::Windows::Management::Deployment
{

__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED_mismatch", "AlwaysEnabled"))
struct Feature_PackageManager
{
static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED == 1; }
};

} // namespace Microsoft.Windows.Management.Deployment

#endif // defined(__cplusplus)
20 changes: 20 additions & 0 deletions dev/Common/TerminalVelocityFeatures-PackageManager.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<features xmlns="http://microsoft.com/windowsappsdk/TerminalVelocity/20210729/TerminalVelocityFeatures.xsd">

<!-- Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License. See LICENSE in the project root for license information.
-->

<!-- See docs/TerminalVelocity.md for more info. -->

<!-- Enabled variants -->
<feature>
<name>Feature_PackageManager</name>
<description>Package Management APIs</description>
<state>AlwaysEnabled</state>
<alwaysDisabledChannelTokens>
<channelToken>Preview</channelToken>
<channelToken>Stable</channelToken>
</alwaysDisabledChannelTokens>
</feature>
</features>
2 changes: 1 addition & 1 deletion dev/DeploymentAgent/packages.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Windows.CppWinRT" version="2.0.221121.5" targetFramework="native" />
<package id="Microsoft.Windows.CppWinRT" version="2.0.230706.1" targetFramework="native" />
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.220914.1" targetFramework="native" />
</packages>
5 changes: 4 additions & 1 deletion dev/DynamicDependency/API/DynamicDependency.vcxitems
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<ClCompile Include="$(MSBuildThisFileDirectory)M.AM.DD.PackageDependencyRank.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddDetourPackageGraph.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddWin11.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MddWinRT.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)PackageDependency.cpp" />
Expand All @@ -46,6 +47,7 @@
<ClInclude Include="$(MSBuildThisFileDirectory)MddDetourPackageGraph.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddLifetimeManagementTest.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddWin11.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MddWinRT.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)M.AM.Converters.h" />
Expand All @@ -69,8 +71,9 @@
<PublicHeaders Include="$(MSBuildThisFileDirectory)appmodel_msixdynamicdependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddLifetimeManagement.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddLifetimeManagementTest.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MddWin11.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)MsixDynamicDependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)..\..\common\TerminalVelocityFeatures-DynamicDependency.h" />
<PublicHeaders Include="$(MSBuildThisFileDirectory)wil_msixdynamicdependency.h" />
</ItemGroup>
</Project>
</Project>
8 changes: 7 additions & 1 deletion dev/DynamicDependency/API/DynamicDependency.vcxitems.filters
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
<ClCompile Include="$(MSBuildThisFileDirectory)DataStore.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)MddWin11.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)MddWinRT.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down Expand Up @@ -127,6 +130,9 @@
<ClInclude Include="$(MSBuildThisFileDirectory)DataStore.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)MddWin11.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)MddWinRT.h">
<Filter>Header Files</Filter>
</ClInclude>
Expand All @@ -152,4 +158,4 @@
<ItemGroup>
<Midl Include="$(MSBuildThisFileDirectory)M.AM.DynamicDependency.idl" />
</ItemGroup>
</Project>
</Project>
Loading

0 comments on commit 874d66a

Please sign in to comment.