diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c index 1f1fc86b27a..aa9d75a4432 100644 --- a/dlls/wintrust/register.c +++ b/dlls/wintrust/register.c @@ -681,12 +681,83 @@ static void WINTRUST_RegisterGenChainVerify(void) /*********************************************************************** * WintrustAddDefaultForUsage (WINTRUST.@) + * + * Write OID and callback functions to the registry. + * + * PARAMS + * pszUsageOID [I] Pointer to a GUID. + * psDefUsage [I] Pointer to a structure that specifies the callback functions. + * + * RETURNS + * Success: TRUE. + * Failure: FALSE. + * + * NOTES + * WintrustAddDefaultForUsage will only return TRUE or FALSE, no last + * error is set, not even when the registry cannot be written to. */ BOOL WINAPI WintrustAddDefaultForUsage(const CHAR *pszUsageOID, CRYPT_PROVIDER_REGDEFUSAGE *psDefUsage) { - FIXME("(%s %p) stub\n", debugstr_a(pszUsageOID), psDefUsage); - return FALSE; + static const WCHAR CBAlloc[] = {'C','a','l','l','b','a','c','k','A','l','l','o','c','F','u','n','c','t','i','o','n', 0}; + static const WCHAR CBFree[] = {'C','a','l','l','b','a','c','k','F','r','e','e','F','u','n','c','t','i','o','n', 0}; + LONG Res = ERROR_SUCCESS; + LONG WriteUsageError = ERROR_SUCCESS; + DWORD Len; + WCHAR GuidString[39]; + + TRACE("(%s %p)\n", debugstr_a(pszUsageOID), psDefUsage); + + /* Some sanity checks. */ + if (!pszUsageOID || + !psDefUsage || + !psDefUsage->pgActionID || + (psDefUsage->cbStruct != sizeof(CRYPT_PROVIDER_REGDEFUSAGE))) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (psDefUsage->pwszDllName) + { + Res = WINTRUST_WriteSingleUsageEntry(pszUsageOID, Dll, psDefUsage->pwszDllName); + if (Res != ERROR_SUCCESS) WriteUsageError = Res; + } + if (psDefUsage->pwszLoadCallbackDataFunctionName) + { + WCHAR* CallbackW; + + Len = MultiByteToWideChar( CP_ACP, 0, psDefUsage->pwszLoadCallbackDataFunctionName, -1, NULL, 0 ); + CallbackW = HeapAlloc( GetProcessHeap(), 0, Len * sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, psDefUsage->pwszLoadCallbackDataFunctionName, -1, CallbackW, Len ); + + Res = WINTRUST_WriteSingleUsageEntry(pszUsageOID, CBAlloc, CallbackW); + if (Res != ERROR_SUCCESS) WriteUsageError = Res; + + HeapFree(GetProcessHeap(), 0, CallbackW); + } + if (psDefUsage->pwszFreeCallbackDataFunctionName) + { + WCHAR* CallbackW; + + Len = MultiByteToWideChar( CP_ACP, 0, psDefUsage->pwszFreeCallbackDataFunctionName, -1, NULL, 0 ); + CallbackW = HeapAlloc( GetProcessHeap(), 0, Len * sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, psDefUsage->pwszFreeCallbackDataFunctionName, -1, CallbackW, Len ); + + Res = WINTRUST_WriteSingleUsageEntry(pszUsageOID, CBFree, CallbackW); + if (Res != ERROR_SUCCESS) WriteUsageError = Res; + + HeapFree(GetProcessHeap(), 0, CallbackW); + } + + WINTRUST_Guid2Wstr(psDefUsage->pgActionID, GuidString); + Res = WINTRUST_WriteSingleUsageEntry(pszUsageOID, DefaultId, GuidString); + if (Res != ERROR_SUCCESS) WriteUsageError = Res; + + if (WriteUsageError != ERROR_SUCCESS) + return FALSE; + + return TRUE; } /*********************************************************************** diff --git a/dlls/wintrust/tests/register.c b/dlls/wintrust/tests/register.c index 3640aa4de5a..eb34aa48210 100644 --- a/dlls/wintrust/tests/register.c +++ b/dlls/wintrust/tests/register.c @@ -176,17 +176,15 @@ static void test_AddDefaultForUsage(void) SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(NULL, NULL); ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - todo_wine - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); /* NULL defusage */ SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(oid, NULL); ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - todo_wine - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); /* NULL oid and proper defusage */ memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); @@ -198,9 +196,8 @@ static void test_AddDefaultForUsage(void) SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(NULL, &DefUsage); ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - todo_wine - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); /* Just the ActionID */ memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); @@ -208,8 +205,7 @@ static void test_AddDefaultForUsage(void) DefUsage.pgActionID = &ActionID; SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(oid, &DefUsage); - todo_wine - ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); + ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); ok (GetLastError() == 0xdeadbeef, "Last error should not have been changed: 0x%08lx\n", GetLastError()); @@ -221,9 +217,8 @@ static void test_AddDefaultForUsage(void) DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; ret = pWintrustAddDefaultForUsage(oid, &DefUsage); ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - todo_wine - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); /* cbStruct set to 0 */ memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); @@ -235,9 +230,8 @@ static void test_AddDefaultForUsage(void) SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(oid, &DefUsage); ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - todo_wine - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld.\n", GetLastError()); /* All OK */ memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); @@ -248,8 +242,7 @@ static void test_AddDefaultForUsage(void) DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; SetLastError(0xdeadbeef); ret = pWintrustAddDefaultForUsage(oid, &DefUsage); - todo_wine - ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); + ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); ok (GetLastError() == 0xdeadbeef, "Last error should not have been changed: 0x%08lx\n", GetLastError());