@@ -367,33 +367,27 @@ extension String {
367
367
#if !NO_FILESYSTEM
368
368
internal static func homeDirectoryPath( forUser user: String ? = nil ) -> String {
369
369
#if os(Windows)
370
- func GetUserProfile( ) -> String ? {
371
- return " USERPROFILE " . withCString ( encodedAs: UTF16 . self) { pwszVariable in
372
- let dwLength : DWORD = GetEnvironmentVariableW ( pwszVariable, nil , 0 )
373
- // Ensure that `USERPROFILE` is defined.
374
- if dwLength == 0 { return nil }
375
- return withUnsafeTemporaryAllocation ( of: WCHAR . self, capacity: Int ( dwLength) ) {
376
- guard GetEnvironmentVariableW ( pwszVariable, $0. baseAddress, dwLength) == dwLength - 1 else {
377
- return nil
378
- }
379
- return String ( decodingCString: $0. baseAddress!, as: UTF16 . self)
370
+ if let user {
371
+ func fallbackUserDirectory( ) -> String {
372
+ guard let fallback = ProcessInfo . processInfo. environment [ " ALLUSERSPROFILE " ] else {
373
+ fatalError ( " Unable to find home directory for user \( user) and ALLUSERSPROFILE environment variable is not set " )
380
374
}
375
+
376
+ return fallback
381
377
}
382
- }
383
-
384
- if let user {
378
+
385
379
return user. withCString ( encodedAs: UTF16 . self) { pwszUserName in
386
380
var cbSID : DWORD = 0
387
381
var cchReferencedDomainName : DWORD = 0
388
382
var eUse : SID_NAME_USE = SidTypeUnknown
389
383
guard LookupAccountNameW ( nil , pwszUserName, nil , & cbSID, nil , & cchReferencedDomainName, & eUse) else {
390
- fatalError ( " unable to lookup SID for user \( user ) " )
384
+ return fallbackUserDirectory ( )
391
385
}
392
386
393
387
return withUnsafeTemporaryAllocation ( of: CChar . self, capacity: Int ( cbSID) ) { pSID in
394
388
return withUnsafeTemporaryAllocation ( of: WCHAR . self, capacity: Int ( cchReferencedDomainName) ) { pwszReferencedDomainName in
395
389
guard LookupAccountNameW ( nil , pwszUserName, pSID. baseAddress, & cbSID, pwszReferencedDomainName. baseAddress, & cchReferencedDomainName, & eUse) else {
396
- fatalError ( " unable to lookup SID for user \( user ) " )
390
+ return fallbackUserDirectory ( )
397
391
}
398
392
399
393
var pwszSID : LPWSTR ? = nil
@@ -423,7 +417,7 @@ extension String {
423
417
424
418
var hToken : HANDLE ? = nil
425
419
guard OpenProcessToken ( GetCurrentProcess ( ) , TOKEN_QUERY, & hToken) else {
426
- guard let UserProfile = GetUserProfile ( ) else {
420
+ guard let UserProfile = ProcessInfo . processInfo . environment [ " UserProfile " ] else {
427
421
fatalError ( " unable to evaluate `%UserProfile%` " )
428
422
}
429
423
return UserProfile
0 commit comments