创建新功能

以下函数是可以扩展的 CryptoAPI 函数之一。

CryptoAPI 函数 OID 函数名称定义 OID 函数名称字符串
CryptEncodeObject CRYPT_OID_ENCODE_ OBJECT_FUNC
“CryptDllEncodeObject”
CryptDecodeObject CRYPT_OID_DECODE_ OBJECT_FUNC
“CryptDllDecodeObject”
CertOpenStore CRYPT_OID_OPEN_ STORE_PROV_FUNC
“CertDllOpenStoreProv”
CertVerifyCTLUsage CRYPT_OID_VERIFY_ CTL_USAGE_FUNC
“CertDllVerifyCTLUsage”
CertVerifyRevocation CRYPT_OID_VERIFY_ REVOCATION_FUNC
“CertDllVerifyRevocation”

 

通常,使用现有 OID 和编码类型时,将使用 CryptoAPI 函数中的代码本身。 如果其中一个函数是使用 OID 调用的,并且未设计 CryptoAPI 函数中的代码编码类型,则必须在 DLL 中创建包含新功能的新函数。 该 DLL 必须在注册表中注册或安装在内存中。

使用新指定的 OID 和编码类型调用其中一个列出的函数时,将使用新 DLL 中的代码,而不是作为 CryptoAPI 函数的一部分提供的代码。

新开发函数的名称可以是上表中“OID 函数名称字符串”下列出的名称,也可以在注册新函数代码时提供其他名称。

新函数必须使用适当的原型。 除 CertOpenStore 之外的所有情况下,此原型与调用新函数的 CryptoAPI 函数相同。 对于 CertOpenStore ,原型如下所示。

#include <windows.h>

BOOL WINAPI CertDllOpenStoreProv(
  IN LPCSTR lpszStoreProvider,
  IN DWORD dwEncodingType,
  IN HCRYPTPROV hCryptProv,
  IN DWORD dwFlags,
  IN const void *pvPara,
  IN HCERTSTORE hCertStore,
  IN OUT PCERT_STORE_PROV_INFO pStoreProvInfo
);

注意

如果原型不匹配,系统堆栈将损坏。

 

除了在 DLL 中为新函数提供代码外,扩展 CryptEncodeObjectCryptDecodeObject 的功能还要求在编译用户程序时将新的 C 数据结构的类型定义放在标头文件中。