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
标识要从中检索上下文函数提供程序的配置表。 这可以是以下值之一。
值 | 含义 |
---|---|
|
从本地计算机配置表检索上下文函数。 |
|
此值不可使用。 |
[in] pszContext
指向以 null 结尾的 Unicode 字符串的指针,该字符串包含要枚举其函数提供程序的上下文的标识符。
[in] dwInterface
标识要检索其函数提供程序的加密接口。 这可以是以下值之一。
值 | 含义 |
---|---|
|
检索非对称加密函数提供程序。 |
|
检索密码函数提供程序。 |
|
检索 哈希 函数提供程序。 |
|
检索随机数生成器函数提供程序。 |
|
检索机密协议函数提供程序。 |
|
检索签名函数提供程序。 |
|
检索密钥存储函数提供程序。 |
|
检索 Schannel 函数提供程序。 |
[in] pszFunction
指向以 null 结尾的 Unicode 字符串的指针,该字符串包含要枚举其提供程序的函数的标识符。
[in, out] pcbBuffer
输入时包含 ppBuffer 指向的缓冲区的大小(以字节为单位)的 ULONG 变量的地址。 如果此大小不足以容纳上下文标识符集,则此函数将失败并 STATUS_BUFFER_TOO_SMALL。
此函数返回后,此值包含复制到 ppBuffer 缓冲区的字节数。
[in, out] ppBuffer
指向 CRYPT_CONTEXT_FUNCTION_PROVIDERS 结构的指针的地址,该结构接收此函数检索到的上下文函数提供程序集。 由号Buffer 参数指向的值包含此缓冲区的大小。
如果此参数指向的值为 NULL,则此函数将分配所需的内存。 当不再需要此内存时,必须通过将此指针传递给 BCryptFreeBuffer 函数来释放此内存。
如果此参数为 NULL,则此函数会将所需大小(以字节为单位)放在由STATUS_BUFFER_TOO_SMALL指向的变量中。
返回值
返回指示函数成功或失败的状态代码。
可能的返回代码包括但不限于以下内容。
返回代码 | 说明 |
---|---|
|
函数成功。 |
|
ppBuffer 参数不是 NULL,并且由印刷板Buffer 参数指向的值不够大,无法容纳上下文集。 |
|
一个或多个参数无效。 |
|
内存分配失败。 |
|
找不到与指定条件匹配的上下文函数提供程序。 |
注解
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 |
标头 | bcrypt.h |
Library | Bcrypt.lib |
DLL | Bcrypt.dll |