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