cryptGetDefaultProviderA 函数 (wincrypt.h)

重要 此 API 已弃用。 新的和现有的软件应开始使用 加密下一代 API。 Microsoft 可能会在将来的版本中删除此 API。
 
CryptGetDefaultProvider 函数查找本地计算机或当前用户的指定提供程序类型 (CSP) 的默认加密服务提供程序。 在 pszProvName 缓冲区中返回 dwProvType 参数中指定的提供程序类型的默认 CSP 的名称。

语法

BOOL CryptGetDefaultProviderA(
  [in]      DWORD dwProvType,
  [in]      DWORD *pdwReserved,
  [in]      DWORD dwFlags,
  [out]     LPSTR pszProvName,
  [in, out] DWORD *pcbProvName
);

参数

[in] dwProvType

要为其找到默认 CSP 名称的提供程序类型。

定义的提供程序类型如下所示:

[in] pdwReserved

此参数保留供将来使用,必须为 NULL

[in] dwFlags

定义了以下标志值。

含义
CRYPT_USER_DEFAULT
0x00000002
返回指定类型的用户上下文默认 CSP。
CRYPT_MACHINE_DEFAULT
0x00000001
返回指定类型的计算机默认 CSP。

[out] pszProvName

指向以 null 结尾的字符串缓冲区的指针,用于接收默认 CSP 的名称。

若要查找用于内存分配的缓冲区大小,此参数可以为 NULL。 有关详细信息,请参阅 检索未知长度的数据

[in, out] pcbProvName

指向 DWORD 值的指针,该值指定 pszProvName 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时, DWORD 值包含缓冲区中存储或要存储的字节数。

注意 处理缓冲区中返回的数据时,应用程序必须使用返回的数据的实际大小。 实际大小可以略小于输入时指定的缓冲区的大小。 (输入时,缓冲区大小通常指定得足够大,以确保最大输出数据适合 buffer。) 输出时,此参数指向的变量将更新,以反映复制到缓冲区的数据的实际大小。
 

返回值

如果函数成功,则返回值为非零 (TRUE) 。

如果函数失败,则返回值为零 (FALSE) 。 有关扩展的错误信息,请调用 GetLastError

NTE 开头的错误代码由使用的特定 CSP 生成。 可能的错误代码包括以下内容。

返回代码 说明
ERROR_INVALID_PARAMETER
其中一个参数包含无效的值。 这通常是无效的指针。
ERROR_MORE_DATA
名称的缓冲区不够大。
ERROR_NOT_ENOUGH_MEMORY
操作系统内存不足。
NTE_BAD_FLAGS
dwFlags 参数具有无法识别的值。

注解

此函数确定当前将哪个已安装的 CSP 设置为本地计算机或当前用户的默认 CSP。 此信息通常显示给用户。

示例

以下示例检索PROV_RSA_FULL提供程序类型的默认 CSP 的名称。 有关使用此函数的另一个示例,请参阅 示例 C 程序:枚举 CSP 提供程序和提供程序类型

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

void main()
{

    DWORD       cbProvName=0;
    LPTSTR      pbProvName=NULL;
    // Copyright (C) Microsoft.  All rights reserved.
    // Get the length of the RSA_FULL default provider name.
    if (!(CryptGetDefaultProvider(
         PROV_RSA_FULL, 
         NULL, 
         CRYPT_MACHINE_DEFAULT,
         NULL, 
         &cbProvName))) 
    { 
      printf("Error getting the length of the default "
          "provider name.\n");
      exit(1);
    }

    // Allocate local memory for the name of the default provider.
    if (!(pbProvName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, 
        cbProvName)))
    {
        printf("Error during memory allocation for "
            "provider name.\n");
        exit(1);
    }

    // Get the default provider name.
    if (CryptGetDefaultProvider(
        PROV_RSA_FULL, 
        NULL, 
        CRYPT_MACHINE_DEFAULT,
        pbProvName,
        &cbProvName)) 
    {
        printf("The default provider name is %s\n",pbProvName);
    }
    else
    {
        printf("Getting the name of the provider failed.\n");
        exit(1);
    }

    // Free resources when done.
    LocalFree(pbProvName);

}

注意

wincrypt.h 标头将 CryptGetDefaultProvider 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 wincrypt.h
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

CryptSetProvider

CryptSetProviderEx

服务提供程序函数