Paul Vriens : wintrust: Implemented WintrustAddDefaultForUsage.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Sep 12 09:35:13 CDT 2006
Module: wine
Branch: master
Commit: 181574a1b4ee9d880181b8e68840054463566b57
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=181574a1b4ee9d880181b8e68840054463566b57
Author: Paul Vriens <Paul.Vriens at xs4all.nl>
Date: Tue Sep 12 14:28:05 2006 +0200
wintrust: Implemented WintrustAddDefaultForUsage.
---
dlls/wintrust/register.c | 75 +++++++++++++++++++++++++++++++++++++++-
dlls/wintrust/tests/register.c | 31 ++++++-----------
2 files changed, 85 insertions(+), 21 deletions(-)
diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index 1f1fc86..aa9d75a 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -681,12 +681,83 @@ static void WINTRUST_RegisterGenChainVer
/***********************************************************************
* 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 3640aa4..eb34aa4 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());
More information about the wine-cvs
mailing list