Paul Vriens : wintrust: Use the return values of the registration functions .

Alexandre Julliard julliard at wine.codeweavers.com
Wed Sep 13 06:06:59 CDT 2006


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

Author: Paul Vriens <Paul.Vriens at xs4all.nl>
Date:   Tue Sep 12 19:53:53 2006 +0200

wintrust: Use the return values of the registration functions.

---

 dlls/wintrust/register.c |   80 +++++++++++++++++++++++-----------------------
 1 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index 061dfaf..7a55e88 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -797,8 +797,8 @@ HRESULT WINAPI DllRegisterServer(void)
     static const CHAR CatMemberInfoDecode[]            = "WVTAsn1CatMemberInfoDecode";
     static const CHAR SpcSpOpusInfoEncode[]            = "WVTAsn1SpcSpOpusInfoEncode";
     static const CHAR SpcSpOpusInfoDecode[]            = "WVTAsn1SpcSpOpusInfoDecode";
-    HRESULT Res = S_OK;
-    HKEY Key;
+    HRESULT CryptRegisterRes = S_OK;
+    HRESULT TrustProviderRes = S_OK;
 
     TRACE("\n");
 
@@ -822,12 +822,12 @@ #define WINTRUST_REGISTEROID( oid, encod
     do { \
         if (!CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, oid, SP_POLICY_PROVIDER_DLL_NAME, encode_funcname)) \
         {                                                               \
-            Res = HRESULT_FROM_WIN32(GetLastError());                   \
+            CryptRegisterRes = 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());                   \
+            CryptRegisterRes = HRESULT_FROM_WIN32(GetLastError());      \
             goto add_trust_providers;                                   \
         }                                                               \
     } while (0)
@@ -864,44 +864,44 @@ #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 
-     * there is no check whether the actions can be written in the registry.
-     * As the previous list shows, there are several calls after these registrations.
-     * If they fail they will overwrite the returnvalue of DllRegisterServer.
+     * All registry writes are tried. If one fails this part will return S_FALSE
+     * but only if the first (CryptRegisterOIDFunction calls) and the third 
+     * (CryptSIPAddProvider calls) part succeed.
+     *
+     * Last error is set to the last error encountered, regardless if the first
+     * part failed or not.
      */
 
-    /* Check if we can open/create HKLM\Software\Microsoft\Cryptography\Providers\Trust */
-    if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, Trust, 0, NULL, 0, KEY_WRITE, NULL, &Key, NULL) != ERROR_SUCCESS)
-    {
-        /* If the opening/creation of the key fails, there is no need to do the action registrations as they
-         * will fail as well.
-         */
-        Res = S_FALSE;
-    }
-    else
-    {
-        RegCloseKey(Key);
-
-        /* Create the necessary action registry structures */
-        WINTRUST_InitRegStructs();
-
-        /* Register several Trust Provider actions */
-        WINTRUST_RegisterGenVerifyV2();
-        WINTRUST_RegisterPublishedSoftware();
-        WINTRUST_RegisterPublishedSoftwareNoBadUi();
-        WINTRUST_RegisterGenCertVerify();
-        WINTRUST_RegisterTrustProviderTest();
-        WINTRUST_RegisterHttpsProv();
-        WINTRUST_RegisterOfficeSignVerify();
-        WINTRUST_RegisterDriverVerify();
-        WINTRUST_RegisterGenChainVerify();
-
-        /* Free the registry structures */
-        WINTRUST_FreeRegStructs();
-    }
-
-    return Res;
+    /* Create the necessary action registry structures */
+    WINTRUST_InitRegStructs();
+
+    /* Register several Trust Provider actions */
+    if (!WINTRUST_RegisterGenVerifyV2())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterPublishedSoftware())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterPublishedSoftwareNoBadUi())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterGenCertVerify())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterTrustProviderTest())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterHttpsProv())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterOfficeSignVerify())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterDriverVerify())
+        TrustProviderRes = S_FALSE;
+    if (!WINTRUST_RegisterGenChainVerify())
+        TrustProviderRes = S_FALSE;
+
+    /* Free the registry structures */
+    WINTRUST_FreeRegStructs();
+
+    if (CryptRegisterRes == S_OK)
+        return TrustProviderRes;
+
+    return CryptRegisterRes;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list