Installieren der neuen Funktionalität

Die Installation neuer Funktionen in den Arbeitsspeicher kann die Leistung verbessern. CryptoAPI-Funktionen suchen arbeitsspeicher für die Funktionalität, bevor Sie die Registrierung für die DLL durchsuchen. Die DLL muss geladen werden, bevor Sie die Funktionalität installieren.

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

Wenn hModule an CryptInstallOIDFunctionAddress übergeben wird, sobald die DLL installiert wurde, wird die DLL erst deaktiviert, wenn die Crypt32.dll nicht geladen wird.

Im folgenden Beispiel wird die Funktion "CryptInstallOIDFunctionAddress " aufgerufen.

#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.
}