From add4f3331890725148913c63568da292ed9bf0d7 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 15 Jul 2008 12:09:44 -0700 Subject: [PATCH] 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 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 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: -- 1.4.1