Known Folders, the return...

Fixed some bugs (thanks Catherine) and you can [un]register your own Known Folder now:

Interop.cs:

using System;

using System.Runtime.InteropServices;

namespace Microsoft.SDK.Samples.VistaBridge.Library.Shell {

   public enum KnownFolderCategory {

      Virtual = 1,

      Fixed = 2,

      Common = 3,

      PerUser = 4

   }

   public enum KnownFolderRetrievalOptions {

      Create = 0x00008000,

      DontVerify = 0x00004000,

      DontUnexpand = 0x00002000,

      NoAlias = 0x00001000,

      Init = 0x00000800,

      DefaultPath = 0x00000400,

      NotParentRelative = 0x00000200

   }

   public enum KnownFolderRedirectionCapabilities {

      AllowAll = 0xff,

      Redirectable = 0x1,

      DenyAll = 0xfff00,

      DenyPolicyRedirected = 0x100,

      DenyPolicy = 0x200,

      DenyPermissions = 0x400

   }

   [Flags]

   public enum KnownFolderDefinitionFlags {

      LocalRedirectOnly = 0x2,

      Roamable = 0x4,

     Precreate = 0x8

   }

   internal struct NativeKnownFolderDefinition {

      internal KnownFolderCategory Category;

      internal IntPtr pszName;

      internal IntPtr pszDescription;

      internal Guid ParentID;

      internal IntPtr pszRelativePath;

  internal IntPtr pszParsingName;

      internal IntPtr pszTooltip;

      internal IntPtr pszLocalizedName;

      internal IntPtr pszIcon;

      internal IntPtr pszSecurity;

      internal UInt32 dwAttributes;

      internal KnownFolderDefinitionFlags DefinitionFlags;

      internal Guid FolderTypeID;

   }

   [ComImport, Guid("3AA7AF7E-9B36-420c-A8E3-F77D4674A488"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

   internal interface IKnownFolder {

      Guid GetId();

      KnownFolderCategory GetCategory();

      void GetShellItem(KnownFolderRetrievalOptions retrievalOptions,

                        [MarshalAs(UnmanagedType.LPStruct)] Guid interfaceGuid,

                        [Out, MarshalAs(UnmanagedType.IUnknown)] out object shellItem);

     [return: MarshalAs(UnmanagedType.LPWStr)]

      string GetPath(KnownFolderRetrievalOptions retrievalOptions);

      void SetPath(KnownFolderRetrievalOptions retrievalOptions, string path);

      void GetIDList(KnownFolderRetrievalOptions retrievalOptions, [Out] out IntPtr itemIdentifierListPointer);

      Guid GetFolderType();

      KnownFolderRedirectionCapabilities GetRedirectionCapabilities();

      void GetFolderDefinition([Out, MarshalAs(UnmanagedType.Struct)] out NativeKnownFolderDefinition definition);

   }

   [Guid("8BE2D872-86AA-4d47-B776-32CCA40C7018"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

   internal interface IKnownFolderManager {

      void FolderIdFromCsidl(int Csidl, [Out] out Guid knownFolderID);

      void FolderIdToCsidl([In, MarshalAs(UnmanagedType.LPStruct)] Guid id, [Out] out int Csidl);

      // HRESULT GetFolderIds( [out, size_is( , *pCount)] KnownFolderID ** ppKFId, [in, out] UINT *pCount);

      void GetFolderIds([Out] out IntPtr folders, [Out] out UInt32 count);

      void GetFolder([In, MarshalAs(UnmanagedType.LPStruct)] Guid id, [Out, MarshalAs(UnmanagedType.Interface)] out IKnownFolder knownFolder);

      void GetFolderByName(string canonicalName, [Out, MarshalAs(UnmanagedType.Interface)] out IKnownFolder knowFolder);

      void RegisterFolder([In,MarshalAs(UnmanagedType.LPStruct)] Guid knownFolderGuid, [In] ref NativeKnownFolderDefinition nativeKnownFolderDefinition);

      void UnregisterFolder([In, MarshalAs(UnmanagedType.LPStruct)] Guid knownFolderGuid);

   void FindFolderFromPath([In, MarshalAs(UnmanagedType.LPWStr)] string path, [In] KnownFolderFindMode mode, [Out, MarshalAs(UnmanagedType.Interface)] out IKnownFolder knownFolder);

      void FindFolderFromIDList(); //( [in] PCIDLIST_ABSOLUTE pidl, [out] IKnownFolder **ppkf);

      void Redirect(); //( [in] REFKNOWNFOLDERID rfid, [in, unique] HWND hwnd, [in] KF_REDIRECT_FLAGS flags,[in, unique, string] LPCWSTR pszTargetPath, [in] UINT cFolders, [in, size_is(cFolders), unique] KnownFolderID const *pExclusion,[out, string] LPWSTR* ppszError);

   }

   [ComImport, Guid("4df0c730-df9d-4ae3-9153-aa6b82e9795a")]

   internal class NativeKnownFolderManager {

   }

}

 

KnownFolder.cs:

 

namespace Microsoft.SDK.Samples.VistaBridge.Library.Shell {

   using System;

   using System.Diagnostics;

   using System.Runtime.InteropServices;

   public enum KnownFolderFindMode : int {

      ExactMatch = 0,

      NearestParentMatch = ExactMatch + 1

   };

   public class KnownFolderManager {

      static IKnownFolderManager _knownFolderManager = (IKnownFolderManager) new NativeKnownFolderManager();

      public static KnownFolder GetKnownFolder(int csidl) {

         Guid knownFolderID;

         _knownFolderManager.FolderIdFromCsidl(csidl, out knownFolderID);

         IKnownFolder knowFolderInterface;

         _knownFolderManager.GetFolder(knownFolderID, out knowFolderInterface);

         return new KnownFolder(knowFolderInterface);

      }

      public static KnownFolder GetKnownFolder(Guid knownFolderID) {

         IKnownFolder knowFolderInterface;

         _knownFolderManager.GetFolder(knownFolderID, out knowFolderInterface);

         return new KnownFolder(knowFolderInterface);

      }

      public static KnownFolder GetKnownFolder(string canonicalName) {

        IKnownFolder knowFolderInterface;

         _knownFolderManager.GetFolderByName(canonicalName, out knowFolderInterface);

         return new KnownFolder(knowFolderInterface);

      }

      public static KnownFolder FindFolderFromPath(string path, KnownFolderFindMode mode) {

         IKnownFolder knowFolderInterface;

         _knownFolderManager.FindFolderFromPath(path, mode, out knowFolderInterface);

         return new KnownFolder(knowFolderInterface);

      }

      public static int GetCsidl(Guid knownFolderID) {

         int csidl;

         _knownFolderManager.FolderIdToCsidl(knownFolderID, out csidl);

         return csidl;

      }

      private static string GetPath(Guid knownFolderID) {

         IKnownFolder knowFolderInterface;

         _knownFolderManager.GetFolder(knownFolderID, out knowFolderInterface);

         return knowFolderInterface.GetPath(0);

      }

      public static Guid[] GetKnownFolderIdentifiers() {

         IntPtr buffer;

         UInt32 count = 0;

         _knownFolderManager.GetFolderIds(out buffer, out count);

         try {

            Guid[] folderIdentifiers = new Guid[count];

            IntPtr p = buffer;

            for(int i = 0; i < count; i++) {

               folderIdentifiers[i] = (Guid) Marshal.PtrToStructure(p, typeof(Guid));

               p = (IntPtr) ((int) p + Marshal.SizeOf(typeof(Guid)));

            }

            return folderIdentifiers;

         } finally {

            Marshal.FreeCoTaskMem(buffer);

         }

      }

      public static void RegisterFolder( Guid knownFolderGuid, KnownFolderDefinition knownFolderDefinition) {

         NativeKnownFolderDefinition nativeKnownFolderDefinition;

         nativeKnownFolderDefinition.pszName = IntPtr.Zero;

         nativeKnownFolderDefinition.pszDescription = IntPtr.Zero;

         nativeKnownFolderDefinition.pszRelativePath = IntPtr.Zero;

         nativeKnownFolderDefinition.pszParsingName = IntPtr.Zero;

         nativeKnownFolderDefinition.pszTooltip = IntPtr.Zero;

         nativeKnownFolderDefinition.pszLocalizedName = IntPtr.Zero;

         nativeKnownFolderDefinition.pszIcon = IntPtr.Zero;

         nativeKnownFolderDefinition.pszSecurity = IntPtr.Zero;

         try {

            nativeKnownFolderDefinition.Category = knownFolderDefinition.Category;

            nativeKnownFolderDefinition.pszName = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.Name);

            nativeKnownFolderDefinition.pszDescription = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.Description) ;

            nativeKnownFolderDefinition.ParentID = knownFolderDefinition.ParentID;

            nativeKnownFolderDefinition.pszRelativePath = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.RelativePath);

            nativeKnownFolderDefinition.pszParsingName = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.ParsingName);

            nativeKnownFolderDefinition.pszTooltip = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.Tooltip);

      nativeKnownFolderDefinition.pszLocalizedName = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.LocalizedName);

            nativeKnownFolderDefinition.pszIcon = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.Icon);

            nativeKnownFolderDefinition.pszSecurity = Marshal.StringToCoTaskMemAuto(knownFolderDefinition.Security);

            nativeKnownFolderDefinition.dwAttributes = (UInt32) knownFolderDefinition.Attributes;

            nativeKnownFolderDefinition.DefinitionFlags = knownFolderDefinition.DefinitionFlags;

            nativeKnownFolderDefinition.FolderTypeID = knownFolderDefinition.FolderTypeID;

            _knownFolderManager.RegisterFolder(knownFolderGuid, ref nativeKnownFolderDefinition);

         } finally {

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszDescription);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszRelativePath);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszParsingName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszTooltip);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszLocalizedName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszIcon);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszSecurity);

         }

      }

      public static void UnregisterFolder(Guid knownFolderGuid) {

         _knownFolderManager.UnregisterFolder(knownFolderGuid);

      }

      public static string Desktop { get { return GetPath(KnownFolderIdentifier.Desktop); } }

      public static string Fonts { get { return GetPath(KnownFolderIdentifier.Fonts); } }

      public static string Startup { get { return GetPath(KnownFolderIdentifier.Startup); } }

      public static string Programs { get { return GetPath(KnownFolderIdentifier.Programs); } }

      public static string StartMenu { get { return GetPath(KnownFolderIdentifier.StartMenu); } }

      public static string Recent { get { return GetPath(KnownFolderIdentifier.Recent); } }

      public static string SendTo { get { return GetPath(KnownFolderIdentifier.SendTo); } }

      public static string Documents { get { return GetPath(KnownFolderIdentifier.Documents); } }

      public static string Favorites { get { return GetPath(KnownFolderIdentifier.Favorites); } }

      public static string NetHood { get { return GetPath(KnownFolderIdentifier.NetHood); } }

      public static string PrintHood { get { return GetPath(KnownFolderIdentifier.PrintHood); } }

      public static string Templates { get { return GetPath(KnownFolderIdentifier.Templates); } }

      public static string CommonStartup { get { return GetPath(KnownFolderIdentifier.CommonStartup); } }

      public static string CommonPrograms { get { return GetPath(KnownFolderIdentifier.CommonPrograms); } }

      public static string CommonStartMenu { get { return GetPath(KnownFolderIdentifier.CommonStartMenu); } }

      public static string PublicDesktop { get { return GetPath(KnownFolderIdentifier.PublicDesktop); } }

      public static string ProgramData { get { return GetPath(KnownFolderIdentifier.ProgramData); } }

      public static string CommonTemplates { get { return GetPath(KnownFolderIdentifier.CommonTemplates); } }

      public static string PublicDocuments { get { return GetPath(KnownFolderIdentifier.PublicDocuments); } }

      public static string RoamingAppData { get { return GetPath(KnownFolderIdentifier.RoamingAppData); } }

      public static string LocalAppData { get { return GetPath(KnownFolderIdentifier.LocalAppData); } }

      public static string LocalAppDataLow { get { return GetPath(KnownFolderIdentifier.LocalAppDataLow); } }

      public static string InternetCache { get { return GetPath(KnownFolderIdentifier.InternetCache); } }

      public static string Cookies { get { return GetPath(KnownFolderIdentifier.Cookies); } }

      public static string History { get { return GetPath(KnownFolderIdentifier.History); } }

      public static string System { get { return GetPath(KnownFolderIdentifier.System); } }

      public static string SystemX86 { get { return GetPath(KnownFolderIdentifier.SystemX86); } }

      public static string Windows { get { return GetPath(KnownFolderIdentifier.Windows); } }

      public static string Profile { get { return GetPath(KnownFolderIdentifier.Profile); } }

      public static string Pictures { get { return GetPath(KnownFolderIdentifier.Pictures); } }

      public static string ProgramFilesX86 { get { return GetPath(KnownFolderIdentifier.ProgramFilesX86); } }

      public static string ProgramFilesCommonX86 { get { return GetPath(KnownFolderIdentifier.ProgramFilesCommonX86); } }

      public static string ProgramFilesX64 { get { return GetPath(KnownFolderIdentifier.ProgramFilesX64); } }

      public static string ProgramFilesCommonX64 { get { return GetPath(KnownFolderIdentifier.ProgramFilesCommonX64); } }

      public static string ProgramFiles { get { return GetPath(KnownFolderIdentifier.ProgramFiles); } }

  public static string ProgramFilesCommon { get { return GetPath(KnownFolderIdentifier.ProgramFilesCommon); } }

      public static string AdminTools { get { return GetPath(KnownFolderIdentifier.AdminTools); } }

      public static string CommonAdminTools { get { return GetPath(KnownFolderIdentifier.CommonAdminTools); } }

      public static string Music { get { return GetPath(KnownFolderIdentifier.Music); } }

      public static string Videos { get { return GetPath(KnownFolderIdentifier.Videos); } }

    public static string PublicPictures { get { return GetPath(KnownFolderIdentifier.PublicPictures); } }

      public static string PublicMusic { get { return GetPath(KnownFolderIdentifier.PublicMusic); } }

      public static string PublicVideos { get { return GetPath(KnownFolderIdentifier.PublicVideos); } }

      public static string ResourceDir { get { return GetPath(KnownFolderIdentifier.ResourceDir); } }

      public static string LocalizedResourcesDir { get { return GetPath(KnownFolderIdentifier.LocalizedResourcesDir); } }

      public static string CommonOEMLinks { get { return GetPath(KnownFolderIdentifier.CommonOEMLinks); } }

      public static string CDBurning { get { return GetPath(KnownFolderIdentifier.CDBurning); } }

      public static string UserProfiles { get { return GetPath(KnownFolderIdentifier.UserProfiles); } }

      public static string Public { get { return GetPath(KnownFolderIdentifier.Public); } }

      public static string Downloads { get { return GetPath(KnownFolderIdentifier.Downloads); } }

      public static string PublicDownloads { get { return GetPath(KnownFolderIdentifier.PublicDownloads); } }

      public static string SavedSearches { get { return GetPath(KnownFolderIdentifier.SavedSearches); } }

      public static string QuickLaunch { get { return GetPath(KnownFolderIdentifier.QuickLaunch); } }

      public static string Contacts { get { return GetPath(KnownFolderIdentifier.Contacts); } }

      public static string SidebarParts { get { return GetPath(KnownFolderIdentifier.SidebarParts); } }

      public static string SidebarDefaultParts { get { return GetPath(KnownFolderIdentifier.SidebarDefaultParts); } }

      public static string PublicGameTasks { get { return GetPath(KnownFolderIdentifier.PublicGameTasks); } }

      public static string GameTasks { get { return GetPath(KnownFolderIdentifier.GameTasks); } }

      public static string SavedGames { get { return GetPath(KnownFolderIdentifier.SavedGames); } }

      public static string Links { get { return GetPath(KnownFolderIdentifier.Links); } }

   }

   public class KnownFolderIdentifier {

      public static Guid Computer = new Guid(0x0AC0837C, 0xBBF8, 0x452A, 0x85, 0x0D, 0x79, 0xD0, 0x8E, 0x66, 0x7C, 0xA7);

      public static Guid Conflict = new Guid(0x4bfefb45, 0x347d, 0x4006, 0xa5, 0xbe, 0xac, 0x0c, 0xb0, 0x56, 0x71, 0x92);

      public static Guid ControlPanel = new Guid(0x82A74AEB, 0xAEB4, 0x465C, 0xA0, 0x14, 0xD0, 0x97, 0xEE, 0x34, 0x6D, 0x63);

      public static Guid Desktop = new Guid(0xB4BFCC3A, 0xDB2C, 0x424C, 0xB0, 0x29, 0x7F, 0xE9, 0x9A, 0x87, 0xC6, 0x41);

      public static Guid Internet = new Guid(0x4D9F7874, 0x4E0C, 0x4904, 0x96, 0x7B, 0x40, 0xB0, 0xD2, 0x0C, 0x3E, 0x4B);

      public static Guid Network = new Guid(0xD20BEEC4, 0x5CA8, 0x4905, 0xAE, 0x3B, 0xBF, 0x25, 0x1E, 0xA0, 0x9B, 0x53);

      public static Guid Printers = new Guid(0x76FC4E2D, 0xD6AD, 0x4519, 0xA6, 0x63, 0x37, 0xBD, 0x56, 0x06, 0x81, 0x85);

      public static Guid SyncManager = new Guid(0x43668BF8, 0xC14E, 0x49B2, 0x97, 0xC9, 0x74, 0x77, 0x84, 0xD7, 0x84, 0xB7);

      public static Guid Connections = new Guid(0x6F0CD92B, 0x2E97, 0x45D1, 0x88, 0xFF, 0xB0, 0xD1, 0x86, 0xB8, 0xDE, 0xDD);

      public static Guid SyncSetup = new Guid(0xf214138, 0xb1d3, 0x4a90, 0xbb, 0xa9, 0x27, 0xcb, 0xc0, 0xc5, 0x38, 0x9a);

      public static Guid SyncResults = new Guid(0x289a9a43, 0xbe44, 0x4057, 0xa4, 0x1b, 0x58, 0x7a, 0x76, 0xd7, 0xe7, 0xf9);

      public static Guid RecycleBin = new Guid(0xB7534046, 0x3ECB, 0x4C18, 0xBE, 0x4E, 0x64, 0xCD, 0x4C, 0xB7, 0xD6, 0xAC);

      public static Guid Fonts = new Guid(0xFD228CB7, 0xAE11, 0x4AE3, 0x86, 0x4C, 0x16, 0xF3, 0x91, 0x0A, 0xB8, 0xFE);

      public static Guid Startup = new Guid(0xB97D20BB, 0xF46A, 0x4C97, 0xBA, 0x10, 0x5E, 0x36, 0x08, 0x43, 0x08, 0x54);

      public static Guid Programs = new Guid(0xA77F5D77, 0x2E2B, 0x44C3, 0xA6, 0xA2, 0xAB, 0xA6, 0x01, 0x05, 0x4A, 0x51);

      public static Guid StartMenu = new Guid(0x625B53C3, 0xAB48, 0x4EC1, 0xBA, 0x1F, 0xA1, 0xEF, 0x41, 0x46, 0xFC, 0x19);

      public static Guid Recent = new Guid(0xAE50C081, 0xEBD2, 0x438A, 0x86, 0x55, 0x8A, 0x09, 0x2E, 0x34, 0x98, 0x7A);

      public static Guid SendTo = new Guid(0x8983036C, 0x27C0, 0x404B, 0x8F, 0x08, 0x10, 0x2D, 0x10, 0xDC, 0xFD, 0x74);

      public static Guid Documents = new Guid(0xFDD39AD0, 0x238F, 0x46AF, 0xAD, 0xB4, 0x6C, 0x85, 0x48, 0x03, 0x69, 0xC7);

      public static Guid Favorites = new Guid(0x1777F761, 0x68AD, 0x4D8A, 0x87, 0xBD, 0x30, 0xB7, 0x59, 0xFA, 0x33, 0xDD);

      public static Guid NetHood = new Guid(0xC5ABBF53, 0xE17F, 0x4121, 0x89, 0x00, 0x86, 0x62, 0x6F, 0xC2, 0xC9, 0x73);

      public static Guid PrintHood = new Guid(0x9274BD8D, 0xCFD1, 0x41C3, 0xB3, 0x5E, 0xB1, 0x3F, 0x55, 0xA7, 0x58, 0xF4);

      public static Guid Templates = new Guid(0xA63293E8, 0x664E, 0x48DB, 0xA0, 0x79, 0xDF, 0x75, 0x9E, 0x05, 0x09, 0xF7);

      public static Guid CommonStartup = new Guid(0x82A5EA35, 0xD9CD, 0x47C5, 0x96, 0x29, 0xE1, 0x5D, 0x2F, 0x71, 0x4E, 0x6E);

      public static Guid CommonPrograms = new Guid(0x0139D44E, 0x6AFE, 0x49F2, 0x86, 0x90, 0x3D, 0xAF, 0xCA, 0xE6, 0xFF, 0xB8);

      public static Guid CommonStartMenu = new Guid(0xA4115719, 0xD62E, 0x491D, 0xAA, 0x7C, 0xE7, 0x4B, 0x8B, 0xE3, 0xB0, 0x67);

      public static Guid PublicDesktop = new Guid(0xC4AA340D, 0xF20F, 0x4863, 0xAF, 0xEF, 0xF8, 0x7E, 0xF2, 0xE6, 0xBA, 0x25);

      public static Guid ProgramData = new Guid(0x62AB5D82, 0xFDC1, 0x4DC3, 0xA9, 0xDD, 0x07, 0x0D, 0x1D, 0x49, 0x5D, 0x97);

      public static Guid CommonTemplates = new Guid(0xB94237E7, 0x57AC, 0x4347, 0x91, 0x51, 0xB0, 0x8C, 0x6C, 0x32, 0xD1, 0xF7);

      public static Guid PublicDocuments = new Guid(0xED4824AF, 0xDCE4, 0x45A8, 0x81, 0xE2, 0xFC, 0x79, 0x65, 0x08, 0x36, 0x34);

      public static Guid RoamingAppData = new Guid(0x3EB685DB, 0x65F9, 0x4CF6, 0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D);

      public static Guid LocalAppData = new Guid(0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91);

      public static Guid LocalAppDataLow = new Guid(0xA520A1A4, 0x1780, 0x4FF6, 0xBD, 0x18, 0x16, 0x73, 0x43, 0xC5, 0xAF, 0x16);

      public static Guid InternetCache = new Guid(0x352481E8, 0x33BE, 0x4251, 0xBA, 0x85, 0x60, 0x07, 0xCA, 0xED, 0xCF, 0x9D);

      public static Guid Cookies = new Guid(0x2B0F765D, 0xC0E9, 0x4171, 0x90, 0x8E, 0x08, 0xA6, 0x11, 0xB8, 0x4F, 0xF6);

      public static Guid History = new Guid(0xD9DC8A3B, 0xB784, 0x432E, 0xA7, 0x81, 0x5A, 0x11, 0x30, 0xA7, 0x59, 0x63);

      public static Guid System = new Guid(0x1AC14E77, 0x02E7, 0x4E5D, 0xB7, 0x44, 0x2E, 0xB1, 0xAE, 0x51, 0x98, 0xB7);

      public static Guid SystemX86 = new Guid(0xD65231B0, 0xB2F1, 0x4857, 0xA4, 0xCE, 0xA8, 0xE7, 0xC6, 0xEA, 0x7D, 0x27);

      public static Guid Windows = new Guid(0xF38BF404, 0x1D43, 0x42F2, 0x93, 0x05, 0x67, 0xDE, 0x0B, 0x28, 0xFC, 0x23);

      public static Guid Profile = new Guid(0x5E6C858F, 0x0E22, 0x4760, 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73);

      public static Guid Pictures = new Guid(0x33E28130, 0x4E1E, 0x4676, 0x83, 0x5A, 0x98, 0x39, 0x5C, 0x3B, 0xC3, 0xBB);

      public static Guid ProgramFilesX86 = new Guid(0x7C5A40EF, 0xA0FB, 0x4BFC, 0x87, 0x4A, 0xC0, 0xF2, 0xE0, 0xB9, 0xFA, 0x8E);

      public static Guid ProgramFilesCommonX86 = new Guid(0xDE974D24, 0xD9C6, 0x4D3E, 0xBF, 0x91, 0xF4, 0x45, 0x51, 0x20, 0xB9, 0x17);

      public static Guid ProgramFilesX64 = new Guid(0x6d809377, 0x6af0, 0x444b, 0x89, 0x57, 0xa3, 0x77, 0x3f, 0x02, 0x20, 0x0e);

      public static Guid ProgramFilesCommonX64 = new Guid(0x6365d5a7, 0xf0d, 0x45e5, 0x87, 0xf6, 0xd, 0xa5, 0x6b, 0x6a, 0x4f, 0x7d);

      public static Guid ProgramFiles = new Guid(0x905e63b6, 0xc1bf, 0x494e, 0xb2, 0x9c, 0x65, 0xb7, 0x32, 0xd3, 0xd2, 0x1a);

      public static Guid ProgramFilesCommon = new Guid(0xF7F1ED05, 0x9F6D, 0x47A2, 0xAA, 0xAE, 0x29, 0xD3, 0x17, 0xC6, 0xF0, 0x66);

      public static Guid AdminTools = new Guid(0x724EF170, 0xA42D, 0x4FEF, 0x9F, 0x26, 0xB6, 0x0E, 0x84, 0x6F, 0xBA, 0x4F);

      public static Guid CommonAdminTools = new Guid(0xD0384E7D, 0xBAC3, 0x4797, 0x8F, 0x14, 0xCB, 0xA2, 0x29, 0xB3, 0x92, 0xB5);

      public static Guid Music = new Guid(0x4BD8D571, 0x6D19, 0x48D3, 0xBE, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0E, 0x43);

      public static Guid Videos = new Guid(0x18989B1D, 0x99B5, 0x455B, 0x84, 0x1C, 0xAB, 0x7C, 0x74, 0xE4, 0xDD, 0xFC);

      public static Guid PublicPictures = new Guid(0xB6EBFB86, 0x6907, 0x413C, 0x9A, 0xF7, 0x4F, 0xC2, 0xAB, 0xF0, 0x7C, 0xC5);

      public static Guid PublicMusic = new Guid(0x3214FAB5, 0x9757, 0x4298, 0xBB, 0x61, 0x92, 0xA9, 0xDE, 0xAA, 0x44, 0xFF);

      public static Guid PublicVideos = new Guid(0x2400183A, 0x6185, 0x49FB, 0xA2, 0xD8, 0x4A, 0x39, 0x2A, 0x60, 0x2B, 0xA3);

      public static Guid ResourceDir = new Guid(0x8AD10C31, 0x2ADB, 0x4296, 0xA8, 0xF7, 0xE4, 0x70, 0x12, 0x32, 0xC9, 0x72);

      public static Guid LocalizedResourcesDir = new Guid(0x2A00375E, 0x224C, 0x49DE, 0xB8, 0xD1, 0x44, 0x0D, 0xF7, 0xEF, 0x3D, 0xDC);

      public static Guid CommonOEMLinks = new Guid(0xC1BAE2D0, 0x10DF, 0x4334, 0xBE, 0xDD, 0x7A, 0xA2, 0x0B, 0x22, 0x7A, 0x9D);

      public static Guid CDBurning = new Guid(0x9E52AB10, 0xF80D, 0x49DF, 0xAC, 0xB8, 0x43, 0x30, 0xF5, 0x68, 0x78, 0x55);

      public static Guid UserProfiles = new Guid(0x0762D272, 0xC50A, 0x4BB0, 0xA3, 0x82, 0x69, 0x7D, 0xCD, 0x72, 0x9B, 0x80);

      public static Guid Playlists = new Guid(0xDE92C1C7, 0x837F, 0x4F69, 0xA3, 0xBB, 0x86, 0xE6, 0x31, 0x20, 0x4A, 0x23);

      public static Guid SamplePlaylists = new Guid(0x15CA69B3, 0x30EE, 0x49C1, 0xAC, 0xE1, 0x6B, 0x5E, 0xC3, 0x72, 0xAF, 0xB5);

      public static Guid SampleMusic = new Guid(0xB250C668, 0xF57D, 0x4EE1, 0xA6, 0x3C, 0x29, 0x0E, 0xE7, 0xD1, 0xAA, 0x1F);

      public static Guid SamplePictures = new Guid(0xC4900540, 0x2379, 0x4C75, 0x84, 0x4B, 0x64, 0xE6, 0xFA, 0xF8, 0x71, 0x6B);

      public static Guid SampleVideos = new Guid(0x859EAD94, 0x2E85, 0x48AD, 0xA7, 0x1A, 0x09, 0x69, 0xCB, 0x56, 0xA6, 0xCD);

      public static Guid PhotoAlbums = new Guid(0x69D2CF90, 0xFC33, 0x4FB7, 0x9A, 0x0C, 0xEB, 0xB0, 0xF0, 0xFC, 0xB4, 0x3C);

      public static Guid Public = new Guid(0xDFDF76A2, 0xC82A, 0x4D63, 0x90, 0x6A, 0x56, 0x44, 0xAC, 0x45, 0x73, 0x85);

      public static Guid ChangeRemovePrograms = new Guid(0xdf7266ac, 0x9274, 0x4867, 0x8d, 0x55, 0x3b, 0xd6, 0x61, 0xde, 0x87, 0x2d);

      public static Guid AppUpdates = new Guid(0xa305ce99, 0xf527, 0x492b, 0x8b, 0x1a, 0x7e, 0x76, 0xfa, 0x98, 0xd6, 0xe4);

      public static Guid AddNewPrograms = new Guid(0xde61d971, 0x5ebc, 0x4f02, 0xa3, 0xa9, 0x6c, 0x82, 0x89, 0x5e, 0x5c, 0x04);

      public static Guid Downloads = new Guid(0x374de290, 0x123f, 0x4565, 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b);

      public static Guid PublicDownloads = new Guid(0x3d644c9b, 0x1fb8, 0x4f30, 0x9b, 0x45, 0xf6, 0x70, 0x23, 0x5f, 0x79, 0xc0);

      public static Guid SavedSearches = new Guid(0x7d1d3a04, 0xdebb, 0x4115, 0x95, 0xcf, 0x2f, 0x29, 0xda, 0x29, 0x20, 0xda);

      public static Guid QuickLaunch = new Guid(0x52a4f021, 0x7b75, 0x48a9, 0x9f, 0x6b, 0x4b, 0x87, 0xa2, 0x10, 0xbc, 0x8f);

      public static Guid Contacts = new Guid(0x56784854, 0xc6cb, 0x462b, 0x81, 0x69, 0x88, 0xe3, 0x50, 0xac, 0xb8, 0x82);

      public static Guid SidebarParts = new Guid(0xa75d362e, 0x50fc, 0x4fb7, 0xac, 0x2c, 0xa8, 0xbe, 0xaa, 0x31, 0x44, 0x93);

      public static Guid SidebarDefaultParts = new Guid(0x7b396e54, 0x9ec5, 0x4300, 0xbe, 0xa, 0x24, 0x82, 0xeb, 0xae, 0x1a, 0x26);

      public static Guid TreeProperties = new Guid(0x5b3749ad, 0xb49f, 0x49c1, 0x83, 0xeb, 0x15, 0x37, 0x0f, 0xbd, 0x48, 0x82);

      public static Guid PublicGameTasks = new Guid(0xdebf2536, 0xe1a8, 0x4c59, 0xb6, 0xa2, 0x41, 0x45, 0x86, 0x47, 0x6a, 0xea);

      public static Guid GameTasks = new Guid(0x54fae61, 0x4dd8, 0x4787, 0x80, 0xb6, 0x9, 0x2, 0x20, 0xc4, 0xb7, 0x0);

      public static Guid SavedGames = new Guid(0x4c5c32ff, 0xbb9d, 0x43b0, 0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4);

      public static Guid Games = new Guid(0xcac52c1a, 0xb53d, 0x4edc, 0x92, 0xd7, 0x6b, 0x2e, 0x8a, 0xc1, 0x94, 0x34);

      public static Guid RecordedTV = new Guid(0xbd85e001, 0x112e, 0x431e, 0x98, 0x3b, 0x7b, 0x15, 0xac, 0x09, 0xff, 0xf1);

      public static Guid SearchMapi = new Guid(0x98ec0e18, 0x2098, 0x4d44, 0x86, 0x44, 0x66, 0x97, 0x93, 0x15, 0xa2, 0x81);

      public static Guid SearchCsc = new Guid(0xee32e446, 0x31ca, 0x4aba, 0x81, 0x4f, 0xa5, 0xeb, 0xd2, 0xfd, 0x6d, 0x5e);

      public static Guid Links = new Guid(0xbfb9d5e0, 0xc6a9, 0x404c, 0xb2, 0xb2, 0xae, 0x6d, 0xb6, 0xaf, 0x49, 0x68);

      public static Guid UsersFiles = new Guid(0xf3ce0f7c, 0x4901, 0x4acc, 0x86, 0x48, 0xd5, 0xd4, 0x4b, 0x04, 0xef, 0x8f);

      public static Guid SearchHome = new Guid(0x190337d1, 0xb8ca, 0x4121, 0xa6, 0x39, 0x6d, 0x47, 0x2d, 0x16, 0x97, 0x2a);

      public static Guid OriginalImages = new Guid(0x2C36C0AA, 0x5812, 0x4b87, 0xbf, 0xd0, 0x4c, 0xd0, 0xdf, 0xb1, 0x9b, 0x39);

   }

   public struct KnownFolderDefinition {

      public KnownFolderCategory Category;

      public string Name;

      public string Description;

      public Guid ParentID;

  public string RelativePath;

      public string ParsingName;

      public string Tooltip;

      public string LocalizedName;

      public string Icon;

      public string Security;

      public System.IO.FileAttributes Attributes;

      public KnownFolderDefinitionFlags DefinitionFlags;

      public Guid FolderTypeID;

   }

   public class KnownFolder {

      IKnownFolder _knownFolder = null;

      internal KnownFolder(IKnownFolder knownFolder) {

         _knownFolder = knownFolder;

      }

      public string Path {

         get { return GetPath(0); }

         set { SetPath(value, 0); }

      }

      public string GetPath(KnownFolderRetrievalOptions options) {

         return _knownFolder.GetPath(options);

      }

      public void SetPath(string path, KnownFolderRetrievalOptions options) {

         _knownFolder.SetPath(options, path);

      }

      public Guid Id {

         get {

            return _knownFolder.GetId();

         }

      }

      public Guid FolderType {

         get {

         return _knownFolder.GetFolderType();

         }

      }

      public KnownFolderCategory Category {

         get {

            return _knownFolder.GetCategory();

         }

      }

      public KnownFolderRedirectionCapabilities RedirectionCapabilities {

         get {

            return _knownFolder.GetRedirectionCapabilities();

         }

      }

      // This is not a small operation so let's make it a method

      public KnownFolderDefinition GetDefinition() {

         NativeKnownFolderDefinition nativeKnownFolderDefinition;

         KnownFolderDefinition definition = new KnownFolderDefinition();

         _knownFolder.GetFolderDefinition(out nativeKnownFolderDefinition);

         try {

            definition.Category = nativeKnownFolderDefinition.Category;

            definition.Name = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszName);

            definition.Description = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszDescription);

            definition.ParentID = nativeKnownFolderDefinition.ParentID;

            definition.RelativePath = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszRelativePath);

            definition.ParsingName = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszParsingName);

            definition.Tooltip = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszTooltip);

            definition.LocalizedName = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszLocalizedName);

            definition.Icon = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszIcon);

            definition.Security = Marshal.PtrToStringUni(nativeKnownFolderDefinition.pszSecurity);

            definition.Attributes = (System.IO.FileAttributes) nativeKnownFolderDefinition.dwAttributes;

            definition.DefinitionFlags = nativeKnownFolderDefinition.DefinitionFlags;

            definition.FolderTypeID = nativeKnownFolderDefinition.FolderTypeID;

         } finally {

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszDescription);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszRelativePath);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszParsingName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszTooltip);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszLocalizedName);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszIcon);

            Marshal.FreeCoTaskMem(nativeKnownFolderDefinition.pszSecurity);

         }

         return definition;

      }

   }

}

 

KnownFolders.zip