BOOL WINAPI CryptQueryObject(
  _In_        DWORD      dwObjectType,
  _In_        VOID       *pvObject,
  _In_        DWORD      dwExpectedContentTypeFlags,
  _In_        DWORD      dwExpectedFormatTypeFlags,
  _In_        DWORD      dwFlags,
  _Out_       DWORD      *pdwMsgAndCertEncodingType,
  _Out_       DWORD      *pdwContentType,
  _Out_       DWORD      *pdwFormatType,
  _Out_       HCERTSTORE *phCertStore,
  _Out_       HCRYPTMSG  *phMsg,
  _Out_       PVOID       *ppvContext
);

BOOL WINAPI CryptMsgGetParam(
  _In_    HCRYPTMSG hCryptMsg,
  _In_    DWORD     dwParamType,
  _In_    DWORD     dwIndex,
  _Out_   VOID      *pvData,
  _Inout_ DWORD     *pcbData
);


BOOL WINAPI CryptDecodeObject(
  _In_          DWORD  dwCertEncodingType,
  _In_          LPCSTR lpszStructType,
  _In_          BYTE   *pbEncoded,
  _In_          DWORD  cbEncoded,
  _In_          DWORD  dwFlags,
  _Out_         VOID   *pvStructInfo,
  _Inout_       DWORD  *pcbStructInfo
);


PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
  _In_       HCERTSTORE     hCertStore,
  _In_       DWORD          dwCertEncodingType,
  _In_       DWORD          dwFindFlags,
  _In_       DWORD          dwFindType,
  _In_       VOID           *pvFindPara,
  _In_       PCCERT_CONTEXT pPrevCertContext
);

DWORD WINAPI CertGetNameStringA(
  _In_  PCCERT_CONTEXT pCertContext,
  _In_  DWORD          dwType,
  _In_  DWORD          dwFlags,
  _In_  VOID           *pvTypePara,
  _Out_ LPCSTR         pszNameString,
  _In_  DWORD          cchNameString
);

DWORD WINAPI CertGetNameStringW(
  _In_  PCCERT_CONTEXT pCertContext,
  _In_  DWORD          dwType,
  _In_  DWORD          dwFlags,
  _In_  VOID           *pvTypePara,
  _Out_ LPWSTR         pszNameString,
  _In_  DWORD          cchNameString
);


BOOL WINAPI CertGetCertificateChain(
  _In_opt_ HCERTCHAINENGINE     hChainEngine,
  _In_     PCCERT_CONTEXT       pCertContext,
  _In_opt_ LPFILETIME           pTime,
  _In_     HCERTSTORE           hAdditionalStore,
  _In_     PCERT_CHAIN_PARA     pChainPara,
  _In_     DWORD                dwFlags,
  _In_     LPVOID               pvReserved,
  _Out_    PCCERT_CHAIN_CONTEXT *ppChainContext
);

PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(
  _In_opt_ HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
  _In_     PCERT_NAME_BLOB                 pSubjectIssuerBlob,
  _In_     DWORD                           dwFlags,
  _In_opt_ PCRYPT_KEY_PROV_INFO            pKeyProvInfo,
  _In_opt_ PCRYPT_ALGORITHM_IDENTIFIER     pSignatureAlgorithm,
  _In_opt_ PSYSTEMTIME                     pStartTime,
  _In_opt_ PSYSTEMTIME                     pEndTime,
  _In_opt_ PCERT_EXTENSIONS                pExtensions
);


BOOL WINAPI CertStrToNameA(
  _In_      DWORD   dwCertEncodingType,
  _In_      LPCSTR  pszX500,
  _In_      DWORD   dwStrType,
  _In_opt_  VOID    *pvReserved,
  _Out_     BYTE    *pbEncoded,
  _Inout_   DWORD   *pcbEncoded,
  _Out_opt_ LPCSTR *ppszError
);

BOOL WINAPI CertStrToNameW(
  _In_      DWORD   dwCertEncodingType,
  _In_      LPWSTR  pszX500,
  _In_      DWORD   dwStrType,
  _In_opt_  VOID    *pvReserved,
  _Out_     BYTE    *pbEncoded,
  _Inout_   DWORD   *pcbEncoded,
  _Out_opt_ LPWSTR *ppszError
);

HCERTSTORE WINAPI CertOpenStore(
  _In_       LPCSTR            lpszStoreProvider,
  _In_       DWORD             dwMsgAndCertEncodingType,
  _In_       HCRYPTPROV_LEGACY hCryptProv,
  _In_       DWORD             dwFlags,
  _In_       VOID              *pvPara
);

BOOL WINAPI CertAddCertificateContextToStore(
  _In_      HCERTSTORE     hCertStore,
  _In_      PCCERT_CONTEXT pCertContext,
  _In_      DWORD          dwAddDisposition,
  _Out_opt_ PCCERT_CONTEXT *ppStoreContext
);


BOOL WINAPI PFXExportCertStoreEx(
  _In_    HCERTSTORE      hStore,
  _Inout_ CRYPT_DATA_BLOB *pPFX,
  _In_    LPCWSTR         szPassword,
  _In_    VOID            *pvPara,
  _In_    DWORD           dwFlags
);

HCERTSTORE WINAPI PFXImportCertStore(
  _In_ CRYPT_DATA_BLOB *pPFX,
  _In_ LPCWSTR         szPassword,
  _In_ DWORD           dwFlags
);


BOOL WINAPI CryptGenKey(
  _In_  HCRYPTPROV hProv,
  _In_  ALG_ID     Algid,
  _In_  DWORD      dwFlags,
  _Out_ HCRYPTKEY  *phKey
);

BOOL WINAPI CryptDestroyKey(
  _In_ HCRYPTKEY hKey
);

BOOL WINAPI CryptAcquireContextA(
  _Out_ HCRYPTPROV *phProv,
  _In_  LPCSTR    pszContainer,
  _In_  LPCSTR    pszProvider,
  _In_  DWORD      dwProvType,
  _In_  DWORD      dwFlags
);

BOOL WINAPI CryptAcquireContextW(
  _Out_ HCRYPTPROV *phProv,
  _In_  LPWSTR    pszContainer,
  _In_  LPWSTR    pszProvider,
  _In_  DWORD      dwProvType,
  _In_  DWORD      dwFlags
);


BOOL WINAPI CryptReleaseContext(
  _In_ HCRYPTPROV hProv,
  _In_ DWORD      dwFlags
);

BOOL WINAPI CryptExportKey(
  _In_    HCRYPTKEY hKey,
  _In_    HCRYPTKEY hExpKey,
  _In_    DWORD     dwBlobType,
  _In_    DWORD     dwFlags,
  _Out_   BYTE      *pbData,
  _Inout_ DWORD     *pdwDataLen
);


BOOL WINAPI CertGetCertificateContextProperty(
  _In_    PCCERT_CONTEXT pCertContext,
  _In_    DWORD          dwPropId,
  _Out_   VOID           *pvData,
  _Inout_ DWORD          *pcbData
);

DWORD WINAPI CertEnumCertificateContextProperties(
  _In_ PCCERT_CONTEXT pCertContext,
  _In_ DWORD          dwPropId
);

BOOL WINAPI CryptEncryptMessage(
  _In_          PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
  _In_          DWORD                       cRecipientCert,
  _In_          PCCERT_CONTEXT              *rgpRecipientCert,
  _In_          BYTE                        *pbToBeEncrypted,
  _In_          DWORD                       cbToBeEncrypted,
  _Out_         BYTE                        *pbEncryptedBlob,
  _Inout_       DWORD                       *pcbEncryptedBlob
);

BOOL WINAPI CryptDecryptMessage(
  _In_              PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  _In_              BYTE                        *pbEncryptedBlob,
  _In_              DWORD                       cbEncryptedBlob,
  _Out_opt_         BYTE                        *pbDecrypted,
  _Inout_opt_       DWORD                       *pcbDecrypted,
  _Out_opt_         PCCERT_CONTEXT              *ppXchgCert
);

BOOL WINAPI CryptAcquireCertificatePrivateKey(
  _In_     PCCERT_CONTEXT                  pCert,
  _In_     DWORD                           dwFlags,
  _In_opt_ VOID                            *pvParameters,
  _Out_    HCRYPTPROV_OR_NCRYPT_KEY_HANDLE *phCryptProvOrNCryptKey,
  _Out_    DWORD                           *pdwKeySpec,
  _Out_    BOOL                            *pfCallerFreeProvOrNCryptKey
);


PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(
  _In_ PCCERT_CONTEXT pCertContext
);


PCCERT_CONTEXT WINAPI CertEnumCertificatesInStore(
  _In_ HCERTSTORE     hCertStore,
  _In_ PCCERT_CONTEXT pPrevCertContext
);

BOOL WINAPI CryptEncodeObjectEx(
  _In_          DWORD              dwCertEncodingType,
  _In_          LPCSTR             lpszStructType,
  _In_          VOID               *pvStructInfo,
  _In_          DWORD              dwFlags,
  _In_          PCRYPT_ENCODE_PARA pEncodePara,
  _Out_         VOID               *pvEncoded,
  _Inout_       DWORD              *pcbEncoded
);

PCCERT_CONTEXT WINAPI CertCreateCertificateContext(
  _In_       DWORD dwCertEncodingType,
  _In_       BYTE  *pbCertEncoded,
  _In_       DWORD cbCertEncoded
);

BOOL WINAPI CertCompareCertificate(
  _In_ DWORD      dwCertEncodingType,
  _In_ PCERT_INFO pCertId1,
  _In_ PCERT_INFO pCertId2
);
