Juan Lang : wintrust: Execute WinVerifyTrust as a sequence of steps, and return the error code from the first failing step of the sequence.

Alexandre Julliard julliard at winehq.org
Wed Jul 16 13:32:40 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Jul 15 12:09:44 2008 -0700

wintrust: Execute WinVerifyTrust as a sequence of steps, and return the error code from the first failing step of the sequence.

---

 dlls/wintrust/tests/softpub.c |    2 -
 dlls/wintrust/wintrust_main.c |   51 +++++++++++++++++++++++++++++-----------
 2 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c
index 62b115a..aa27333 100644
--- a/dlls/wintrust/tests/softpub.c
+++ b/dlls/wintrust/tests/softpub.c
@@ -444,10 +444,8 @@ static void test_wintrust(void)
     getNotepadPath(notepadPathW, MAX_PATH);
     file.pcwszFilePath = notepadPathW;
     r = WinVerifyTrust(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd);
-    todo_wine
     ok(r == TRUST_E_NOSIGNATURE, "expected TRUST_E_NOSIGNATURE, got %08x\n", r);
     hr = WinVerifyTrustEx(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd);
-    todo_wine
     ok(hr == TRUST_E_NOSIGNATURE, "expected TRUST_E_NOSIGNATURE, got %08x\n",
      hr);
 }
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index 28d5a25..ed6a8ed 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -66,12 +66,35 @@ BOOL WINAPI TrustIsCertificateSelfSigned( PCCERT_CONTEXT cert )
     return ret;
 }
 
+typedef HRESULT (WINAPI *wintrust_step_func)(CRYPT_PROVIDER_DATA *data);
+
+struct wintrust_step
+{
+    wintrust_step_func func;
+    DWORD              error_index;
+};
+
+static DWORD WINTRUST_ExecuteSteps(const struct wintrust_step *steps,
+ DWORD numSteps, CRYPT_PROVIDER_DATA *provData)
+{
+    DWORD i, err = ERROR_SUCCESS;
+
+    for (i = 0; !err && i < numSteps; i++)
+    {
+        err = steps[i].func(provData);
+        if (err)
+            err = provData->padwTrustStepErrors[steps[i].error_index];
+    }
+    return err;
+}
+
 static LONG WINTRUST_DefaultVerify(HWND hwnd, GUID *actionID,
  WINTRUST_DATA *data)
 {
-    DWORD err = ERROR_SUCCESS;
+    DWORD err = ERROR_SUCCESS, numSteps = 0;
     CRYPT_PROVIDER_DATA *provData;
     BOOL ret;
+    struct wintrust_step verifySteps[5];
 
     TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data);
 
@@ -113,30 +136,30 @@ static LONG WINTRUST_DefaultVerify(HWND hwnd, GUID *actionID,
 
     if (provData->psPfns->pfnInitialize)
     {
-        err = provData->psPfns->pfnInitialize(provData);
-        if (err)
-            goto done;
+        verifySteps[numSteps].func = provData->psPfns->pfnInitialize;
+        verifySteps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_WVTINIT;
     }
     if (provData->psPfns->pfnObjectTrust)
     {
-        err = provData->psPfns->pfnObjectTrust(provData);
-        if (err)
-            goto done;
+        verifySteps[numSteps].func = provData->psPfns->pfnObjectTrust;
+        verifySteps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_OBJPROV;
     }
     if (provData->psPfns->pfnSignatureTrust)
     {
-        err = provData->psPfns->pfnSignatureTrust(provData);
-        if (err)
-            goto done;
+        verifySteps[numSteps].func = provData->psPfns->pfnSignatureTrust;
+        verifySteps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_SIGPROV;
     }
     if (provData->psPfns->pfnCertificateTrust)
     {
-        err = provData->psPfns->pfnCertificateTrust(provData);
-        if (err)
-            goto done;
+        verifySteps[numSteps].func = provData->psPfns->pfnCertificateTrust;
+        verifySteps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_CERTPROV;
     }
     if (provData->psPfns->pfnFinalPolicy)
-        err = provData->psPfns->pfnFinalPolicy(provData);
+    {
+        verifySteps[numSteps].func = provData->psPfns->pfnFinalPolicy;
+        verifySteps[numSteps++].error_index = TRUSTERROR_STEP_FINAL_POLICYPROV;
+    }
+    err = WINTRUST_ExecuteSteps(verifySteps, numSteps, provData);
     goto done;
 
 oom:




More information about the wine-cvs mailing list