Поделиться через


Создание новых функций

Следующие функции являются одними из функций 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, расширение функциональности CryptEncodeObject или CryptDecodeObject требует определения типа для новой структуры данных C, которая должна быть помещена в заголовочный файл, включаемый при компиляции программы пользователя.