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


Функция CryptEnumProvidersA (wincrypt.h)

Важно Этот API не рекомендуется использовать. Новое и существующее программное обеспечение должно начать использовать API-интерфейсы шифрования следующего поколения. Корпорация Майкрософт может удалить этот API в будущих выпусках.
 
Функция CryptEnumProviders извлекает первых или следующих доступных поставщиков служб шифрования (CSP). Эта функция, используемая в цикле, может последовательно извлекать все CSP, доступные на компьютере.

Возможные поставщики служб шифрования: Microsoft Base Cryptographic Provider версии 1.0 и Microsoft Enhanced Cryptographic Provider версии 1.0.

Синтаксис

BOOL CryptEnumProvidersA(
  [in]      DWORD dwIndex,
  [in]      DWORD *pdwReserved,
  [in]      DWORD dwFlags,
  [out]     DWORD *pdwProvType,
  [out]     LPSTR szProvName,
  [in, out] DWORD *pcbProvName
);

Параметры

[in] dwIndex

Индекс следующего поставщика для перечисления.

[in] pdwReserved

Зарезервировано для использования в будущем и должно иметь значение NULL.

[in] dwFlags

Зарезервировано для будущего использования и должно быть равно нулю.

[out] pdwProvType

Адрес значения DWORD , обозначающего тип перечисленного поставщика.

[out] szProvName

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

Этот параметр может иметь значение NULL , чтобы задать размер имени для целей выделения памяти. Дополнительные сведения см. в разделе Извлечение данных неизвестной длины.

[in, out] pcbProvName

Указатель на значение DWORD , указывающее размер (в байтах) буфера, на который указывает параметр pszProvName . Когда функция возвращает значение DWORD , содержит количество байтов, хранящихся в буфере.

Примечание При обработке данных, возвращаемых в буфере, приложения должны использовать фактический размер возвращаемых данных. Фактический размер может быть немного меньше размера буфера, указанного во входных данных. (На входных данных размеры буфера обычно указываются достаточно большими, чтобы убедиться, что максимально возможные выходные данные помещаются в буфер.) В выходных данных переменная, на которую указывает этот параметр, обновляется с учетом фактического размера данных, скопированных в буфер.
 

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

Если функция выполнена успешно, возвращается ненулевое значение (TRUE).

Если функция завершается сбоем, возвращаемое значение равно нулю (FALSE). Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError.

Коды ошибок, предваряемые NTE, создаются конкретным поставщиком служб CSP. Ниже приведены некоторые возможные коды ошибок.

Код возврата Описание
ERROR_MORE_DATA
Буфер pszProvName не был достаточно велик для хранения имени поставщика.
ERROR_NO_MORE_ITEMS
Больше нет элементов для перечисления.
ERROR_NOT_ENOUGH_MEMORY
В операционной системе не хватает памяти.
NTE_BAD_FLAGS
Параметр dwFlags имеет нераспознанное значение.
NTE_FAIL
Что-то не так с регистрацией типа.

Комментарии

Эта функция перечисляет поставщики, доступные на компьютере. Типы поставщиков можно перечислить с помощью CryptEnumProviderTypes.

Примеры

В следующем примере показан цикл со списком всех доступных поставщиков служб шифрования. Другой пример, в котором используется функция CryptEnumProviders , см. в разделе Пример программы C: перечисление поставщиков и типов поставщиков CSP.

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#pragma comment(lib, "advapi32.lib")

void main()
{

    //---------------------------------------------------------------
    // Copyright (C) Microsoft.  All rights reserved.
    // Declare and initialize variables.

    DWORD       cbName;
    DWORD       dwType;
    DWORD       dwIndex;
    CHAR        *pszName = NULL; 

    // Print header lines for providers.
    printf("Listing Available Providers:\n");
    printf("Provider type\tProvider Name\n");
    printf("_____________\t__________________"
        "___________________\n");   

    //--------------------------------------------------------------- 
    // Loop through enumerating providers.
    dwIndex = 0;
    while(CryptEnumProviders(
           dwIndex,
           NULL,
           0,
           &dwType,
           NULL,
           &cbName
           ))
    {

        //-----------------------------------------------------------
        //  cbName returns the length of the name of the next 
        //  provider. Allocate memory in a buffer to retrieve 
        //  that name.

        if (!(pszName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cbName)))
        {
           printf("ERROR - LocalAlloc failed\n");
           exit(1);
        }
        //-----------------------------------------------------------
        //  Get the provider name.
        if (CryptEnumProviders(
               dwIndex++,
               NULL,
               0,
               &dwType,
               pszName,
               &cbName
               ))
        {
            printf ("     %4.0d\t%s\n",dwType, pszName);
        }
        else
        {
            printf("ERROR - CryptEnumProviders failed.\n");
            exit(1);
        }
        LocalFree(pszName);

    } // End of while loop

    printf("\nProvider types and provider names "
        "have been listed.\n");
}

Примечание

Заголовок wincrypt.h определяет CryptEnumProviders в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Сочетание использования псевдонима, не зависящий от кодировки, с кодом, не зависящим от кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

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

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

CryptEnumProviderTypes

Функции поставщика услуг