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;
+ }
}