[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