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


Функция BCryptEnumContextFunctionProviders (bcrypt.h)

Функция BCryptEnumContextFunctionProviders получает поставщики для криптографических функций для контекста в указанной таблице конфигурации.

Синтаксис

NTSTATUS BCryptEnumContextFunctionProviders(
  [in]      ULONG                             dwTable,
  [in]      LPCWSTR                           pszContext,
  [in]      ULONG                             dwInterface,
  [in]      LPCWSTR                           pszFunction,
  [in, out] ULONG                             *pcbBuffer,
  [in, out] PCRYPT_CONTEXT_FUNCTION_PROVIDERS *ppBuffer
);

Параметры

[in] dwTable

Определяет таблицу конфигурации, из которой извлекаются поставщики контекстных функций. Это может быть одно из следующих значений.

Значение Значение
CRYPT_LOCAL
Получите функции контекста из таблицы конфигурации локального компьютера.
CRYPT_DOMAIN
Это значение недоступно для использования.

[in] pszContext

Указатель на строку Юникода, завершающуюся null, которая содержит идентификатор контекста для перечисления поставщиков функций.

[in] dwInterface

Определяет криптографический интерфейс для получения поставщиков функций. Это может быть одно из следующих значений.

Значение Значение
BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE
Получение поставщиков функций асимметричного шифрования.
BCRYPT_CIPHER_INTERFACE
Получение поставщиков функций шифра.
BCRYPT_HASH_INTERFACE
Получение поставщиков хэш-функций .
BCRYPT_RNG_INTERFACE
Получение поставщиков функций генератора случайных чисел.
BCRYPT_SECRET_AGREEMENT_INTERFACE
Получение поставщиков функций секретного соглашения.
BCRYPT_SIGNATURE_INTERFACE
Получение поставщиков функций подписи.
NCRYPT_KEY_STORAGE_INTERFACE
Получение поставщиков функций хранилища ключей.
NCRYPT_SCHANNEL_INTERFACE
Получение поставщиков функций Schannel.

[in] pszFunction

Указатель на строку Юникода, завершающуюся значением NULL, которая содержит идентификатор функции для перечисления поставщиков.

[in, out] pcbBuffer

Адрес переменной ULONG , которая в записи содержит размер (в байтах) буфера, на который указывает ppBuffer. Если этот размер недостаточно велик для хранения набора идентификаторов контекста, эта функция завершится сбоем с STATUS_BUFFER_TOO_SMALL.

После возврата этой функции это значение содержит количество байтов, скопированных в буфер ppBuffer .

[in, out] ppBuffer

Адрес указателя на структуру CRYPT_CONTEXT_FUNCTION_PROVIDERS , которая получает набор поставщиков контекстных функций, полученных этой функцией. Значение, на которое указывает параметр pcbBuffer , содержит размер этого буфера.

Если значение, указываемое этим параметром, равно NULL, эта функция выделяет необходимую память. Эта память должна быть освобождена, если она больше не нужна, передав этот указатель на функцию BCryptFreeBuffer .

Если этот параметр имеет значение NULL, эта функция поместит необходимый размер в байтах в переменную, на которую указывает параметр pcbBuffer , и вернет STATUS_BUFFER_TOO_SMALL.

Возвращаемое значение

Возвращает код состояния, указывающий на успешное или неудачное выполнение функции.

Возможные коды возврата включают, помимо прочего, следующие.

Код возврата Описание
STATUS_SUCCESS
Функция выполнена успешно.
STATUS_BUFFER_TOO_SMALL
Параметр ppBuffer не имеет значения NULL, а значение, указываемое параметром pcbBuffer , недостаточно велико для хранения набора контекстов.
STATUS_INVALID_PARAMETER
Один или несколько параметров недопустимы.
STATUS_NO_MEMORY
Произошел сбой выделения памяти.
STATUS_NOT_FOUND
Поставщики контекстных функций, соответствующие указанным критериям, не найдены.

Комментарии

BCryptEnumContextFunctionProviders можно вызывать только в пользовательском режиме.

Примеры

В следующем примере показано, как использовать функцию BCryptEnumContextFunctionProviders для перечисления поставщиков для всех функций хранения ключей для всех контекстов в таблице конфигурации локального компьютера.

#include <windows.h>
#include <stdio.h>
#include <ntstatus.h>
#include <Bcrypt.h>
#pragma comment(lib, "Bcrypt.lib")

#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#endif

NTSTATUS EnumContextFunctionProviders()
{
    NTSTATUS status;
    ULONG uSize = 0;
    ULONG uTable = CRYPT_LOCAL;
    PCRYPT_CONTEXTS pContexts = NULL;
    
    // Get the contexts for the local machine. 
    // CNG will allocate the memory for us.
    status = BCryptEnumContexts(uTable, &uSize, &pContexts);
    if(NT_SUCCESS(status))
    {
        // Enumerate the context identifiers.
        for(ULONG a = 0; 
            a < pContexts->cContexts; 
            a++)
        {
            ULONG uInterface = NCRYPT_SCHANNEL_INTERFACE;

            wprintf(L"Context functions for %s:\n", 
                pContexts->rgpszContexts[a]);

            // Get the functions for this context.
            // CNG will allocate the memory for us.
            PCRYPT_CONTEXT_FUNCTIONS pContextFunctions = NULL;
            status = BCryptEnumContextFunctions(
                uTable, 
                pContexts->rgpszContexts[a], 
                uInterface, 
                &uSize, 
                &pContextFunctions);
            if(NT_SUCCESS(status))
            {
                // Enumerate the functions.
                for(ULONG b = 0; 
                    b < pContextFunctions->cFunctions; 
                    b++)
                {
                    wprintf(L"\tFunction providers for %s:\n", 
                        pContextFunctions->rgpszFunctions[b]);

                    // Get the providers for this function.
                    PCRYPT_CONTEXT_FUNCTION_PROVIDERS pProviders;
                    pProviders = NULL;
                    status = BCryptEnumContextFunctionProviders(
                        uTable, 
                        pContexts->rgpszContexts[a], 
                        uInterface, 
                        pContextFunctions->rgpszFunctions[b],
                        &uSize, 
                        &pProviders);
                    if(NT_SUCCESS(status))
                    {
                        for(ULONG c = 0; 
                            c < pProviders->cProviders; 
                            c++)
                        {
                            wprintf(L"\t\t%s\n", 
                                pProviders->rgpszProviders[c]);
                        }
                    }
                    else if(STATUS_NOT_FOUND == status)
                    {
                        wprintf(L"\t\tNone found.\n");
                    }
                }

                // Free the context functions buffer.
                BCryptFreeBuffer(pContextFunctions);
            }
        }

        // Free the contexts buffer.
        BCryptFreeBuffer(pContexts);
    }

    return status;
}

Требования

Требование Значение
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header bcrypt.h
Библиотека Bcrypt.lib
DLL Bcrypt.dll

См. также раздел

BCryptFreeBuffer

CRYPT_CONTEXT_FUNCTION_PROVIDERS