[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