Module: wine Branch: master Commit: 8c90767c3d8c1e2df6c633a8b97d5c7cc8b093dd URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c90767c3d8c1e2df6c633a8b9...
Author: Juan Lang juan.lang@gmail.com Date: Tue Sep 30 10:11:30 2008 -0700
wintrust: Implement WTHelperGetKnownUsages.
---
dlls/wintrust/tests/softpub.c | 8 ---- dlls/wintrust/wintrust_main.c | 81 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 10 deletions(-)
diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c index 4bb45c4..5509bce 100644 --- a/dlls/wintrust/tests/softpub.c +++ b/dlls/wintrust/tests/softpub.c @@ -479,17 +479,14 @@ static void test_get_known_usages(void) } SetLastError(0xdeadbeef); ret = pWTHelperGetKnownUsages(0, NULL); - todo_wine ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = pWTHelperGetKnownUsages(1, NULL); - todo_wine ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = pWTHelperGetKnownUsages(0, &usages); - todo_wine ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); /* A value of 1 for the first parameter seems to imply the value is @@ -498,9 +495,7 @@ static void test_get_known_usages(void) SetLastError(0xdeadbeef); usages = NULL; ret = pWTHelperGetKnownUsages(1, &usages); - todo_wine ok(ret, "WTHelperGetKnownUsages failed: %d\n", GetLastError()); - todo_wine ok(usages != NULL, "expected a pointer\n"); if (ret && usages) { @@ -523,17 +518,14 @@ static void test_get_known_usages(void) */ SetLastError(0xdeadbeef); ret = pWTHelperGetKnownUsages(2, &usages); - todo_wine ok(ret, "WTHelperGetKnownUsages failed: %d\n", GetLastError()); ok(usages == NULL, "expected pointer to be cleared\n"); SetLastError(0xdeadbeef); usages = NULL; ret = pWTHelperGetKnownUsages(2, &usages); - todo_wine ok(ret, "WTHelperGetKnownUsages failed: %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = pWTHelperGetKnownUsages(2, NULL); - todo_wine ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c index 2cfc898..091c0d4 100644 --- a/dlls/wintrust/wintrust_main.c +++ b/dlls/wintrust/wintrust_main.c @@ -735,13 +735,90 @@ HANDLE WINAPI WTHelperGetFileHandle(WINTRUST_DATA *data) return INVALID_HANDLE_VALUE; }
+static BOOL WINAPI WINTRUST_enumUsages(PCCRYPT_OID_INFO pInfo, void *pvArg) +{ + PCCRYPT_OID_INFO **usages = (PCCRYPT_OID_INFO **)pvArg; + DWORD cUsages; + BOOL ret; + + if (!*usages) + { + cUsages = 0; + *usages = WINTRUST_Alloc(2 * sizeof(PCCRYPT_OID_INFO)); + } + else + { + PCCRYPT_OID_INFO *ptr; + + /* Count the existing usages. + * FIXME: make sure the new usage doesn't duplicate any in the list? + */ + for (cUsages = 0, ptr = *usages; *ptr; ptr++, cUsages++) + ; + *usages = WINTRUST_ReAlloc((CRYPT_OID_INFO *)*usages, + (cUsages + 1) * sizeof(PCCRYPT_OID_INFO)); + } + if (*usages) + { + (*usages)[cUsages] = pInfo; + (*usages)[cUsages + 1] = NULL; + ret = TRUE; + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } + return ret; +} + /*********************************************************************** * WTHelperGetKnownUsages(WINTRUST.@) + * + * Enumerates the known enhanced key usages as an array of PCCRYPT_OID_INFOs. + * + * PARAMS + * action [In] 1 => allocate and return known usages, 2 => free previously + * allocated usages. + * usages [In/Out] If action == 1, *usages is set to an array of + * PCCRYPT_OID_INFO *. The array is terminated with a NULL + * pointer. + * If action == 2, *usages is freed. + * + * RETURNS + * TRUE on success, FALSE on failure. */ BOOL WINAPI WTHelperGetKnownUsages(DWORD action, PCCRYPT_OID_INFO **usages) { - FIXME("(%d, %p): stub\n", action, usages); - return FALSE; + BOOL ret; + + TRACE("(%d, %p)\n", action, usages); + + if (!usages) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (action == 1) + { + *usages = NULL; + ret = CryptEnumOIDInfo(CRYPT_ENHKEY_USAGE_OID_GROUP_ID, 0, usages, + WINTRUST_enumUsages); + } + else if (action == 2) + { + WINTRUST_Free((CRYPT_OID_INFO *)*usages); + *usages = NULL; + ret = TRUE; + } + else + { + WARN("unknown action %d\n", action); + SetLastError(ERROR_INVALID_PARAMETER); + ret = FALSE; + } + return ret; }
static const WCHAR Software_Publishing[] = {