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