[PATCH 2/3] credui: Implement CredUIParseUserName.

Robert Shearman rob at codeweavers.com
Fri Jan 26 13:54:19 CST 2007


---
  dlls/credui/credui.spec   |    2 +-
  dlls/credui/credui_main.c |   55 
+++++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 56 insertions(+), 1 deletions(-)
-------------- next part --------------
diff --git a/dlls/credui/credui.spec b/dlls/credui/credui.spec
index ce54235..20146c7 100644
--- a/dlls/credui/credui.spec
+++ b/dlls/credui/credui.spec
@@ -4,7 +4,7 @@
 @ stdcall CredUIConfirmCredentialsW(wstr long)
 @ stub CredUIInitControls
 @ stub CredUIParseUserNameA
-@ stub CredUIParseUserNameW
+@ stdcall CredUIParseUserNameW(wstr ptr long ptr long)
 @ stub CredUIPromptForCredentialsA
 @ stdcall CredUIPromptForCredentialsW(ptr wstr ptr long ptr long ptr long ptr long)
 @ stub CredUIReadSSOCredA
diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c
index 6bd6330..5294b21 100644
--- a/dlls/credui/credui_main.c
+++ b/dlls/credui/credui_main.c
@@ -29,6 +29,7 @@ #include "wincred.h"
 #include "credui_resources.h"
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(credui);
 
@@ -177,3 +178,57 @@ DWORD WINAPI CredUIConfirmCredentialsW(P
           bConfirm ? "TRUE" : "FALSE");
     return ERROR_SUCCESS;
 }
+
+/******************************************************************************
+ *           CredUIParseUserNameW [CREDUI.@]
+ */
+DWORD WINAPI CredUIParseUserNameW(PCWSTR pszUserName, PWSTR pszUser,
+                                  ULONG ulMaxUserChars, PWSTR pszDomain,
+                                  ULONG ulMaxDomainChars)
+{
+    PWSTR p;
+
+    TRACE("(%s, %p, %d, %p, %d)\n", debugstr_w(pszUserName), pszUser,
+          ulMaxUserChars, pszDomain, ulMaxDomainChars);
+
+    if (!pszUserName || !pszUser || !ulMaxUserChars || !pszDomain ||
+        !ulMaxDomainChars)
+        return ERROR_INVALID_PARAMETER;
+
+    /* FIXME: handle marshaled credentials */
+
+    p = strchrW(pszUserName, '\\');
+    if (p)
+    {
+        if (p - pszUserName > ulMaxDomainChars - 1)
+            return ERROR_INSUFFICIENT_BUFFER;
+        if (strlenW(p + 1) > ulMaxUserChars - 1)
+            return ERROR_INSUFFICIENT_BUFFER;
+        strcpyW(pszUser, p + 1);
+        memcpy(pszDomain, pszUserName, (p - pszUserName)*sizeof(WCHAR));
+        pszDomain[p - pszUserName] = '\0';
+
+        return ERROR_SUCCESS;
+    }
+
+    p = strrchrW(pszUserName, '@');
+    if (p)
+    {
+        if (p + 1 - pszUserName > ulMaxUserChars - 1)
+            return ERROR_INSUFFICIENT_BUFFER;
+        if (strlenW(p + 1) > ulMaxDomainChars - 1)
+            return ERROR_INSUFFICIENT_BUFFER;
+        strcpyW(pszDomain, p + 1);
+        memcpy(pszUser, pszUserName, (p - pszUserName)*sizeof(WCHAR));
+        pszUser[p - pszUserName] = '\0';
+
+        return ERROR_SUCCESS;
+    }
+
+    if (strlenW(pszUserName) > ulMaxUserChars - 1)
+        return ERROR_INSUFFICIENT_BUFFER;
+    strcpyW(pszUser, pszUserName);
+    pszDomain[0] = '\0';
+
+    return ERROR_SUCCESS;
+}


More information about the wine-patches mailing list