Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
API CNG предоставляет функции для перечисления и получения сведений о зарегистрированных поставщиках.
Перечисление поставщиков
Вы используете функцию BCryptEnumRegisteredProviders, чтобы перечислить зарегистрированных поставщиков. Функцию BCryptEnumRegisteredProviders можно вызвать одним из двух способов:
Первое, что нужно сделать, это чтобы функция BCryptEnumRegisteredProviders выделила память. Это достигается путем передачи адреса указателя NULL для параметра ppBuffer. Этот код выделяет память, необходимую для структуры CRYPT_PROVIDERS и связанных строк. Если функция BCryptEnumRegisteredProviders используется таким образом, необходимо освободить память, если она больше не требуется, передав ppBuffer в функцию BCryptFreeBuffer.
В следующем примере показано, как использовать функцию BCryptEnumRegisteredProviders для выделения буфера.
#include <windows.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders1() { NTSTATUS status; ULONG cbBuffer = 0; PCRYPT_PROVIDERS pBuffer = NULL; /* Get the providers, letting the BCryptEnumRegisteredProviders function allocate the memory. */ status = BCryptEnumRegisteredProviders(&cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { if (pBuffer != NULL) { // Enumerate the providers. for (ULONG i = 0; i < pBuffer->cProviders; i++) { printf("%S\n", pBuffer->rgpszProviders[i]); } } } else { printf("BCryptEnumRegisteredProviders failed with error " "code 0x%08x\n", status); } if (NULL != pBuffer) { /* Free the memory allocated by the BCryptEnumRegisteredProviders function. */ BCryptFreeBuffer(pBuffer); } }Второй способ — выделить необходимую память самостоятельно. Это достигается путем вызова функции BCryptEnumRegisteredProviders с NULL для параметра ppBuffer. Функция BCryptEnumRegisteredProviders разместит в значении, на которое указывает параметр pcbBuffer, требуемый размер в байтах структуры CRYPT_PROVIDERS и всех строк. Затем вы выделяете необходимую память и передаете адрес этого указателя буфера для параметра ppBuffer во втором вызове функции BCryptEnumRegisteredProviders.
В следующем примере показано, как использовать функцию BCryptEnumRegisteredProviders для выделения и использования собственного буфера.
#include <windows.h> #include <stdio.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders2() { NTSTATUS status; ULONG cbBuffer = 0; // Get the required size of the buffer. status = BCryptEnumRegisteredProviders(&cbBuffer, NULL); if (STATUS_BUFFER_TOO_SMALL == status) { // Allocate the buffer. PCRYPT_PROVIDERS pBuffer = (PCRYPT_PROVIDERS)LocalAlloc(LPTR, cbBuffer); if (NULL != pBuffer) { // Get the providers in the buffer that was allocated. status = BCryptEnumRegisteredProviders( &cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { for (ULONG i = 0; i < pBuffer->cProviders; i++) { // Enumerate the providers. printf("%S\n", pBuffer->rgpszProviders[i]); } } // Free the memory that was allocated. LocalFree(pBuffer); } } }
Получение сведений о регистрации поставщика
Функция BCryptQueryProviderRegistration используется для получения дополнительных сведений о поставщике с учетом регистрации. Эта функция принимает имя поставщика, для которого требуется получить сведения, требуемый режим поставщика (режим ядра, пользовательский режим или оба) и идентификатор интерфейса поставщика для получения сведений о регистрации. Например, чтобы получить сведения о регистрации в пользовательском режиме для интерфейса шифра для поставщика Microsoft Primitive Provider, необходимо вызвать следующий вызов.
BCryptQueryProviderRegistration(
MS_PRIMITIVE_PROVIDER,
CRYPT_UM,
BCRYPT_CIPHER_INTERFACE,
//...
);
Как и функция BCryptEnumRegisteredProviders, функция BCryptQueryProviderRegistration может либо выделить память для вас, либо вы можете выделить память самостоятельно. Процесс одинаков для обеих функций.