Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
CNG-API:et tillhandahåller funktioner för att räkna upp och hämta information om registrerade leverantörer.
Uppräkning av leverantörer
Du använder funktionen BCryptEnumRegisteredProviders för att räkna upp de registrerade leverantörerna. Funktionen BCryptEnumRegisteredProviders kan anropas på något av två sätt:
Den första är att få funktionen BCryptEnumRegisteredProviders att allokera minnet. Detta uppnås genom att skicka adressen till en NULL- pekare för parametern ppBuffer. Den här koden allokerar det minne som krävs för CRYPT_PROVIDERS struktur och tillhörande strängar. När funktionen BCryptEnumRegisteredProviders används på det här sättet måste du frigöra minnet när det inte längre behövs genom att skicka ppBuffer- till funktionen BCryptFreeBuffer.
I följande exempel visas hur du använder funktionen BCryptEnumRegisteredProviders för att allokera bufferten åt dig.
#include <windows.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders1() { NTSTATUS status; ULONG cbBuffer = 0; PCRYPT_PROVIDERS pBuffer = NULL; /* Get the providers, letting the BCryptEnumRegisteredProviders function allocate the memory. */ status = BCryptEnumRegisteredProviders(&cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { if (pBuffer != NULL) { // Enumerate the providers. for (ULONG i = 0; i < pBuffer->cProviders; i++) { printf("%S\n", pBuffer->rgpszProviders[i]); } } } else { printf("BCryptEnumRegisteredProviders failed with error " "code 0x%08x\n", status); } if (NULL != pBuffer) { /* Free the memory allocated by the BCryptEnumRegisteredProviders function. */ BCryptFreeBuffer(pBuffer); } }
Den andra metoden är att allokera det minne som krävs själv. Detta uppnås genom att anropa funktionen BCryptEnumRegisteredProviders med NULL- för parametern ppBuffer. Funktionen BCryptEnumRegisteredProviders anger i det värde som pekas ut av parametern pcbBuffer den nödvändiga storleken, i byte, för CRYPT_PROVIDERS-strukturen och alla strängar. Sedan allokerar du det minne som krävs och skickar adressen till den här buffertpekaren för parametern ppBuffer i ett andra anrop till funktionen BCryptEnumRegisteredProviders.
I följande exempel visas hur du använder funktionen BCryptEnumRegisteredProviders för att allokera och använda din egen buffert.
#include <windows.h> #include <stdio.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders2() { NTSTATUS status; ULONG cbBuffer = 0; // Get the required size of the buffer. status = BCryptEnumRegisteredProviders(&cbBuffer, NULL); if (STATUS_BUFFER_TOO_SMALL == status) { // Allocate the buffer. PCRYPT_PROVIDERS pBuffer = (PCRYPT_PROVIDERS)LocalAlloc(LPTR, cbBuffer); if (NULL != pBuffer) { // Get the providers in the buffer that was allocated. status = BCryptEnumRegisteredProviders( &cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { for (ULONG i = 0; i < pBuffer->cProviders; i++) { // Enumerate the providers. printf("%S\n", pBuffer->rgpszProviders[i]); } } // Free the memory that was allocated. LocalFree(pBuffer); } } }
Hämta registreringsinformation för leverantör
Funktionen BCryptQueryProviderRegistration används för att hämta ytterligare, registreringsspecifik information om en provider. Den här funktionen tar namnet på providern som du vill hämta information för, önskat providerläge (kernelläge, användarläge eller båda) och identifieraren för providergränssnittet för att hämta registreringsinformationen för. Om du till exempel vill hämta registreringsinformationen för användarläge för chiffergränssnittet för providern "Microsoft Primitive Provider" gör du ett anrop som liknar följande.
BCryptQueryProviderRegistration(
MS_PRIMITIVE_PROVIDER,
CRYPT_UM,
BCRYPT_CIPHER_INTERFACE,
//...
);
Precis som funktionen BCryptEnumRegisteredProviders kan funktionen BCryptQueryProviderRegistration antingen allokera minne åt dig eller allokera minnet själv. Processen är densamma för de två funktionerna.