Paul Vriens : wintrust: Use the return value of CryptRegisterOIDFunction.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Sep 11 06:05:07 CDT 2006


Module: wine
Branch: master
Commit: f9141fddbe3e8a44c22006e6e0160af4d36813ad
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=f9141fddbe3e8a44c22006e6e0160af4d36813ad

Author: Paul Vriens <Paul.Vriens at xs4all.nl>
Date:   Mon Sep 11 11:23:20 2006 +0200

wintrust: Use the return value of CryptRegisterOIDFunction.

---

 dlls/wintrust/register.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index c9baea5..955aad9 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -740,9 +740,25 @@ HRESULT WINAPI DllRegisterServer(void)
      * - One call to CryptSIPRemoveProvider (do we need that?)
      */
 
+    /* Testing on native shows that when an error is encountered in one of the CryptRegisterOIDFunction calls
+     * the rest of these calls is skipped. Registering is however continued for the trust providers.
+     *
+     * We are not totally in line with native as there all decoding functions are registered after all encoding
+     * functions.
+     */
 #define WINTRUST_REGISTEROID( oid, encode_funcname, decode_funcname ) \
-    CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, oid, SP_POLICY_PROVIDER_DLL_NAME, encode_funcname); \
-    CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, oid, SP_POLICY_PROVIDER_DLL_NAME, decode_funcname)
+    do { \
+        if (!CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, oid, SP_POLICY_PROVIDER_DLL_NAME, encode_funcname)) \
+        {                                                               \
+            Res = HRESULT_FROM_WIN32(GetLastError());                   \
+            goto add_trust_providers;                                   \
+        }                                                               \
+        if (!CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, oid, SP_POLICY_PROVIDER_DLL_NAME, decode_funcname)) \
+        {                                                               \
+            Res = HRESULT_FROM_WIN32(GetLastError());                   \
+            goto add_trust_providers;                                   \
+        }                                                               \
+    } while (0)
 
     WINTRUST_REGISTEROID(SPC_PE_IMAGE_DATA_OBJID, WVTAsn1SpcPeImageDataEncode, WVTAsn1SpcPeImageDataDecode);
     WINTRUST_REGISTEROID(SPC_PE_IMAGE_DATA_STRUCT, WVTAsn1SpcPeImageDataEncode, WVTAsn1SpcPeImageDataDecode);
@@ -773,6 +789,8 @@ #define WINTRUST_REGISTEROID( oid, encod
 
 #undef WINTRUST_REGISTEROID
 
+add_trust_providers:
+
     /* Testing on W2K3 shows:
      * If we cannot open HKLM\Software\Microsoft\Cryptography\Providers\Trust
      * for writing, DllRegisterServer returns S_FALSE. If the key can be opened 




More information about the wine-cvs mailing list