private static extern int SignerTimeStampEx(
     uint dwFlags,                      // DWORD
     IntPtr pSubjectInfo,               // SIGNER_SUBJECT_INFO
     string pwszHttpTimeStamp,          // LPCWSTR
     IntPtr psRequest,                  // PCRYPT_ATTRIBUTES
     IntPtr pSipData,                   // LPVOID
     out SIGNER_CONTEXT ppSignerContext // SIGNER_CONTEXT
     );
 private static extern int SignerSignEx(
     uint dwFlags,                      // DWORD
     IntPtr pSubjectInfo,               // SIGNER_SUBJECT_INFO
     IntPtr pSignerCert,                // SIGNER_CERT
     IntPtr pSignatureInfo,             // SIGNER_SIGNATURE_INFO
     IntPtr pProviderInfo,              // SIGNER_PROVIDER_INFO
     string pwszHttpTimeStamp,          // LPCWSTR
     IntPtr psRequest,                  // PCRYPT_ATTRIBUTES
     IntPtr pSipData,                   // LPVOID
     out SIGNER_CONTEXT ppSignerContext // SIGNER_CONTEXT
     );
        // Use SignerTimeStampEx
        private static void TimeStampSignedCode(uint dwFlags, IntPtr pSubjectInfo, string timestampUrl, out SIGNER_CONTEXT signerContext)
        {
            int hResult = SignerTimeStampEx(
                dwFlags,
                pSubjectInfo,
                timestampUrl,
                IntPtr.Zero,
                IntPtr.Zero,
                out signerContext
                );

            if (hResult != 0)
            {
                // We can't get anything useful from GetHRForLastWin32Error, so let's throw our own.
                //Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                throw new Exception(string.Format(@"""{0}"" could not be used at this time.  If necessary, check the timestampUrl, internet connection, and try again.", timestampUrl));
            }
        }
        // Use SignerSignEx
        private static void SignCode(uint dwFlags, IntPtr pSubjectInfo, IntPtr pSignerCert, IntPtr pSignatureInfo, IntPtr pProviderInfo, out SIGNER_CONTEXT signerContext)
        {
            int hResult = SignerSignEx(
                dwFlags,
                pSubjectInfo,
                pSignerCert,
                pSignatureInfo,
                pProviderInfo,
                null,
                IntPtr.Zero,
                IntPtr.Zero,
                out signerContext
                );

            if (hResult != 0)
            {
                // See if we can get anything useful.  Jury's still out on this one.
                Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
            }
        }