[PATCH] Implement GetUserProfileDirectory

Michael Karcher wine at mkarcher.dialup.fu-berlin.de
Sun Jan 24 08:36:20 CST 2010


---
 dlls/userenv/tests/Makefile.in |    2 +-
 dlls/userenv/tests/userenv.c   |   68 ++++++++++++++++++++++++++++++++++++++++
 dlls/userenv/userenv_main.c    |   26 +++++++++++++--
 3 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/dlls/userenv/tests/Makefile.in b/dlls/userenv/tests/Makefile.in
index 9720239..5c18c5c 100644
--- a/dlls/userenv/tests/Makefile.in
+++ b/dlls/userenv/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = userenv.dll
-IMPORTS   = userenv advapi32 kernel32
+IMPORTS   = userenv advapi32 kernel32 shell32
 
 CTESTS = \
 	userenv.c
diff --git a/dlls/userenv/tests/userenv.c b/dlls/userenv/tests/userenv.c
index 39c1bbf..5060e4a 100644
--- a/dlls/userenv/tests/userenv.c
+++ b/dlls/userenv/tests/userenv.c
@@ -27,6 +27,7 @@
 #include "winnls.h"
 
 #include "userenv.h"
+#include "shlobj.h"
 
 #include "wine/test.h"
 
@@ -199,7 +200,74 @@ static void test_create_env(void)
     if (r) HeapFree(GetProcessHeap(), 0, st);
 }
 
+void test_get_user_profile_directory(void)
+{
+    BOOL r;
+    HRESULT hr;
+    HANDLE htok;
+    DWORD size, expect_size;
+    CHAR profdir_userenv[MAX_PATH];
+    CHAR profdir_shell[MAX_PATH];
+    WCHAR profdir_userenvW[MAX_PATH];
+    WCHAR profdir_shellW[MAX_PATH];
+
+    r = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &htok);
+    expect(TRUE, r);
+
+    size = 0;
+    r = GetUserProfileDirectoryA(htok, NULL, &size);
+    expect(FALSE, r);
+    expect_size = size;
+
+    if(expect_size == 0)
+        win_skip("skipping tests for size in GetUserProfileA as it is broken\n");
+    else
+    {
+        size = 1;
+        r = GetUserProfileDirectoryA(htok, NULL, &size);
+        expect(FALSE, r);
+        expect(expect_size, size);
+    }
+
+    size = MAX_PATH;
+    r = GetUserProfileDirectoryA(htok, profdir_userenv, &size);
+    if (expect_size != 0)
+    {
+        expect(TRUE, r);
+        expect(expect_size, size);
+    }
+    else
+        ok(r != FALSE, "GetUserProfileDirectoryA returned 0");
+
+    hr = SHGetFolderPathA(0, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, profdir_shell);
+    expect(S_OK, hr);
+    ok(lstrcmpi(profdir_userenv, profdir_shell) == 0, "Userenv: %s, Shell: %s\n",
+        profdir_userenv, profdir_shell);
+
+    size = 0;
+    r = GetUserProfileDirectoryW(htok, NULL, &size);
+    expect(FALSE, r);
+    expect_size = size;
+
+    size = 1;
+    r = GetUserProfileDirectoryW(htok, NULL, &size);
+    expect(FALSE, r);
+    expect(expect_size, size);
+
+    size = MAX_PATH;
+    r = GetUserProfileDirectoryW(htok, profdir_userenvW, &size);
+    expect(TRUE, r);
+    expect(expect_size, size);
+
+    hr = SHGetFolderPathW(0, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, profdir_shellW);
+    expect(S_OK, hr);
+    ok(lstrcmpiW(profdir_userenvW, profdir_shellW) == 0, "wchar dir mismatch\n");
+
+    CloseHandle(htok);
+}
+
 START_TEST(userenv)
 {
     test_create_env();
+    test_get_user_profile_directory();
 }
diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c
index 01f3a1b..81801d7 100644
--- a/dlls/userenv/userenv_main.c
+++ b/dlls/userenv/userenv_main.c
@@ -49,6 +49,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
     return TRUE;
 }
 
+static const WCHAR UserprofileW[] = {'%','U','S','E','R','P','R','O','F','I','L','E','%',0};
+
 BOOL WINAPI CreateEnvironmentBlock( LPVOID* lpEnvironment,
                      HANDLE hToken, BOOL bInherit )
 {
@@ -92,15 +94,31 @@ BOOL WINAPI ExpandEnvironmentStringsForUserW( HANDLE hToken, LPCWSTR lpSrc,
 BOOL WINAPI GetUserProfileDirectoryA( HANDLE hToken, LPSTR lpProfileDir,
                      LPDWORD lpcchSize )
 {
-    FIXME("%p %p %p\n", hToken, lpProfileDir, lpcchSize );
-    return FALSE;
+    DWORD len, newlen;
+    TRACE("(%p %p %p)\n", hToken, lpProfileDir, lpcchSize );
+    if (lpProfileDir)
+        len = *lpcchSize;
+    else
+        len = 0;
+    newlen = ExpandEnvironmentStringsForUserA(hToken, "%USERPROFILE%",
+                                lpProfileDir, len);
+    *lpcchSize = newlen;
+    return (lpProfileDir != NULL) && newlen <= len;
 }
 
 BOOL WINAPI GetUserProfileDirectoryW( HANDLE hToken, LPWSTR lpProfileDir,
                      LPDWORD lpcchSize )
 {
-    FIXME("%p %p %p\n", hToken, lpProfileDir, lpcchSize );
-    return FALSE;
+    DWORD len, newlen;
+    TRACE("(%p %p %p)\n", hToken, lpProfileDir, lpcchSize );
+    if (lpProfileDir)
+        len = *lpcchSize;
+    else
+        len = 0;
+    newlen = ExpandEnvironmentStringsForUserW(hToken, UserprofileW,
+                                lpProfileDir, len);
+    *lpcchSize = newlen;
+    return (lpProfileDir != NULL) && newlen <= len;
 }
 
 BOOL WINAPI GetProfilesDirectoryA( LPSTR lpProfilesDir, LPDWORD lpcchSize )
-- 
1.6.5




More information about the wine-patches mailing list