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