fix function GetAllUsersProfileDirectoryW
-- v3: fix compile failed
From: 纯真的电灯泡1011726441@qq.com
--- dlls/userenv/userenv_main.c | 62 +++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-)
diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index cadb45c1a74..3e71a88771f 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -587,10 +587,66 @@ BOOL WINAPI GetAllUsersProfileDirectoryA( LPSTR lpProfileDir, LPDWORD lpcchSize return FALSE; }
-BOOL WINAPI GetAllUsersProfileDirectoryW( LPWSTR lpProfileDir, LPDWORD lpcchSize ) +BOOL WINAPI GetAllUsersProfileDirectoryW(LPWSTR lpProfileDir, LPDWORD lpcchSize) { - FIXME("%p %p\n", lpProfileDir, lpcchSize); - return FALSE; + LONG l; + HKEY key; + BOOL ret = FALSE; + DWORD len = 0, expanded_len; + LPWSTR unexpanded_profiles_dir = NULL; + + TRACE("%p %p\n", lpProfilesDir, lpcchSize); + + if (!lpcchSize) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + l = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"Software\Microsoft\Windows NT\CurrentVersion\ProfileList", + 0, KEY_READ, &key); + if (l) + { + SetLastError(l); + return FALSE; + } + l = RegQueryValueExW(key, L"ProgramData", NULL, NULL, NULL, &len); + if (l) + { + SetLastError(l); + goto end; + } + unexpanded_profiles_dir = HeapAlloc(GetProcessHeap(), 0, len); + if (!unexpanded_profiles_dir) + { + SetLastError(ERROR_OUTOFMEMORY); + goto end; + } + l = RegQueryValueExW(key, L"ProgramData", NULL, NULL, + (BYTE *)unexpanded_profiles_dir, &len); + if (l) + { + SetLastError(l); + goto end; + } + expanded_len = ExpandEnvironmentStringsW(unexpanded_profiles_dir, NULL, 0); + /* The returned length doesn't include the NULL terminator. */ + if (*lpcchSize < expanded_len - 1 || !lpProfilesDir) + { + *lpcchSize = expanded_len - 1; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + goto end; + } + *lpcchSize = expanded_len - 1; + /* The return value is also the expected length. */ + ret = ExpandEnvironmentStringsW(unexpanded_profiles_dir, lpProfilesDir, + expanded_len) - + 1; +end: + HeapFree(GetProcessHeap(), 0, unexpanded_profiles_dir); + RegCloseKey(key); + return ret; }
BOOL WINAPI GetProfileType( DWORD *pdwFlags )
From: 纯真的电灯泡1011726441@qq.com
--- dlls/userenv/userenv_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index 3e71a88771f..22251c55740 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -595,7 +595,7 @@ BOOL WINAPI GetAllUsersProfileDirectoryW(LPWSTR lpProfileDir, LPDWORD lpcchSize) DWORD len = 0, expanded_len; LPWSTR unexpanded_profiles_dir = NULL;
- TRACE("%p %p\n", lpProfilesDir, lpcchSize); + TRACE("%p %p\n", lpProfileDir, lpcchSize);
if (!lpcchSize) { @@ -632,7 +632,7 @@ BOOL WINAPI GetAllUsersProfileDirectoryW(LPWSTR lpProfileDir, LPDWORD lpcchSize) } expanded_len = ExpandEnvironmentStringsW(unexpanded_profiles_dir, NULL, 0); /* The returned length doesn't include the NULL terminator. */ - if (*lpcchSize < expanded_len - 1 || !lpProfilesDir) + if (*lpcchSize < expanded_len - 1 || !lpProfileDir) { *lpcchSize = expanded_len - 1; SetLastError(ERROR_INSUFFICIENT_BUFFER); @@ -640,7 +640,7 @@ BOOL WINAPI GetAllUsersProfileDirectoryW(LPWSTR lpProfileDir, LPDWORD lpcchSize) } *lpcchSize = expanded_len - 1; /* The return value is also the expected length. */ - ret = ExpandEnvironmentStringsW(unexpanded_profiles_dir, lpProfilesDir, + ret = ExpandEnvironmentStringsW(unexpanded_profiles_dir, lpProfileDir, expanded_len) - 1; end:
From: 纯真的电灯泡1011726441@qq.com
--- dlls/userenv/userenv_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index 22251c55740..e721822cf5c 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -595,7 +595,7 @@ BOOL WINAPI GetAllUsersProfileDirectoryW(LPWSTR lpProfileDir, LPDWORD lpcchSize) DWORD len = 0, expanded_len; LPWSTR unexpanded_profiles_dir = NULL;
- TRACE("%p %p\n", lpProfileDir, lpcchSize); + // TRACE("%p %p\n", lpProfileDir, lpcchSize);
if (!lpcchSize) {
This merge request was closed by Bulb.