//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: cryptfix.cpp // // Contents: Crypto API, version 2. fix for certificate server // // CryptDecodeObject/CryptEncodeObject structures added // after SP3. // // Functions: CryptFixDllMain // // History: 13-Aug-96 kevinr created // //-------------------------------------------------------------------------- #include "pch.cpp" #pragma hdrstop #include "crypttls.h" #include "unicode.h" extern "C" { #include "..\..\pki\certstor\ossx509.h" } #define __dwFILE__ __dwFILE_OCMSETUP_CRYPTFIX_CPP__ //#include // The CRYPTIE_STATIC prefixed variables and functions are defined in // ..\certstor\wincert.obj #define CRYPTIE_STATIC extern CRYPTIE_STATIC HCRYPTOSSGLOBAL hX509OssGlobal; CRYPTIE_STATIC HCRYPTOIDFUNCSET hX509EncodeFuncSet; CRYPTIE_STATIC HCRYPTOIDFUNCSET hX509DecodeFuncSet; #if DBG extern BOOL WINAPI DebugDllMain(HMODULE hInstDLL, DWORD fdwReason, LPVOID lpvReserved); #endif extern BOOL WINAPI UnicodeDllMain(HMODULE hInstDLL, DWORD fdwReason, LPVOID lpvReserved); CRYPTIE_STATIC BOOL WINAPI OssX509KeygenRequestInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_KEYGEN_REQUEST_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509KeygenRequestInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_KEYGEN_REQUEST_INFO pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509IntegerEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN int *pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509IntegerDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT int *pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509ChoiceOfTimeEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN LPFILETIME pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509ChoiceOfTimeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT LPFILETIME pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509SequenceOfAnyEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_SEQUENCE_OF_ANY pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509SequenceOfAnyDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_SEQUENCE_OF_ANY pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509CrlDistPointsEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRL_DIST_POINTS_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509CrlDistPointsDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRL_DIST_POINTS_INFO pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509AuthorityKeyId2Encode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_AUTHORITY_KEY_ID2_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509AuthorityKeyId2Decode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_AUTHORITY_KEY_ID2_INFO pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509OctetStringEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_DATA_BLOB pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509OctetStringDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_DATA_BLOB pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509BitsEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_BIT_BLOB pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509BitsDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_BIT_BLOB pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509AuthorityInfoAccessEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_AUTHORITY_INFO_ACCESS pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509AuthorityInfoAccessDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_AUTHORITY_INFO_ACCESS pInfo, IN OUT DWORD *pcbInfo ); CRYPTIE_STATIC BOOL WINAPI OssX509CtlUsageEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCTL_USAGE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); CRYPTIE_STATIC BOOL WINAPI OssX509CtlUsageDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCTL_USAGE pInfo, IN OUT DWORD *pcbInfo ); //+------------------------------------------------------------------------- // Encode / Decode the "UNICODE" Name Value // // from certstr.cpp //-------------------------------------------------------------------------- extern BOOL WINAPI UnicodeNameValueEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_NAME_VALUE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); extern BOOL WINAPI UnicodeNameValueDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_NAME_VALUE pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI CertDllKeygenRequestInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_KEYGEN_REQUEST_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509KeygenRequestInfoEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllKeygenRequestInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_KEYGEN_REQUEST_INFO pInfo, IN OUT DWORD *pcbInfo ) { return OssX509KeygenRequestInfoDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllIntegerEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN int *pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509IntegerEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllIntegerDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT int *pInfo, IN OUT DWORD *pcbInfo ) { return OssX509IntegerDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllChoiceOfTimeEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN LPFILETIME pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509ChoiceOfTimeEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllChoiceOfTimeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT LPFILETIME pInfo, IN OUT DWORD *pcbInfo ) { return OssX509ChoiceOfTimeDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllSequenceOfAnyEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_SEQUENCE_OF_ANY pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509SequenceOfAnyEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllSequenceOfAnyDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_SEQUENCE_OF_ANY pInfo, IN OUT DWORD *pcbInfo ) { return OssX509SequenceOfAnyDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllCrlDistPointsEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRL_DIST_POINTS_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509CrlDistPointsEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllCrlDistPointsDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRL_DIST_POINTS_INFO pInfo, IN OUT DWORD *pcbInfo ) { return OssX509CrlDistPointsDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllUnicodeNameValueEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_NAME_VALUE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return UnicodeNameValueEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllUnicodeNameValueDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_NAME_VALUE pInfo, IN OUT DWORD *pcbInfo ) { return UnicodeNameValueDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllAuthorityKeyId2Encode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_AUTHORITY_KEY_ID2_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509AuthorityKeyId2Encode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllAuthorityKeyId2Decode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_AUTHORITY_KEY_ID2_INFO pInfo, IN OUT DWORD *pcbInfo ) { return OssX509AuthorityKeyId2Decode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllOctetStringEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_DATA_BLOB pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509OctetStringEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllOctetStringDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_DATA_BLOB pInfo, IN OUT DWORD *pcbInfo ) { return OssX509OctetStringDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllBitsEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCRYPT_BIT_BLOB pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509BitsEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllBitsDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCRYPT_BIT_BLOB pInfo, IN OUT DWORD *pcbInfo ) { return OssX509BitsDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllAuthorityInfoAccessEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCERT_AUTHORITY_INFO_ACCESS pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509AuthorityInfoAccessEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllAuthorityInfoAccessDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCERT_AUTHORITY_INFO_ACCESS pInfo, IN OUT DWORD *pcbInfo ) { return OssX509AuthorityInfoAccessDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } BOOL WINAPI CertDllCtlUsageEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCTL_USAGE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return OssX509CtlUsageEncode( dwCertEncodingType, lpszStructType, pInfo, pbEncoded, pcbEncoded ); } BOOL WINAPI CertDllCtlUsageDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCTL_USAGE pInfo, IN OUT DWORD *pcbInfo ) { return OssX509CtlUsageDecode( dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pInfo, pcbInfo ); } typedef struct _OID_REG_ENTRY { LPCSTR pszOID; LPCSTR pszOverrideFuncName; } OID_REG_ENTRY, *POID_REG_ENTRY; static const OID_REG_ENTRY RegEncodeTable[] = { X509_KEYGEN_REQUEST_TO_BE_SIGNED, "CertDllKeygenRequestInfoEncode", X509_UNICODE_NAME_VALUE, "CertDllUnicodeNameValueEncode", X509_INTEGER, "CertDllIntegerEncode", X509_CHOICE_OF_TIME, "CertDllChoiceOfTimeEncode", X509_SEQUENCE_OF_ANY, "CertDllSequenceOfAnyEncode", X509_CRL_DIST_POINTS, "CertDllCrlDistPointsEncode", X509_AUTHORITY_KEY_ID2, "CertDllAuthorityKeyId2Encode", szOID_CRL_DIST_POINTS, "CertDllCrlDistPointsEncode", szOID_AUTHORITY_KEY_IDENTIFIER2, "CertDllAuthorityKeyId2Encode", X509_OCTET_STRING, "CertDllOctetStringEncode", X509_BITS, "CertDllBitsEncode", X509_AUTHORITY_INFO_ACCESS, "CertDllAuthorityInfoAccessEncode", szOID_AUTHORITY_INFO_ACCESS, "CertDllAuthorityInfoAccessEncode", X509_ENHANCED_KEY_USAGE, "CertDllCtlUsageEncode", szOID_ENHANCED_KEY_USAGE, "CertDllCtlUsageEncode", }; #define REG_ENCODE_COUNT (sizeof(RegEncodeTable) / sizeof(RegEncodeTable[0])) static const OID_REG_ENTRY RegDecodeTable[] = { X509_KEYGEN_REQUEST_TO_BE_SIGNED, "CertDllKeygenRequestInfoDecode", X509_UNICODE_NAME_VALUE, "CertDllUnicodeNameValueDecode", X509_INTEGER, "CertDllIntegerDecode", X509_CHOICE_OF_TIME, "CertDllChoiceOfTimeDecode", X509_SEQUENCE_OF_ANY, "CertDllSequenceOfAnyDecode", X509_CRL_DIST_POINTS, "CertDllCrlDistPointsDecode", X509_AUTHORITY_KEY_ID2, "CertDllAuthorityKeyId2Decode", szOID_CRL_DIST_POINTS, "CertDllCrlDistPointsDecode", szOID_AUTHORITY_KEY_IDENTIFIER2, "CertDllAuthorityKeyId2Decode", X509_OCTET_STRING, "CertDllOctetStringDecode", X509_BITS, "CertDllBitsDecode", X509_AUTHORITY_INFO_ACCESS, "CertDllAuthorityInfoAccessDecode", szOID_AUTHORITY_INFO_ACCESS, "CertDllAuthorityInfoAccessDecode", X509_ENHANCED_KEY_USAGE, "CertDllCtlUsageDecode", szOID_ENHANCED_KEY_USAGE, "CertDllCtlUsageDecode", }; #define REG_DECODE_COUNT (sizeof(RegDecodeTable) / sizeof(RegDecodeTable[0])) static const CRYPT_OID_FUNC_ENTRY X509EncodeFuncTable[] = { X509_KEYGEN_REQUEST_TO_BE_SIGNED, CertDllKeygenRequestInfoEncode, X509_UNICODE_NAME_VALUE, CertDllUnicodeNameValueEncode, X509_INTEGER, CertDllIntegerEncode, X509_CHOICE_OF_TIME, CertDllChoiceOfTimeEncode, X509_SEQUENCE_OF_ANY, CertDllSequenceOfAnyEncode, X509_CRL_DIST_POINTS, CertDllCrlDistPointsEncode, X509_AUTHORITY_KEY_ID2, CertDllAuthorityKeyId2Encode, szOID_CRL_DIST_POINTS, CertDllCrlDistPointsEncode, szOID_AUTHORITY_KEY_IDENTIFIER2, CertDllAuthorityKeyId2Encode, X509_OCTET_STRING, CertDllOctetStringEncode, X509_BITS, CertDllBitsEncode, X509_AUTHORITY_INFO_ACCESS, CertDllAuthorityInfoAccessEncode, szOID_AUTHORITY_INFO_ACCESS, CertDllAuthorityInfoAccessEncode, X509_ENHANCED_KEY_USAGE, CertDllCtlUsageEncode, szOID_ENHANCED_KEY_USAGE, CertDllCtlUsageEncode, }; #define X509_ENCODE_FUNC_COUNT (sizeof(X509EncodeFuncTable) / \ sizeof(X509EncodeFuncTable[0])) static const CRYPT_OID_FUNC_ENTRY X509DecodeFuncTable[] = { X509_KEYGEN_REQUEST_TO_BE_SIGNED, CertDllKeygenRequestInfoDecode, X509_UNICODE_NAME_VALUE, CertDllUnicodeNameValueDecode, X509_INTEGER, CertDllIntegerDecode, X509_CHOICE_OF_TIME, CertDllChoiceOfTimeDecode, X509_SEQUENCE_OF_ANY, CertDllSequenceOfAnyDecode, X509_CRL_DIST_POINTS, CertDllCrlDistPointsDecode, X509_AUTHORITY_KEY_ID2, CertDllAuthorityKeyId2Decode, szOID_CRL_DIST_POINTS, CertDllCrlDistPointsDecode, szOID_AUTHORITY_KEY_IDENTIFIER2, CertDllAuthorityKeyId2Decode, X509_OCTET_STRING, CertDllOctetStringDecode, X509_BITS, CertDllBitsDecode, X509_AUTHORITY_INFO_ACCESS, CertDllAuthorityInfoAccessDecode, szOID_AUTHORITY_INFO_ACCESS, CertDllAuthorityInfoAccessDecode, X509_ENHANCED_KEY_USAGE, CertDllCtlUsageDecode, szOID_ENHANCED_KEY_USAGE, CertDllCtlUsageDecode, }; #define X509_DECODE_FUNC_COUNT (sizeof(X509DecodeFuncTable) / \ sizeof(X509DecodeFuncTable[0])) //+------------------------------------------------------------------------- // Dll initialization //-------------------------------------------------------------------------- BOOL WINAPI CryptFixDllMain(HMODULE hInst, ULONG ulReason, LPVOID lpReserved) { BOOL fRet; # if DBG #if 0 // // Due to an apparent bug in the Win95 loader, the CRT gets unloaded // too early in some circumstances. In particular, it can get unloaded // before this routine executes at process detach time. This can cause // faults when executing this routine, and also when executing the rest // of CRYPT32:CRT_INIT, after this initroutine returns. Ergo, we do an // extra load of the CRT, to be sure it stays around long enough. // if ((ulReason == DLL_PROCESS_ATTACH) && (!(FIsWinNT()))) { LoadLibrary( L"MSVCRTD.DLL"); } #endif DebugDllMain(hInst, ulReason, lpReserved); # endif // DBG UnicodeDllMain(hInst, ulReason, lpReserved); switch (ulReason) { case DLL_PROCESS_ATTACH: if (0 == (hX509OssGlobal = I_CryptInstallOssGlobal(ossx509, 0, NULL))) { //goto CryptInstallOssGlobalError; goto ErrorReturn; } if (NULL == (hX509EncodeFuncSet = CryptInitOIDFunctionSet( CRYPT_OID_ENCODE_OBJECT_FUNC, 0))) { //goto CryptInitOIDFunctionSetError; goto ErrorReturn; } if (NULL == (hX509DecodeFuncSet = CryptInitOIDFunctionSet( CRYPT_OID_DECODE_OBJECT_FUNC, 0))) { //goto CryptInitOIDFunctionSetError; goto ErrorReturn; } if (!(CryptInstallOIDFunctionAddress( hInst, X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, X509_ENCODE_FUNC_COUNT, X509EncodeFuncTable, 0))) { //goto CryptInstallOIDFunctionAddressError; goto ErrorReturn; } if (!(CryptInstallOIDFunctionAddress( hInst, X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, X509_DECODE_FUNC_COUNT, X509DecodeFuncTable, 0))) { //goto CryptInstallOIDFunctionAddressError; goto ErrorReturn; } break; case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: default: break; } fRet = TRUE; CommonReturn: return fRet; ErrorReturn: fRet = FALSE; goto CommonReturn; //TRACE_ERROR(CryptInstallOssGlobalError) //TRACE_ERROR(CryptInitOIDFunctionSetError) //TRACE_ERROR(CryptInstallOIDFunctionAddressError) }