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