diff --git a/dev/Common/TerminalVelocityFeatures-PackageManager.h b/dev/Common/TerminalVelocityFeatures-PackageManager.h index 99edf97bbd..8d19e4fef4 100644 --- a/dev/Common/TerminalVelocityFeatures-PackageManager.h +++ b/dev/Common/TerminalVelocityFeatures-PackageManager.h @@ -10,11 +10,13 @@ namespace features { feature_name Feature_PackageManager = { DisabledByDefault, FALSE }; + feature_name Feature_PackageValidator = { DisabledByDefault, FALSE }; } #endif // defined(__midlrt) // Feature constants #define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED 1 +#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEVALIDATOR_ENABLED 1 #if defined(__cplusplus) @@ -27,6 +29,12 @@ struct Feature_PackageManager static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEMANAGER_ENABLED == 1; } }; +__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEVALIDATOR_ENABLED_mismatch", "AlwaysEnabled")) +struct Feature_PackageValidator +{ + static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_MANAGEMENT_DEPLOYMENT_FEATURE_PACKAGEVALIDATOR_ENABLED == 1; } +}; + } // namespace Microsoft.Windows.Management.Deployment #endif // defined(__cplusplus) diff --git a/dev/Common/TerminalVelocityFeatures-PackageManager.xml b/dev/Common/TerminalVelocityFeatures-PackageManager.xml index 932aa39394..861bb23db6 100644 --- a/dev/Common/TerminalVelocityFeatures-PackageManager.xml +++ b/dev/Common/TerminalVelocityFeatures-PackageManager.xml @@ -17,4 +17,13 @@ Stable + + Feature_PackageValidator + Package Validator APIs + AlwaysEnabled + + Preview + Stable + + diff --git a/dev/PackageManager/API/PackageManager.idl b/dev/PackageManager/API/PackageManager.idl index 1a2a0e27b2..6940552fec 100644 --- a/dev/PackageManager/API/PackageManager.idl +++ b/dev/PackageManager/API/PackageManager.idl @@ -7,7 +7,7 @@ import "M.AM.DynamicDependency.idl"; namespace Microsoft.Windows.Management.Deployment { - [contractversion(2)] + [contractversion(3)] apicontract PackageDeploymentContract{}; /// Features can be queried if currently available/enabled. @@ -200,6 +200,14 @@ namespace Microsoft.Windows.Management.Deployment Boolean IsLimitToExistingPackagesSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) Boolean LimitToExistingPackages; + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + Boolean IsPackageValidatorsSupported{ get; }; // Requires Windows >= 10.0.26100.0 (aka Win11 24H2) + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + IVector PackageValidators{ get; }; } // Requires Windows >= 10.0.19041.0 (aka 2004 aka 20H1) @@ -224,6 +232,14 @@ namespace Microsoft.Windows.Management.Deployment Boolean IsExpectedDigestsSupported { get; }; // Requires Windows >= 10.0.22621.0 (aka Win11 22H2) IMap ExpectedDigests{ get; }; + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + Boolean IsPackageValidatorsSupported{ get; }; // Requires Windows >= 10.0.26100.0 (aka Win11 24H2) + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + IVector PackageValidators{ get; }; } // Requires Windows >= 10.0.19041.0 (aka 2004 aka 20H1) @@ -525,4 +541,46 @@ namespace Microsoft.Windows.Management.Deployment void RemovePackageSet( Microsoft.Windows.Management.Deployment.PackageSetRuntimeDisposition packageSetRuntimeDisposition); } + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + [default_interface] + runtimeclass AppxPackagingObject + { + // This is an interop class for COM types defined in AppxPackaging.idl. + // The WinRT side has no methods or properties, but the object supports QueryInterface into the COM interfaces + // IAppxPackageReader or IAppxBundleReader, whichever is relevant for the object being read. + } + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + interface IPackageValidator + { + // One can create custom validators if and when the need arises + Boolean IsPackageValid(AppxPackagingObject packagingObject); + } + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + runtimeclass PackageIdentityValidator : [default] IPackageValidator + { + PackageIdentityValidator(String expectedPackageFamilyName, Int64 expectedMinimumVersion); + Boolean IsPackageValid(AppxPackagingObject packagingObject); + } + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + runtimeclass PackageCertificateEkuValidator : [default] IPackageValidator + { + PackageCertificateEkuValidator(String expectedCertificateEku); + Boolean IsPackageValid(AppxPackagingObject packagingObject); + } + + [contract(PackageDeploymentContract, 3)] + [feature(Feature_PackageValidator)] + runtimeclass PackageValidatorEntry + { + Windows.Foundation.Uri Uri; + IPackageValidator Validator; + } }