@@ -217,31 +217,40 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio
217
217
// The only SpecialFolderOption defines we have are equivalent to KnownFolderFlags.
218
218
219
219
string folderGuid ;
220
-
220
+ string ? fallbackEnv = null ;
221
221
switch ( folder )
222
222
{
223
223
// Special-cased values to not use SHGetFolderPath when we have a more direct option available.
224
224
case SpecialFolder . System :
225
- // This assumes the system directory always exists and thus we don't need to do anything special for any SpecialFolderOption.
226
- return SystemDirectory ;
225
+ if ( ! string . IsNullOrEmpty ( SystemDirectory ) )
226
+ return SystemDirectory ;
227
+
228
+ string ? windir = Environment . GetEnvironmentVariable ( "windir" ) ;
229
+ if ( string . IsNullOrEmpty ( windir ) )
230
+ return string . Empty ;
231
+
232
+ return Path . Combine ( windir , "system32" ) ;
227
233
default :
228
234
return string . Empty ;
229
235
230
- // Map the SpecialFolder to the appropriate Guid
231
236
case SpecialFolder . ApplicationData :
232
237
folderGuid = Interop . Shell32 . KnownFolders . RoamingAppData ;
238
+ fallbackEnv = "APPDATA" ;
233
239
break ;
234
240
case SpecialFolder . CommonApplicationData :
235
241
folderGuid = Interop . Shell32 . KnownFolders . ProgramData ;
242
+ fallbackEnv = "ProgramData" ;
236
243
break ;
237
244
case SpecialFolder . LocalApplicationData :
238
245
folderGuid = Interop . Shell32 . KnownFolders . LocalAppData ;
246
+ fallbackEnv = "LOCALAPPDATA" ;
239
247
break ;
240
248
case SpecialFolder . Cookies :
241
249
folderGuid = Interop . Shell32 . KnownFolders . Cookies ;
242
250
break ;
243
251
case SpecialFolder . Desktop :
244
252
folderGuid = Interop . Shell32 . KnownFolders . Desktop ;
253
+ fallbackEnv = "PUBLIC" ;
245
254
break ;
246
255
case SpecialFolder . Favorites :
247
256
folderGuid = Interop . Shell32 . KnownFolders . Favorites ;
@@ -292,9 +301,11 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio
292
301
break ;
293
302
case SpecialFolder . ProgramFiles :
294
303
folderGuid = Interop . Shell32 . KnownFolders . ProgramFiles ;
304
+ fallbackEnv = "ProgramFiles" ;
295
305
break ;
296
306
case SpecialFolder . CommonProgramFiles :
297
307
folderGuid = Interop . Shell32 . KnownFolders . ProgramFilesCommon ;
308
+ fallbackEnv = "CommonProgramFiles" ;
298
309
break ;
299
310
case SpecialFolder . AdminTools :
300
311
folderGuid = Interop . Shell32 . KnownFolders . AdminTools ;
@@ -346,12 +357,15 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio
346
357
break ;
347
358
case SpecialFolder . UserProfile :
348
359
folderGuid = Interop . Shell32 . KnownFolders . Profile ;
360
+ fallbackEnv = "USERPROFILE" ;
349
361
break ;
350
362
case SpecialFolder . CommonProgramFilesX86 :
351
363
folderGuid = Interop . Shell32 . KnownFolders . ProgramFilesCommonX86 ;
364
+ fallbackEnv = "ProgramFiles(x86)" ;
352
365
break ;
353
366
case SpecialFolder . ProgramFilesX86 :
354
367
folderGuid = Interop . Shell32 . KnownFolders . ProgramFilesX86 ;
368
+ fallbackEnv = "ProgramFiles(x86)" ;
355
369
break ;
356
370
case SpecialFolder . Resources :
357
371
folderGuid = Interop . Shell32 . KnownFolders . ResourceDir ;
@@ -364,18 +378,17 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio
364
378
break ;
365
379
case SpecialFolder . Windows :
366
380
folderGuid = Interop . Shell32 . KnownFolders . Windows ;
381
+ fallbackEnv = "windir" ;
367
382
break ;
368
383
}
369
384
370
385
Guid folderId = new Guid ( folderGuid ) ;
371
-
372
386
int hr = Interop . Shell32 . SHGetKnownFolderPath ( folderId , ( uint ) option , IntPtr . Zero , out string path ) ;
373
- if ( hr != 0 ) // Not S_OK
374
- {
375
- return string . Empty ;
376
- }
387
+ if ( hr == 0 )
388
+ return path ;
377
389
378
- return path ;
390
+ // Fallback logic if SHGetKnownFolderPath failed (nanoserver)
391
+ return fallbackEnv != null ? Environment . GetEnvironmentVariable ( fallbackEnv ) ?? string . Empty : string . Empty ;
379
392
}
380
393
381
394
// Separate type so a .cctor is not created for Environment which then would be triggered during startup
0 commit comments