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


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

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