BCryptEnumContexts 函数 (bcrypt.h)

[BCryptEnumContexts 可用于“要求”部分中指定的操作系统。 在后续版本中,它可能已更改或不可用。]

BCryptEnumContexts 函数获取指定配置表中上下文的标识符。

语法

NTSTATUS BCryptEnumContexts(
  [in]      ULONG           dwTable,
  [in, out] ULONG           *pcbBuffer,
  [in, out] PCRYPT_CONTEXTS *ppBuffer
);

参数

[in] dwTable

标识要从中检索上下文的配置表。 这可以是以下值之一。

含义
CRYPT_LOCAL
从本地计算机配置表检索上下文。
CRYPT_DOMAIN
此值不可使用。

[in, out] pcbBuffer

输入时包含 ppBuffer 指向的缓冲区的大小(以字节为单位)的 ULONG 变量的地址。 如果此大小不足以容纳上下文标识符集,则此函数将失败并 STATUS_BUFFER_TOO_SMALL

此函数返回后,此值包含复制到 ppBuffer 缓冲区的字节数。

[in, out] ppBuffer

指向 CRYPT_CONTEXTS 结构的指针的地址,该结构接收此函数检索到的上下文集。 由号Buffer 参数指向的值包含此缓冲区的大小。

如果此参数指向的值为 NULL,则此函数将分配所需的内存。 当不再需要此内存时,必须通过将此指针传递给 BCryptFreeBuffer 函数来释放此内存。

如果此参数为 NULL,则此函数会将所需大小(以字节为单位)放在由STATUS_BUFFER_TOO_SMALL指向的变量中。

返回值

返回指示函数成功或失败的状态代码。

可能的返回代码包括但不限于以下内容。

返回代码 说明
STATUS_SUCCESS
函数成功。
STATUS_INVALID_PARAMETER
一个或多个参数无效。
STATUS_NO_MEMORY
内存分配失败。
STATUS_BUFFER_TOO_SMALL
ppBuffer 参数不是 NULL并且由印刷板Buffer 参数指向的值不够大,无法容纳上下文集。

注解

只能在用户模式下调用 BCryptEnumContexts

示例

以下示例演示如何使用 BCryptEnumContexts 函数为 ppBuffer 缓冲区分配内存。

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

NTSTATUS EnumContexts_SystemAlloc()
{
    NTSTATUS status;
    ULONG uSize = 0;
    PCRYPT_CONTEXTS pContexts = NULL;
    
    // Get the contexts for the local computer. 
    // CNG allocates the memory.
    status = BCryptEnumContexts(CRYPT_LOCAL, &uSize, &pContexts);
    if(NT_SUCCESS(status))
    {
        // Enumerate the context identifiers.
        for(ULONG i = 0; i < pContexts->cContexts; i++)
        {
            wprintf(pContexts->rgpszContexts[i]);
            wprintf(L"\n");
        }

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

    return status;
}

以下示例演示如何使用 BCryptEnumContexts 函数为 ppBuffer 缓冲区分配自己的内存。

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

NTSTATUS EnumContexts_SelfAlloc()
{
    NTSTATUS status;
    ULONG uSize = 0;
    
    // Get the required size of the buffer.
    status = BCryptEnumContexts(CRYPT_LOCAL, &uSize, NULL);
    if(STATUS_BUFFER_TOO_SMALL == status)
    {
        // Allocate the buffer.
        PCRYPT_CONTEXTS pContexts = (PCRYPT_CONTEXTS)HeapAlloc(
            GetProcessHeap(), 
            HEAP_ZERO_MEMORY, 
            uSize);
        if(pContexts)
        {
            // Get the contexts for the local machine.
            status = BCryptEnumContexts(
                CRYPT_LOCAL, 
                &uSize, 
                &pContexts);
            if(NT_SUCCESS((status))
            {
                // Enumerate the context identifiers.
                for(ULONG i = 0; i < pContexts->cContexts; i++)
                {
                    wprintf(pContexts->rgpszContexts[i]);
                    wprintf(L"\n");
                }
            }

            // Free the buffer.
            HeapFree(GetProcessHeap(), 0, pContexts);
            pContexts = NULL;
        }
        else
        {
            status = STATUS_NO_MEMORY;
        }
    }

    return status;
}

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 bcrypt.h
Library Bcrypt.lib
DLL Bcrypt.dll

另请参阅

BCryptFreeBuffer

CRYPT_CONTEXTS