Skip to content

Commit 62cc39c

Browse files
authored
Merge pull request #4624 from compnerd/user
Base: add support for querying user home directory on Windows
2 parents cce3d9a + bc3f17e commit 62cc39c

File tree

1 file changed

+39
-9
lines changed

1 file changed

+39
-9
lines changed

CoreFoundation/Base.subproj/CFPlatform.c

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727

2828
#if TARGET_OS_WIN32
29+
#include <lm.h>
2930
#include <shellapi.h>
3031
#include <shlobj.h>
3132
#include <WinIoCtl.h>
@@ -577,15 +578,44 @@ CF_EXPORT CFURLRef CFCopyHomeDirectoryURLForUser(CFStringRef uName) {
577578
return result;
578579
}
579580
#elif TARGET_OS_WIN32
580-
// This code can only get the directory for the current user
581-
CFStringRef userName = uName ? CFCopyUserName() : NULL;
582-
if (uName && !CFEqual(uName, userName)) {
583-
CFLog(kCFLogLevelError, CFSTR("CFCopyHomeDirectoryURLForUser(): Unable to get home directory for other user"));
584-
if (userName) CFRelease(userName);
585-
return NULL;
586-
}
587-
if (userName) CFRelease(userName);
588-
return CFCopyHomeDirectoryURL();
581+
if (uName == NULL) {
582+
return CFCopyHomeDirectoryURL();
583+
}
584+
585+
CFStringRef home = NULL;
586+
LPUSER_INFO_1 pBuffer = NULL;
587+
DWORD dwEntriesRead = 0;
588+
DWORD dwEntries = 0;
589+
DWORD dwToken = 0;
590+
NTSTATUS nStatus;
591+
do {
592+
nStatus = NetUserEnum(NULL, 1, FILTER_NORMAL_ACCOUNT, (LPBYTE*)&pBuffer,
593+
MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwEntries,
594+
&dwToken);
595+
if (nStatus == NERR_Success || nStatus == ERROR_MORE_DATA) {
596+
for (unsigned uiEntry = 0; !home && uiEntry < dwEntriesRead; ++uiEntry) {
597+
CFStringRef name =
598+
CFStringCreateWithCStringNoCopy(kCFAllocatorSystemDefault,
599+
pBuffer[uiEntry].usri1_name,
600+
kCFStringEncodingUTF16,
601+
kCFAllocatorNull);
602+
603+
if (CFEqual(uName, name)) {
604+
home = pBuffer[uiEntry].usri1_home_dir
605+
? CFStringCreateWithCString(kCFAllocatorSystemDefault,
606+
pBuffer[uiEntry].usri1_home_dir,
607+
kCFStringEncodingUTF16)
608+
: CFSTR("");
609+
}
610+
611+
CFRelease(name);
612+
}
613+
}
614+
NetApiBufferFree(pBuffer);
615+
pBuffer = NULL;
616+
} while (nStatus == ERROR_MORE_DATA);
617+
618+
return home;
589619
#else
590620
#error Dont know how to compute users home directories on this platform
591621
#endif

0 commit comments

Comments
 (0)