diff --git a/PInvoke/WinTrust/SoftPub.cs b/PInvoke/WinTrust/SoftPub.cs
new file mode 100644
index 00000000..be72745d
--- /dev/null
+++ b/PInvoke/WinTrust/SoftPub.cs
@@ -0,0 +1,195 @@
+using System;
+using System.Runtime.InteropServices;
+using static Vanara.PInvoke.Crypt32;
+
+namespace Vanara.PInvoke;
+
+#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
+
+public static partial class WinTrust
+{
+ public const string DRIVER_CLEANUPPOLICY_FUNCTION = "DriverCleanupPolicy";
+
+ public const string DRIVER_FINALPOLPROV_FUNCTION = "DriverFinalPolicy";
+
+ public const string DRIVER_INITPROV_FUNCTION = "DriverInitializePolicy";
+
+ public const string GENERIC_CHAIN_CERTTRUST_FUNCTION = "GenericChainCertificateTrust";
+
+ public const string GENERIC_CHAIN_FINALPOLICY_FUNCTION = "GenericChainFinalProv";
+
+ public const string HTTPS_CERTTRUST_FUNCTION = "HTTPSCertificateTrust";
+
+ public const string HTTPS_CHKCERT_FUNCTION = "HTTPSCheckCertProv";
+
+ public const string HTTPS_FINALPOLICY_FUNCTION = "HTTPSFinalProv";
+
+ public const string OFFICE_CLEANUPPOLICY_FUNCTION = "OfficeCleanupPolicy";
+
+ public const string OFFICE_INITPROV_FUNCTION = "OfficeInitializePolicy";
+
+ public const string SP_CHKCERT_FUNCTION = "SoftpubCheckCert";
+
+ public const string SP_CLEANUPPOLICY_FUNCTION = "SoftpubCleanup";
+
+ public const string SP_FINALPOLICY_FUNCTION = "SoftpubAuthenticode";
+
+ public const string SP_GENERIC_CERT_INIT_FUNCTION = "SoftpubDefCertInit";
+
+ public const string SP_INIT_FUNCTION = "SoftpubInitialize";
+
+ public const string SP_OBJTRUST_FUNCTION = "SoftpubLoadMessage";
+
+ public const string SP_SIGTRUST_FUNCTION = "SoftpubLoadSignature";
+
+ public const string SP_TESTDUMPPOLICY_FUNCTION_TEST = "SoftpubDumpStructure";
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify the authenticity of a file against the Config CI policy. This is an
+ /// Authenticode add-on Policy Provider,
+ ///
+ public static readonly Guid CONFIG_CI_ACTION_VERIFY = new(0x6078065b, 0x8f22, 0x4b13, 0xbd, 0x9b, 0x5b, 0x76, 0x27, 0x76, 0xf3, 0x86);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify the authenticity of a WHQL signed driver. This is an Authenticode
+ /// add-on Policy Provider,
+ ///
+ public static readonly Guid DRIVER_ACTION_VERIFY = new(0xf750e6c3, 0x38ee, 0x11d1, 0x85, 0xe5, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify the SSL/PCT connections through IE.
+ public static readonly Guid HTTPSPROV_ACTION = new(0x573e31f8, 0xaaba, 0x11d0, 0x8c, 0xcb, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify the authenticity of a Structured Storage file using the Microsoft
+ /// Office Authenticode add-on Policy Provider,
+ ///
+ public static readonly Guid OFFICESIGN_ACTION_VERIFY = new(0x5555c2cd, 0x17fb, 0x11d1, 0x85, 0xc4, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify a certificate chain only. This is only valid when passing in a
+ /// certificate context in the WinVerifyTrust input structures.
+ ///
+ public static readonly Guid WINTRUST_ACTION_GENERIC_CERT_VERIFY = new(0x189a3842, 0x3041, 0x11d1, 0x85, 0xe1, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify certificate chains created from any object type: file, cert, signer,
+ /// ... A callback is provided to implement the final chain policy using the chain context for each signer and counter signer.
+ ///
+ public static readonly Guid WINTRUST_ACTION_GENERIC_CHAIN_VERIFY = new(0xfc451c16, 0xac75, 0x11d1, 0xb4, 0xb8, 0x00, 0xc0, 0x4f, 0xb6, 0x6e, 0xa0);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to verify the authenticity of a file/object using the Microsoft Authenticode
+ /// Policy Provider.
+ ///
+ public static readonly Guid WINTRUST_ACTION_GENERIC_VERIFY_V2 = new(0xaac56b, 0xcd44, 0x11d0, 0x8c, 0xc2, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ ///
+ /// Assigned to the pgActionID parameter of WinVerifyTrust to dump the CRYPT_PROVIDER_DATA structure to a file after calling the
+ /// Authenticode Policy Provider.
+ ///
+ public static readonly Guid WINTRUST_ACTION_TRUSTPROVIDER_TEST = new(0x573e31f8, 0xddba, 0x11d0, 0x8c, 0xcb, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee);
+
+ public unsafe delegate HRESULT PFN_WTD_GENERIC_CHAIN_POLICY_CALLBACK(in CRYPT_PROVIDER_DATA pProvData,
+ uint dwStepError, uint dwRegPolicySettings, uint cSigner,
+ [In] WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO** rgpSigner, [In] void* pvPolicyArg);
+
+ public enum CCPI : uint
+ {
+ CCPI_RESULT_ALLOW = 1,
+ CCPI_RESULT_DENY = 2,
+ CCPI_RESULT_AUDIT = 3,
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe struct CONFIG_CI_PROV_INFO
+ {
+ public uint cbSize;
+ public uint dwPolicies;
+ public uint dwScenario;
+ public CRYPTOAPI_BLOB* pPolicies;
+ public CONFIG_CI_PROV_INFO_RESULT result;
+ }
+
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ public struct CONFIG_CI_PROV_INFO_RESULT
+ {
+ public HRESULT hr;
+ public CCPI dwResult;
+ public uint dwPolicyIndex;
+ [MarshalAs(UnmanagedType.U1)]
+ public bool fIsExplicitDeny;
+ }
+
+ ///
+ /// NOTES:
+ /// 1. dwPlatform must_ be set to a non-zero value in order for proper version checking to be done.
+ /// 2. dwVersion is no longer used, sOSVersionLow and sOsVersionhigh have taken its place
+ /// 3. If dwBuildNumberLow and dwBuildNumberHigh are 0, they are unused. Otherwise, they are considered to be extensions of sOSVersionLow
+ /// and sOSVersionHigh respectively. Make special note of this when reading note 4.
+ /// 4. If you are validating against a single OS version, then set both sOSVersionLow and sOSVersion high, to the version you are
+ /// validating against. If sOSVersionLow and sOSVersionHigh are different, then the validation is done for the whole version range, from
+ /// sOSVersionLow to sOSVersionHigh.
+ ///
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ public struct DRIVER_VER_INFO
+ {
+ private const int MAX_PATH = 260;
+ public uint cbStruct; // [In] - set to Marshal.SizeOf(typeof(DRIVER_VER_INFO))
+ public IntPtr dwReserved1; // [In] - set to default
+ public IntPtr dwReserved2; // [In] - set to default
+ public uint dwPlatform; // [In] - OPTIONAL: platform to use
+ public uint dwVersion; // [In] - OPTIONAL: major version to use (NOT USED!!!)
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
+ public string wszVersion; // [Out]"),: version string from catalog file
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
+ public string wszSignedBy; // [Out]"),: signer display name from certificate
+
+ public PCCERT_CONTEXT pcSignerCertContext; // [Out]"),: client MUST free this!!!
+ public DRIVER_VER_MAJORMINOR sOSVersionLow; // [In] - OPTIONAL: lowest compatible version
+ public DRIVER_VER_MAJORMINOR sOSVersionHigh; // [In] - OPTIONAL: highest compatible version
+ public uint dwBuildNumberLow; // [In] - OPTIONAL: added to sOSVersionLow as third node for finer version granularity
+ public uint dwBuildNumberHigh; // [In] - OPTIONAL: added to sOSVersionHigh as third node for finer version granularity
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct DRIVER_VER_MAJORMINOR
+ {
+ public uint dwMajor;
+ public uint dwMinor;
+ }
+
+ // The fields in the following data structure are passed to CertGetCertificateChain().
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe struct WTD_GENERIC_CHAIN_POLICY_CREATE_INFO
+ {
+ public uint cbStruct;
+ public HCERTCHAINENGINE hChainEngine;
+ public CERT_CHAIN_PARA* pChainPara;
+ public CertChainFlags dwFlags;
+ public IntPtr pvReserved;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe struct WTD_GENERIC_CHAIN_POLICY_DATA
+ {
+ public uint cbStruct;
+ public WTD_GENERIC_CHAIN_POLICY_CREATE_INFO* pSignerChainInfo;
+ public WTD_GENERIC_CHAIN_POLICY_CREATE_INFO* pCounterSignerChainInfo;
+ public PFN_WTD_GENERIC_CHAIN_POLICY_CALLBACK pfnPolicyCallback;
+ public IntPtr pvPolicyArg;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public unsafe struct WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO
+ {
+ public uint cbStruct;
+ public PCCERT_CHAIN_CONTEXT pChainContext;
+ public uint dwSignerType;
+ public CMSG_SIGNER_INFO* pMsgSignerInfo;
+ public uint dwError;
+ public uint cCounterSigner;
+ public WTD_GENERIC_CHAIN_POLICY_SIGNER_INFO* rgpCounterSigner;
+ }
+}
\ No newline at end of file