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


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

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

Типы поставщиков включают PROV_RSA_FULL, PROV_RSA_SCHANNEL и PROV_DSS.

Синтаксис

BOOL CryptEnumProviderTypesA(
  [in]      DWORD dwIndex,
  [in]      DWORD *pdwReserved,
  [in]      DWORD dwFlags,
  [out]     DWORD *pdwProvType,
  [out]     LPSTR szTypeName,
  [in, out] DWORD *pcbTypeName
);

Параметры

[in] dwIndex

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

[in] pdwReserved

Зарезервировано для дальнейшего использования и должно быть NULL.

[in] dwFlags

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

[out] pdwProvType

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

[out] szTypeName

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

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

[in, out] pcbTypeName

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

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

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

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

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

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

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

Замечания

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

Примеры

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

#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       dwIndex;
    DWORD       dwType;
    DWORD       cbName;
    LPTSTR      pszName;

    //--------------------------------------------------------------
    //   Print header lines for provider types.

    printf("Listing Available Provider Types:\n");
    printf("Provider type\tProvider Type Name\n");
    printf("_____________\t_____________________________________\n");

    // Loop through enumerating provider types.
    dwIndex = 0;
    while(CryptEnumProviderTypes(
           dwIndex,
           NULL,
           0,
           &dwType,
           NULL,
           &cbName
           ))
    {

        //-----------------------------------------------------------
        //  cbName returns the length of the name of the next
        //  provider type. 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 type name.

        if (CryptEnumProviderTypes(
               dwIndex++,
               NULL,
               NULL,
               &dwType,   
               pszName,
               &cbName))     
        {
            printf ("     %4.0d\t%s\n",dwType, pszName);
        }
        else
        {
            printf("ERROR - CryptEnumProviderTypes\n");
            exit(1);
        }
        LocalFree(pszName);
    } // End of while loop.
}

Другой пример использования функции CryptEnumProviderTypes см. в примере программы C: перечисление поставщиков CSP и типов поставщиков.

Заметка

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка wincrypt.h
библиотеки Advapi32.lib
DLL Advapi32.dll

См. также

CryptEnumProviders

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