新しい機能の作成

次の関数は、拡張できる CryptoAPI 関数の 1 つです。

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 関数自体のコードが使用されます。 これらの関数の 1 つが OID で呼び出され、CryptoAPI 関数のコードが処理するように設計されていないエンコードの種類である場合は、新しい機能を含む新しい関数を DLL に作成する必要があります。 その DLL は、レジストリに登録するか、メモリにインストールする必要があります。

リストされている関数の 1 つが新しく指定された OID とエンコードの種類で呼び出されると、CryptoAPI 関数の一部として提供されるコードではなく、新しい DLL 内のコードが使用されます。

新しく開発された関数の名前は、前の表の "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 で新しい関数のコードを提供するだけでなく、 CryptEncodeObject または CryptDecodeObject の機能を拡張するには、新しい C データ構造の型定義を、ユーザーのプログラムのコンパイル時に含まれるヘッダー ファイルに配置する必要があります。