Installieren der neuen Funktionalität

Die Installation neuer Funktionen im Arbeitsspeicher kann die Leistung verbessern. CryptoAPI-Funktionen suchen den Arbeitsspeicher nach der Funktionalität, bevor sie in der Registrierung nach der DLL suchen. Die DLL muss geladen werden, bevor die Funktionalität installiert wird.

CryptInstallOIDFunctionAddress installiert die Adresse der neuen Funktionalität. Sie sollte in der DllMain-Funktion der DLL platziert werden.

Wenn hModule an CryptInstallOIDFunctionAddressübergeben wird, wird die DLL nach der Installation erst entladen, nachdem die Crypt32.dll entladen wurde.

Im folgenden Beispiel wird die CryptInstallOIDFunctionAddress-Funktion aufruft.

#include <windows.h>
#include <stdio.h>

#define X509_ENCODE_FUNC_COUNT (sizeof(X509EncodeFuncTable) / \
                                sizeof(X509EncodeFuncTable[0]))

static BOOL WINAPI OssX509CtlUsageEncode(
        IN DWORD dwCertEncodingType,
        IN LPCSTR lpszStructType,
        IN PCTL_USAGE pInfo,
        OUT BYTE *pbEncoded,
        IN OUT DWORD *pcbEncoded
);

static const CRYPT_OID_FUNC_ENTRY X509EncodeFuncTable[] = {
    X509_ENHANCED_KEY_USAGE, OssX509CtlUsageEncode,
};

BOOL WINAPI DllMain(
    HMODULE hModule,
    ULONG  ulReason,
    LPVOID lpReserved)
{
    switch (ulReason)
    {
        case DLL_PROCESS_ATTACH:
            if (!CryptInstallOIDFunctionAddress(
                  hModule,
                  X509_ASN_ENCODING,
                  CRYPT_OID_ENCODE_OBJECT_FUNC,
                  X509_ENCODE_FUNC_COUNT,
                  X509EncodeFuncTable,
                  0))
            {
                printf("Install OID function address failed."); 
                return FALSE;
            }
            break;
         default:
            break;
    }
    return TRUE;
}

//-------------------------------------------------------------------
//  CTL Usage (Enhanced Key Usage) Encode (OSS X509)
//-------------------------------------------------------------------
static BOOL WINAPI OssX509CtlUsageEncode(
        IN DWORD /*dwCertEncodingType*/,
        IN LPCSTR /*lpszStructType*/,
        IN PCTL_USAGE pInfo,
        OUT BYTE *pbEncoded,
        IN OUT DWORD *pcbEncoded)
{
    //Encoding logic goes here.
}