[wintrust 3/3] Use the return values of the registration functions

Paul Vriens Paul.Vriens at xs4all.nl
Tue Sep 12 12:53:53 CDT 2006


Hi,

the registration can be divided in 3 parts. The return value of the first part
takes precendence over the return value of the second part. (third part will
follow in a new patch-set).

Changelog
  Use the return values of the registration functions

Cheers,

Paul.
---
 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;
 }
 
 /***********************************************************************
-- 
1.4.2




More information about the wine-patches mailing list