/*
 * Unit tests for shell32 SHGet{Special}Folder{Path|Location} functions.
 *
 * Copyright 2004 Juan Lang
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 * This is a test program for the SHGet{Special}Folder{Path|Location} functions
 * of shell32, that get either a filesystem path or a LPITEMIDLIST (shell
 * namespace) path for a given folder (CSIDL value).
 */

#define COBJMACROS

#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "shlguid.h"
#include "shlobj.h"
#include "shlwapi.h"
#include "knownfolders.h"
#include "shellapi.h"
#include "wine/test.h"

#include "initguid.h"

/* CSIDL_MYDOCUMENTS is now the same as CSIDL_PERSONAL, but what we want
 * here is its original value.
 */
#define OLD_CSIDL_MYDOCUMENTS  0x000c

DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) ( sizeof(x) / sizeof((x)[0]) )
#endif

/* from pidl.h, not included here: */
#ifndef PT_CPL             /* Guess, Win7 uses this for CSIDL_CONTROLS */
#define PT_CPL        0x01 /* no path */
#endif
#ifndef PT_GUID
#define PT_GUID       0x1f /* no path */
#endif
#ifndef PT_DRIVE 
#define PT_DRIVE      0x23 /* has path */
#endif
#ifndef PT_DRIVE2
#define PT_DRIVE2     0x25 /* has path */
#endif
#ifndef PT_SHELLEXT
#define PT_SHELLEXT   0x2e /* no path */
#endif
#ifndef PT_FOLDER
#define PT_FOLDER     0x31 /* has path */
#endif
#ifndef PT_FOLDERW
#define PT_FOLDERW    0x35 /* has path */
#endif
#ifndef PT_WORKGRP
#define PT_WORKGRP    0x41 /* no path */
#endif
#ifndef PT_YAGUID
#define PT_YAGUID     0x70 /* no path */
#endif
/* FIXME: this is used for history/favorites folders; what's a better name? */
#ifndef PT_IESPECIAL2
#define PT_IESPECIAL2 0xb1 /* has path */
#endif

static GUID CLSID_CommonDocuments = { 0x0000000c, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x1a } };

struct shellExpectedValues {
    int folder;
    int numTypes;
    const BYTE *types;
};

static HRESULT (WINAPI *pDllGetVersion)(DLLVERSIONINFO *);
static HRESULT (WINAPI *pSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
static HRESULT (WINAPI *pSHGetFolderLocation)(HWND, int, HANDLE, DWORD,
 LPITEMIDLIST *);
static BOOL    (WINAPI *pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL);
static HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *);
static LPITEMIDLIST (WINAPI *pILFindLastID)(LPCITEMIDLIST);
static int (WINAPI *pSHFileOperationA)(LPSHFILEOPSTRUCTA);
static HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *);
static UINT (WINAPI *pGetSystemWow64DirectoryA)(LPSTR,UINT);
static HRESULT (WINAPI *pSHGetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR *);
static HRESULT (WINAPI *pSHSetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR);
static HRESULT (WINAPI *pSHGetFolderPathEx)(REFKNOWNFOLDERID, DWORD, HANDLE, LPWSTR, DWORD);
static BOOL (WINAPI *pPathYetAnotherMakeUniqueName)(PWSTR, PCWSTR, PCWSTR, PCWSTR);
static HRESULT (WINAPI *pSHGetKnownFolderIDList)(REFKNOWNFOLDERID, DWORD, HANDLE, PIDLIST_ABSOLUTE*);

static DLLVERSIONINFO shellVersion = { 0 };
static LPMALLOC pMalloc;
static const BYTE guidType[] = { PT_GUID };
static const BYTE controlPanelType[] = { PT_SHELLEXT, PT_GUID, PT_CPL };
static const BYTE folderType[] = { PT_FOLDER, PT_FOLDERW };
static const BYTE favoritesType[] = { PT_FOLDER, PT_FOLDERW, 0, PT_IESPECIAL2 /* Win98 */ };
static const BYTE folderOrSpecialType[] = { PT_FOLDER, PT_IESPECIAL2 };
static const BYTE personalType[] = { PT_FOLDER, PT_GUID, PT_DRIVE, 0xff /* Win9x */,
 PT_IESPECIAL2 /* Win98 */, 0 /* Vista */, PT_SHELLEXT /* win8 */ };
/* FIXME: don't know the type of 0x71 returned by Vista/2008 for printers */
static const BYTE printersType[] = { PT_YAGUID, PT_SHELLEXT, 0x71 };
static const BYTE ieSpecialType[] = { PT_IESPECIAL2 };
static const BYTE shellExtType[] = { PT_SHELLEXT };
static const BYTE workgroupType[] = { PT_WORKGRP };
#define DECLARE_TYPE(x, y) { x, sizeof(y) / sizeof(y[0]), y }
static const struct shellExpectedValues requiredShellValues[] = {
 DECLARE_TYPE(CSIDL_BITBUCKET, guidType),
 DECLARE_TYPE(CSIDL_CONTROLS, controlPanelType),
 DECLARE_TYPE(CSIDL_COOKIES, folderType),
 DECLARE_TYPE(CSIDL_DESKTOPDIRECTORY, folderType),
 DECLARE_TYPE(CSIDL_DRIVES, guidType),
 DECLARE_TYPE(CSIDL_FAVORITES, favoritesType),
 DECLARE_TYPE(CSIDL_FONTS, folderOrSpecialType),
/* FIXME: the following fails in Wine, returns type PT_FOLDER
 DECLARE_TYPE(CSIDL_HISTORY, ieSpecialType),
 */
 DECLARE_TYPE(CSIDL_INTERNET, guidType),
 DECLARE_TYPE(CSIDL_NETHOOD, folderType),
 DECLARE_TYPE(CSIDL_NETWORK, guidType),
 DECLARE_TYPE(CSIDL_PERSONAL, personalType),
 DECLARE_TYPE(CSIDL_PRINTERS, printersType),
 DECLARE_TYPE(CSIDL_PRINTHOOD, folderType),
 DECLARE_TYPE(CSIDL_PROGRAMS, folderType),
 DECLARE_TYPE(CSIDL_RECENT, folderOrSpecialType),
 DECLARE_TYPE(CSIDL_SENDTO, folderType),
 DECLARE_TYPE(CSIDL_STARTMENU, folderType),
 DECLARE_TYPE(CSIDL_STARTUP, folderType),
 DECLARE_TYPE(CSIDL_TEMPLATES, folderType),
};
static const struct shellExpectedValues optionalShellValues[] = {
/* FIXME: the following only semi-succeed; they return NULL PIDLs on XP.. hmm.
 DECLARE_TYPE(CSIDL_ALTSTARTUP, folderType),
 DECLARE_TYPE(CSIDL_COMMON_ALTSTARTUP, folderType),
 DECLARE_TYPE(CSIDL_COMMON_OEM_LINKS, folderType),
 */
/* Windows NT-only: */
 DECLARE_TYPE(CSIDL_COMMON_DESKTOPDIRECTORY, folderType),
 DECLARE_TYPE(CSIDL_COMMON_DOCUMENTS, shellExtType),
 DECLARE_TYPE(CSIDL_COMMON_FAVORITES, folderType),
 DECLARE_TYPE(CSIDL_COMMON_PROGRAMS, folderType),
 DECLARE_TYPE(CSIDL_COMMON_STARTMENU, folderType),
 DECLARE_TYPE(CSIDL_COMMON_STARTUP, folderType),
 DECLARE_TYPE(CSIDL_COMMON_TEMPLATES, folderType),
/* first appearing in shell32 version 4.71: */
 DECLARE_TYPE(CSIDL_APPDATA, folderType),
/* first appearing in shell32 version 4.72: */
 DECLARE_TYPE(CSIDL_INTERNET_CACHE, ieSpecialType),
/* first appearing in shell32 version 5.0: */
 DECLARE_TYPE(CSIDL_ADMINTOOLS, folderType),
 DECLARE_TYPE(CSIDL_COMMON_APPDATA, folderType),
 DECLARE_TYPE(CSIDL_LOCAL_APPDATA, folderType),
 DECLARE_TYPE(OLD_CSIDL_MYDOCUMENTS, folderType),
 DECLARE_TYPE(CSIDL_MYMUSIC, folderType),
 DECLARE_TYPE(CSIDL_MYPICTURES, folderType),
 DECLARE_TYPE(CSIDL_MYVIDEO, folderType),
 DECLARE_TYPE(CSIDL_PROFILE, folderType),
 DECLARE_TYPE(CSIDL_PROGRAM_FILES, folderType),
 DECLARE_TYPE(CSIDL_PROGRAM_FILESX86, folderType),
 DECLARE_TYPE(CSIDL_PROGRAM_FILES_COMMON, folderType),
 DECLARE_TYPE(CSIDL_PROGRAM_FILES_COMMONX86, folderType),
 DECLARE_TYPE(CSIDL_SYSTEM, folderType),
 DECLARE_TYPE(CSIDL_WINDOWS, folderType),
/* first appearing in shell32 6.0: */
 DECLARE_TYPE(CSIDL_CDBURN_AREA, folderType),
 DECLARE_TYPE(CSIDL_COMMON_MUSIC, folderType),
 DECLARE_TYPE(CSIDL_COMMON_PICTURES, folderType),
 DECLARE_TYPE(CSIDL_COMMON_VIDEO, folderType),
 DECLARE_TYPE(CSIDL_COMPUTERSNEARME, workgroupType),
 DECLARE_TYPE(CSIDL_RESOURCES, folderType),
 DECLARE_TYPE(CSIDL_RESOURCES_LOCALIZED, folderType),
};
#undef DECLARE_TYPE

static void loadShell32(void)
{
    HMODULE hShell32 = GetModuleHandleA("shell32");

#define GET_PROC(func) \
    p ## func = (void*)GetProcAddress(hShell32, #func); \
    if(!p ## func) \
      trace("GetProcAddress(%s) failed\n", #func);

    GET_PROC(DllGetVersion)
    GET_PROC(SHGetFolderPathA)
    GET_PROC(SHGetFolderPathEx)
    GET_PROC(SHGetFolderLocation)
    GET_PROC(SHGetKnownFolderPath)
    GET_PROC(SHSetKnownFolderPath)
    GET_PROC(SHGetSpecialFolderPathA)
    GET_PROC(SHGetSpecialFolderLocation)
    GET_PROC(ILFindLastID)
    if (!pILFindLastID)
        pILFindLastID = (void *)GetProcAddress(hShell32, (LPCSTR)16);
    GET_PROC(SHFileOperationA)
    GET_PROC(SHGetMalloc)
    GET_PROC(PathYetAnotherMakeUniqueName)
    GET_PROC(SHGetKnownFolderIDList)

    ok(pSHGetMalloc != NULL, "shell32 is missing SHGetMalloc\n");
    if (pSHGetMalloc)
    {
        HRESULT hr = pSHGetMalloc(&pMalloc);

        ok(hr == S_OK, "SHGetMalloc failed: 0x%08x\n", hr);
        ok(pMalloc != NULL, "SHGetMalloc returned a NULL IMalloc\n");
    }

    if (pDllGetVersion)
    {
        shellVersion.cbSize = sizeof(shellVersion);
        pDllGetVersion(&shellVersion);
        trace("shell32 version is %d.%d\n",
              shellVersion.dwMajorVersion, shellVersion.dwMinorVersion);
    }
#undef GET_PROC
}

#ifndef CSIDL_PROFILES
#define CSIDL_PROFILES		0x003e
#endif

/* A couple utility printing functions */
static const char *getFolderName(int folder)
{
    static char unknown[32];

#define CSIDL_TO_STR(x) case x: return#x;
    switch (folder)
    {
    CSIDL_TO_STR(CSIDL_DESKTOP);
    CSIDL_TO_STR(CSIDL_INTERNET);
    CSIDL_TO_STR(CSIDL_PROGRAMS);
    CSIDL_TO_STR(CSIDL_CONTROLS);
    CSIDL_TO_STR(CSIDL_PRINTERS);
    CSIDL_TO_STR(CSIDL_PERSONAL);
    CSIDL_TO_STR(CSIDL_FAVORITES);
    CSIDL_TO_STR(CSIDL_STARTUP);
    CSIDL_TO_STR(CSIDL_RECENT);
    CSIDL_TO_STR(CSIDL_SENDTO);
    CSIDL_TO_STR(CSIDL_BITBUCKET);
    CSIDL_TO_STR(CSIDL_STARTMENU);
    CSIDL_TO_STR(OLD_CSIDL_MYDOCUMENTS);
    CSIDL_TO_STR(CSIDL_MYMUSIC);
    CSIDL_TO_STR(CSIDL_MYVIDEO);
    CSIDL_TO_STR(CSIDL_DESKTOPDIRECTORY);
    CSIDL_TO_STR(CSIDL_DRIVES);
    CSIDL_TO_STR(CSIDL_NETWORK);
    CSIDL_TO_STR(CSIDL_NETHOOD);
    CSIDL_TO_STR(CSIDL_FONTS);
    CSIDL_TO_STR(CSIDL_TEMPLATES);
    CSIDL_TO_STR(CSIDL_COMMON_STARTMENU);
    CSIDL_TO_STR(CSIDL_COMMON_PROGRAMS);
    CSIDL_TO_STR(CSIDL_COMMON_STARTUP);
    CSIDL_TO_STR(CSIDL_COMMON_DESKTOPDIRECTORY);
    CSIDL_TO_STR(CSIDL_APPDATA);
    CSIDL_TO_STR(CSIDL_PRINTHOOD);
    CSIDL_TO_STR(CSIDL_LOCAL_APPDATA);
    CSIDL_TO_STR(CSIDL_ALTSTARTUP);
    CSIDL_TO_STR(CSIDL_COMMON_ALTSTARTUP);
    CSIDL_TO_STR(CSIDL_COMMON_FAVORITES);
    CSIDL_TO_STR(CSIDL_INTERNET_CACHE);
    CSIDL_TO_STR(CSIDL_COOKIES);
    CSIDL_TO_STR(CSIDL_HISTORY);
    CSIDL_TO_STR(CSIDL_COMMON_APPDATA);
    CSIDL_TO_STR(CSIDL_WINDOWS);
    CSIDL_TO_STR(CSIDL_SYSTEM);
    CSIDL_TO_STR(CSIDL_PROGRAM_FILES);
    CSIDL_TO_STR(CSIDL_MYPICTURES);
    CSIDL_TO_STR(CSIDL_PROFILE);
    CSIDL_TO_STR(CSIDL_SYSTEMX86);
    CSIDL_TO_STR(CSIDL_PROGRAM_FILESX86);
    CSIDL_TO_STR(CSIDL_PROGRAM_FILES_COMMON);
    CSIDL_TO_STR(CSIDL_PROGRAM_FILES_COMMONX86);
    CSIDL_TO_STR(CSIDL_COMMON_TEMPLATES);
    CSIDL_TO_STR(CSIDL_COMMON_DOCUMENTS);
    CSIDL_TO_STR(CSIDL_COMMON_ADMINTOOLS);
    CSIDL_TO_STR(CSIDL_ADMINTOOLS);
    CSIDL_TO_STR(CSIDL_CONNECTIONS);
    CSIDL_TO_STR(CSIDL_PROFILES);
    CSIDL_TO_STR(CSIDL_COMMON_MUSIC);
    CSIDL_TO_STR(CSIDL_COMMON_PICTURES);
    CSIDL_TO_STR(CSIDL_COMMON_VIDEO);
    CSIDL_TO_STR(CSIDL_RESOURCES);
    CSIDL_TO_STR(CSIDL_RESOURCES_LOCALIZED);
    CSIDL_TO_STR(CSIDL_COMMON_OEM_LINKS);
    CSIDL_TO_STR(CSIDL_CDBURN_AREA);
    CSIDL_TO_STR(CSIDL_COMPUTERSNEARME);
#undef CSIDL_TO_STR
    default:
        sprintf(unknown, "unknown (0x%04x)", folder);
        return unknown;
    }
}

static void test_parameters(void)
{
    LPITEMIDLIST pidl = NULL;
    char path[MAX_PATH];
    HRESULT hr;

    if (pSHGetFolderLocation)
    {
        /* check a bogus CSIDL: */
        pidl = NULL;
        hr = pSHGetFolderLocation(NULL, 0xeeee, NULL, 0, &pidl);
        ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr);
        if (hr == S_OK) IMalloc_Free(pMalloc, pidl);

        /* check a bogus user token: */
        pidl = NULL;
        hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, (HANDLE)2, 0, &pidl);
        ok(hr == E_FAIL || hr == E_HANDLE, "got 0x%08x, expected E_FAIL or E_HANDLE\n", hr);
        if (hr == S_OK) IMalloc_Free(pMalloc, pidl);

        /* a NULL pidl pointer crashes, so don't test it */
    }

    if (pSHGetSpecialFolderLocation)
    {
        if (0)
            /* crashes */
            SHGetSpecialFolderLocation(NULL, 0, NULL);

        hr = pSHGetSpecialFolderLocation(NULL, 0xeeee, &pidl);
        ok(hr == E_INVALIDARG, "got returned 0x%08x\n", hr);
    }

    if (pSHGetFolderPathA)
    {
        /* expect 2's a bogus handle, especially since we didn't open it */
        hr = pSHGetFolderPathA(NULL, CSIDL_DESKTOP, (HANDLE)2, SHGFP_TYPE_DEFAULT, path);
        ok(hr == E_FAIL || hr == E_HANDLE || /* Vista and 2k8 */
           broken(hr == S_OK), /* W2k and Me */ "got 0x%08x, expected E_FAIL\n", hr);

        hr = pSHGetFolderPathA(NULL, 0xeeee, NULL, SHGFP_TYPE_DEFAULT, path);
        ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr);
    }

    if (pSHGetSpecialFolderPathA)
    {
        BOOL ret;

        if (0)
           pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE);

        /* odd but true: calling with a NULL path still succeeds if it's a real
         * dir (on some windows platform).  on winME it generates exception.
         */
        ret = pSHGetSpecialFolderPathA(NULL, path, CSIDL_PROGRAMS, FALSE);
        ok(ret, "got %d\n", ret);

        ret = pSHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE);
        ok(!ret, "got %d\n", ret);
    }
}

/* Returns the folder's PIDL type, or 0xff if one can't be found. */
static BYTE testSHGetFolderLocation(int folder)
{
    LPITEMIDLIST pidl;
    HRESULT hr;
    BYTE ret = 0xff;

    /* treat absence of function as success */
    if (!pSHGetFolderLocation) return TRUE;

    pidl = NULL;
    hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
    if (hr == S_OK)
    {
        if (pidl)
        {
            LPITEMIDLIST pidlLast = pILFindLastID(pidl);

            ok(pidlLast != NULL, "%s: ILFindLastID failed\n",
             getFolderName(folder));
            if (pidlLast)
                ret = pidlLast->mkid.abID[0];
            IMalloc_Free(pMalloc, pidl);
        }
    }
    return ret;
}

/* Returns the folder's PIDL type, or 0xff if one can't be found. */
static BYTE testSHGetSpecialFolderLocation(int folder)
{
    LPITEMIDLIST pidl;
    HRESULT hr;
    BYTE ret = 0xff;

    /* treat absence of function as success */
    if (!pSHGetSpecialFolderLocation) return TRUE;

    pidl = NULL;
    hr = pSHGetSpecialFolderLocation(NULL, folder, &pidl);
    if (hr == S_OK)
    {
        if (pidl)
        {
            LPITEMIDLIST pidlLast = pILFindLastID(pidl);

            ok(pidlLast != NULL,
                "%s: ILFindLastID failed\n", getFolderName(folder));
            if (pidlLast)
                ret = pidlLast->mkid.abID[0];
            IMalloc_Free(pMalloc, pidl);
        }
    }
    return ret;
}

static void test_SHGetFolderPath(BOOL optional, int folder)
{
    char path[MAX_PATH];
    HRESULT hr;

    if (!pSHGetFolderPathA) return;

    hr = pSHGetFolderPathA(NULL, folder, NULL, SHGFP_TYPE_CURRENT, path);
    ok(hr == S_OK || optional,
     "SHGetFolderPathA(NULL, %s, NULL, SHGFP_TYPE_CURRENT, path) failed: 0x%08x\n", getFolderName(folder), hr);
}

static void test_SHGetSpecialFolderPath(BOOL optional, int folder)
{
    char path[MAX_PATH];
    BOOL ret;

    if (!pSHGetSpecialFolderPathA) return;

    ret = pSHGetSpecialFolderPathA(NULL, path, folder, FALSE);
    if (ret && winetest_interactive)
        printf("%s: %s\n", getFolderName(folder), path);
    ok(ret || optional,
     "SHGetSpecialFolderPathA(NULL, path, %s, FALSE) failed\n",
     getFolderName(folder));
}

static void test_ShellValues(const struct shellExpectedValues testEntries[],
 int numEntries, BOOL optional)
{
    int i;

    for (i = 0; i < numEntries; i++)
    {
        BYTE type;
        int j;
        BOOL foundTypeMatch = FALSE;

        if (pSHGetFolderLocation)
        {
            type = testSHGetFolderLocation(testEntries[i].folder);
            for (j = 0; !foundTypeMatch && j < testEntries[i].numTypes; j++)
                if (testEntries[i].types[j] == type)
                    foundTypeMatch = TRUE;
            ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */,
             "%s has unexpected type %d (0x%02x)\n",
             getFolderName(testEntries[i].folder), type, type);
        }
        type = testSHGetSpecialFolderLocation(testEntries[i].folder);
        for (j = 0, foundTypeMatch = FALSE; !foundTypeMatch &&
         j < testEntries[i].numTypes; j++)
            if (testEntries[i].types[j] == type)
                foundTypeMatch = TRUE;
        ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */,
         "%s has unexpected type %d (0x%02x)\n",
         getFolderName(testEntries[i].folder), type, type);
        switch (type)
        {
            case PT_FOLDER:
            case PT_DRIVE:
            case PT_DRIVE2:
            case PT_IESPECIAL2:
                test_SHGetFolderPath(optional, testEntries[i].folder);
                test_SHGetSpecialFolderPath(optional, testEntries[i].folder);
                break;
        }
    }
}

/* Attempts to verify that the folder path corresponding to the folder CSIDL
 * value has the same value as the environment variable with name envVar.
 * Doesn't mind if SHGetSpecialFolderPath fails for folder or if envVar isn't
 * set in this environment; different OS and shell version behave differently.
 * However, if both are present, fails if envVar's value is not the same
 * (byte-for-byte) as what SHGetSpecialFolderPath returns.
 */
static void matchSpecialFolderPathToEnv(int folder, const char *envVar)
{
    char path[MAX_PATH];

    if (!pSHGetSpecialFolderPathA) return;

    if (pSHGetSpecialFolderPathA(NULL, path, folder, FALSE))
    {
        char *envVal = getenv(envVar);

        ok(!envVal || !lstrcmpiA(envVal, path),
         "%%%s%% does not match SHGetSpecialFolderPath:\n"
         "%%%s%% is %s\nSHGetSpecialFolderPath returns %s\n",
         envVar, envVar, envVal, path);
    }
}

/* Attempts to match the GUID returned by SHGetFolderLocation for folder with
 * GUID.  Assumes the type of the returned PIDL is in fact a GUID, but doesn't
 * fail if it isn't--that check should already have been done.
 * Fails if the returned PIDL is a GUID whose value does not match guid.
 */
static void matchGUID(int folder, const GUID *guid, const GUID *guid_alt)
{
    LPITEMIDLIST pidl;
    HRESULT hr;

    if (!pSHGetFolderLocation) return;
    if (!guid) return;

    pidl = NULL;
    hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
    if (hr == S_OK)
    {
        LPITEMIDLIST pidlLast = pILFindLastID(pidl);

        if (pidlLast && (pidlLast->mkid.abID[0] == PT_SHELLEXT ||
         pidlLast->mkid.abID[0] == PT_GUID))
        {
            GUID *shellGuid = (GUID *)(pidlLast->mkid.abID + 2);

            if (!guid_alt)
             ok(IsEqualIID(shellGuid, guid),
              "%s: got GUID %s, expected %s\n", getFolderName(folder),
              wine_dbgstr_guid(shellGuid), wine_dbgstr_guid(guid));
            else
             ok(IsEqualIID(shellGuid, guid) ||
              IsEqualIID(shellGuid, guid_alt),
              "%s: got GUID %s, expected %s or %s\n", getFolderName(folder),
              wine_dbgstr_guid(shellGuid), wine_dbgstr_guid(guid), wine_dbgstr_guid(guid_alt));
        }
        IMalloc_Free(pMalloc, pidl);
    }
}

/* Checks the PIDL type of all the known values. */
static void test_PidlTypes(void)
{
    /* Desktop */
    test_SHGetFolderPath(FALSE, CSIDL_DESKTOP);
    test_SHGetSpecialFolderPath(FALSE, CSIDL_DESKTOP);

    test_ShellValues(requiredShellValues, ARRAY_SIZE(requiredShellValues), FALSE);
    test_ShellValues(optionalShellValues, ARRAY_SIZE(optionalShellValues), TRUE);
}

/* FIXME: Should be in shobjidl.idl */
DEFINE_GUID(CLSID_NetworkExplorerFolder, 0xF02C1A0D, 0xBE21, 0x4350, 0x88, 0xB0, 0x73, 0x67, 0xFC, 0x96, 0xEF, 0x3C);
DEFINE_GUID(_CLSID_Documents, 0xA8CDFF1C, 0x4878, 0x43be, 0xB5, 0xFD, 0xF8, 0x09, 0x1C, 0x1C, 0x60, 0xD0);

/* Verifies various shell virtual folders have the correct well-known GUIDs. */
static void test_GUIDs(void)
{
    matchGUID(CSIDL_BITBUCKET, &CLSID_RecycleBin, NULL);
    matchGUID(CSIDL_CONTROLS, &CLSID_ControlPanel, NULL);
    matchGUID(CSIDL_DRIVES, &CLSID_MyComputer, NULL);
    matchGUID(CSIDL_INTERNET, &CLSID_Internet, NULL);
    matchGUID(CSIDL_NETWORK, &CLSID_NetworkPlaces, &CLSID_NetworkExplorerFolder); /* Vista and higher */
    matchGUID(CSIDL_PERSONAL, &CLSID_MyDocuments, &_CLSID_Documents /* win8 */);
    matchGUID(CSIDL_COMMON_DOCUMENTS, &CLSID_CommonDocuments, NULL);
    matchGUID(CSIDL_PRINTERS, &CLSID_Printers, NULL);
}

/* Verifies various shell paths match the environment variables to which they
 * correspond.
 */
static void test_EnvVars(void)
{
    matchSpecialFolderPathToEnv(CSIDL_PROGRAM_FILES, "ProgramFiles");
    matchSpecialFolderPathToEnv(CSIDL_APPDATA, "APPDATA");
    matchSpecialFolderPathToEnv(CSIDL_PROFILE, "USERPROFILE");
    matchSpecialFolderPathToEnv(CSIDL_WINDOWS, "SystemRoot");
    matchSpecialFolderPathToEnv(CSIDL_WINDOWS, "windir");
    matchSpecialFolderPathToEnv(CSIDL_PROGRAM_FILES_COMMON, "CommonProgramFiles");
    /* this is only set on Wine, but can't hurt to verify it: */
    matchSpecialFolderPathToEnv(CSIDL_SYSTEM, "winsysdir");
}

/* Loosely based on PathRemoveBackslashA from dlls/shlwapi/path.c */
static BOOL myPathIsRootA(LPCSTR lpszPath)
{
  if (lpszPath && *lpszPath &&
      lpszPath[1] == ':' && lpszPath[2] == '\\' && lpszPath[3] == '\0')
      return TRUE; /* X:\ */
  return FALSE;
}
static LPSTR myPathRemoveBackslashA( LPSTR lpszPath )
{
  LPSTR szTemp = NULL;

  if(lpszPath)
  {
    szTemp = CharPrevA(lpszPath, lpszPath + strlen(lpszPath));
    if (!myPathIsRootA(lpszPath) && *szTemp == '\\')
      *szTemp = '\0';
  }
  return szTemp;
}

/* Verifies the shell path for CSIDL_WINDOWS matches the return from
 * GetWindowsDirectory.  If SHGetSpecialFolderPath fails, no harm, no foul--not
 * every shell32 version supports CSIDL_WINDOWS.
 */
static void testWinDir(void)
{
    char windowsShellPath[MAX_PATH], windowsDir[MAX_PATH] = { 0 };

    if (!pSHGetSpecialFolderPathA) return;

    if (pSHGetSpecialFolderPathA(NULL, windowsShellPath, CSIDL_WINDOWS, FALSE))
    {
        myPathRemoveBackslashA(windowsShellPath);
        GetWindowsDirectoryA(windowsDir, sizeof(windowsDir));
        myPathRemoveBackslashA(windowsDir);
        ok(!lstrcmpiA(windowsDir, windowsShellPath),
         "GetWindowsDirectory returns %s SHGetSpecialFolderPath returns %s\n",
         windowsDir, windowsShellPath);
    }
}

/* Verifies the shell path for CSIDL_SYSTEM matches the return from
 * GetSystemDirectory.  If SHGetSpecialFolderPath fails, no harm,
 * no foul--not every shell32 version supports CSIDL_SYSTEM.
 */
static void testSystemDir(void)
{
    char systemShellPath[MAX_PATH], systemDir[MAX_PATH], systemDirx86[MAX_PATH];

    if (!pSHGetSpecialFolderPathA) return;

    GetSystemDirectoryA(systemDir, sizeof(systemDir));
    myPathRemoveBackslashA(systemDir);
    if (pSHGetSpecialFolderPathA(NULL, systemShellPath, CSIDL_SYSTEM, FALSE))
    {
        myPathRemoveBackslashA(systemShellPath);
        ok(!lstrcmpiA(systemDir, systemShellPath),
         "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n",
         systemDir, systemShellPath);
    }

    if (!pGetSystemWow64DirectoryA || !pGetSystemWow64DirectoryA(systemDirx86, sizeof(systemDirx86)))
        GetSystemDirectoryA(systemDirx86, sizeof(systemDirx86));
    myPathRemoveBackslashA(systemDirx86);
    if (pSHGetSpecialFolderPathA(NULL, systemShellPath, CSIDL_SYSTEMX86, FALSE))
    {
        myPathRemoveBackslashA(systemShellPath);
        ok(!lstrcmpiA(systemDirx86, systemShellPath) || broken(!lstrcmpiA(systemDir, systemShellPath)),
         "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n",
         systemDir, systemShellPath);
    }
}

/* Globals used by subprocesses */
static int    myARGC;
static char **myARGV;
static char   base[MAX_PATH];
static char   selfname[MAX_PATH];

static BOOL init(void)
{
    myARGC = winetest_get_mainargs(&myARGV);
    if (!GetCurrentDirectoryA(sizeof(base), base)) return FALSE;
    strcpy(selfname, myARGV[0]);
    return TRUE;
}

static void doChild(const char *arg)
{
    char path[MAX_PATH];
    HRESULT hr;

    if (arg[0] == '1')
    {
        LPITEMIDLIST pidl;
        char *p;

        /* test what happens when CSIDL_FAVORITES is set to a nonexistent directory */

        /* test some failure cases first: */
        hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path);
        ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
            "SHGetFolderPath returned 0x%08x, expected 0x80070002\n", hr);

        pidl = NULL;
        hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, NULL, 0, &pidl);
        ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
            "SHGetFolderLocation returned 0x%08x\n", hr);
        if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl);

        ok(!pSHGetSpecialFolderPathA(NULL, path, CSIDL_FAVORITES, FALSE),
            "SHGetSpecialFolderPath succeeded, expected failure\n");

        pidl = NULL;
        hr = pSHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl);
        ok(hr == E_FAIL || hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
            "SHGetFolderLocation returned 0x%08x\n", hr);

        if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl);

        /* now test success: */
        hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL,
                               SHGFP_TYPE_CURRENT, path);
        ok (hr == S_OK, "got 0x%08x\n", hr);
        if (hr == S_OK)
        {
            BOOL ret;

            trace("CSIDL_FAVORITES was changed to %s\n", path);
            ret = CreateDirectoryA(path, NULL);
            ok(!ret, "expected failure with ERROR_ALREADY_EXISTS\n");
            if (!ret)
                ok(GetLastError() == ERROR_ALREADY_EXISTS,
                  "got %d, expected ERROR_ALREADY_EXISTS\n", GetLastError());

            p = path + strlen(path);
            strcpy(p, "\\desktop.ini");
            DeleteFileA(path);
            *p = 0;
            SetFileAttributesA( path, FILE_ATTRIBUTE_NORMAL );
            ret = RemoveDirectoryA(path);
            ok( ret, "failed to remove %s error %u\n", path, GetLastError() );
        }
    }
    else if (arg[0] == '2')
    {
        /* make sure SHGetFolderPath still succeeds when the
           original value of CSIDL_FAVORITES is restored. */
        hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL,
            SHGFP_TYPE_CURRENT, path);
        ok(hr == S_OK, "SHGetFolderPath failed: 0x%08x\n", hr);
    }
}

/* Tests the return values from the various shell functions both with and
 * without the use of the CSIDL_FLAG_CREATE flag.  This flag only appeared in
 * version 5 of the shell, so don't test unless it's at least version 5.
 * The test reads a value from the registry, modifies it, calls
 * SHGetFolderPath once with the CSIDL_FLAG_CREATE flag, and immediately
 * afterward without it.  Then it restores the registry and deletes the folder
 * that was created.
 * One oddity with respect to restoration: shell32 caches somehow, so it needs
 * to be reloaded in order to see the correct (restored) value.
 * Some APIs unrelated to the ones under test may fail, but I expect they're
 * covered by other unit tests; I just print out something about failure to
 * help trace what's going on.
 */
static void test_NonExistentPath(void)
{
    static const char userShellFolders[] = 
     "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
    char originalPath[MAX_PATH], modifiedPath[MAX_PATH];
    HKEY key;

    if (!pSHGetFolderPathA) return;
    if (!pSHGetFolderLocation) return;
    if (!pSHGetSpecialFolderPathA) return;
    if (!pSHGetSpecialFolderLocation) return;
    if (!pSHFileOperationA) return;
    if (shellVersion.dwMajorVersion < 5) return;

    if (!RegOpenKeyExA(HKEY_CURRENT_USER, userShellFolders, 0, KEY_ALL_ACCESS,
     &key))
    {
        DWORD len, type;

        len = sizeof(originalPath);
        if (!RegQueryValueExA(key, "Favorites", NULL, &type,
         (LPBYTE)&originalPath, &len))
        {
            size_t len = strlen(originalPath);

            memcpy(modifiedPath, originalPath, len);
            modifiedPath[len++] = '2';
            modifiedPath[len++] = '\0';
            trace("Changing CSIDL_FAVORITES to %s\n", modifiedPath);
            if (!RegSetValueExA(key, "Favorites", 0, type,
             (LPBYTE)modifiedPath, len))
            {
                char buffer[MAX_PATH+20];
                STARTUPINFOA startup;
                PROCESS_INFORMATION info;

                sprintf(buffer, "%s tests/shellpath.c 1", selfname);
                memset(&startup, 0, sizeof(startup));
                startup.cb = sizeof(startup);
                startup.dwFlags = STARTF_USESHOWWINDOW;
                startup.dwFlags = SW_SHOWNORMAL;
                CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL,
                 &startup, &info);
                winetest_wait_child_process( info.hProcess );

                /* restore original values: */
                trace("Restoring CSIDL_FAVORITES to %s\n", originalPath);
                RegSetValueExA(key, "Favorites", 0, type, (LPBYTE) originalPath,
                 strlen(originalPath) + 1);
                RegFlushKey(key);

                sprintf(buffer, "%s tests/shellpath.c 2", selfname);
                memset(&startup, 0, sizeof(startup));
                startup.cb = sizeof(startup);
                startup.dwFlags = STARTF_USESHOWWINDOW;
                startup.dwFlags = SW_SHOWNORMAL;
                CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL,
                 &startup, &info);
                ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0,
                 "child process termination\n");
            }
        }
        else skip("RegQueryValueExA(key, Favorites, ...) failed\n");
        if (key)
            RegCloseKey(key);
    }
    else skip("RegOpenKeyExA(HKEY_CURRENT_USER, %s, ...) failed\n", userShellFolders);
}

static void test_SHGetFolderPathEx(void)
{
    HRESULT hr;
    WCHAR buffer[MAX_PATH], *path;
    DWORD len;

    if (!pSHGetKnownFolderPath || !pSHGetFolderPathEx)
    {
        win_skip("SHGetKnownFolderPath or SHGetFolderPathEx not available\n");
        return;
    }

if (0) { /* crashes */
    hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, NULL);
    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
}
    /* non-existent folder id */
    path = (void *)0xdeadbeef;
    hr = pSHGetKnownFolderPath(&IID_IOleObject, 0, NULL, &path);
    ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
    ok(path == NULL, "got %p\n", path);

    path = NULL;
    hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path);
    ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
    ok(path != NULL, "expected path != NULL\n");

    hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, MAX_PATH);
    ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
    ok(!lstrcmpiW(path, buffer), "expected equal paths\n");
    len = lstrlenW(buffer);
    CoTaskMemFree(path);

    hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, 0);
    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);

if (0) { /* crashes */
    hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, NULL, len + 1);
    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);

    hr = pSHGetFolderPathEx(NULL, 0, NULL, buffer, MAX_PATH);
    ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
}
    hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, len);
    ok(hr == E_NOT_SUFFICIENT_BUFFER, "expected E_NOT_SUFFICIENT_BUFFER, got 0x%08x\n", hr);

    hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, len + 1);
    ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
}

/* Standard CSIDL values (and their flags) uses only two less-significant bytes */
#define NO_CSIDL 0x10000
#define WINE_ATTRIBUTES_OPTIONAL 0x20000
#define KNOWN_FOLDER(id, csidl, name, category, parent1, parent2, relative_path, parsing_name, attributes, definitionFlags) \
    { &id, # id, csidl, # csidl, name, category, {&parent1, &parent2}, relative_path, parsing_name, attributes, definitionFlags, __LINE__ }

/* non-published known folders test */
static const GUID _FOLDERID_CryptoKeys =            {0xB88F4DAA, 0xE7BD, 0x49A9, {0xB7, 0x4D, 0x02, 0x88, 0x5A, 0x5D, 0xC7, 0x65} };
static const GUID _FOLDERID_DpapiKeys =             {0x10C07CD0, 0xEF91, 0x4567, {0xB8, 0x50, 0x44, 0x8B, 0x77, 0xCB, 0x37, 0xF9} };
static const GUID _FOLDERID_SystemCertificates =    {0x54EED2E0, 0xE7CA, 0x4FDB, {0x91, 0x48, 0x0F, 0x42, 0x47, 0x29, 0x1C, 0xFA} };
static const GUID _FOLDERID_CredentialManager =     {0x915221FB, 0x9EFE, 0x4BDA, {0x8F, 0xD7, 0xF7, 0x8D, 0xCA, 0x77, 0x4F, 0x87} };

struct knownFolderDef {
    const KNOWNFOLDERID *folderId;
    const char *sFolderId;
    const int csidl;
    const char *sCsidl;
    const char *sName;
    const KF_CATEGORY category;
    const KNOWNFOLDERID *fidParents[2];
    const char *sRelativePath;
    const char *sParsingName;
    const DWORD attributes;
    const KF_DEFINITION_FLAGS definitionFlags;
    const int line;
};

/* Note: content of parsing name may vary between Windows versions.
 * As a base, values from 6.0 (Vista) were used. Some entries may contain
 * alternative values. In that case, Windows version where the value was
 * found is noted.
 *
 * The list of values for parsing name was encoded as a number of null-
 * terminated strings placed one by one (separated by null byte only).
 * End of list is marked by two consecutive null bytes.
 */
static const struct knownFolderDef known_folders[] = {
    KNOWN_FOLDER(FOLDERID_AddNewPrograms,
                 NO_CSIDL,
                 "AddNewProgramsFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{15eae92e-f17a-4431-9f28-805e482dafd4}\0"
                "shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{15eae92e-f17a-4431-9f28-805e482dafd4}\0\0" /* 6.1 */,
                0,
                0),
    KNOWN_FOLDER(FOLDERID_AdminTools,
                 CSIDL_ADMINTOOLS,
                 "Administrative Tools",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Programs, GUID_NULL,
                 "Administrative Tools",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_AppUpdates,
                 NO_CSIDL,
                 "AppUpdatesFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}\\::{d450a8a1-9568-45c7-9c0e-b4f9fb4537bd}\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}\\::{d450a8a1-9568-45c7-9c0e-b4f9fb4537bd}\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_CDBurning,
                 CSIDL_CDBURN_AREA,
                 "CD Burning",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows\\Burn\\Burn",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_LOCAL_REDIRECT_ONLY),
    KNOWN_FOLDER(FOLDERID_ChangeRemovePrograms,
                 NO_CSIDL,
                 "ChangeRemoveProgramsFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_CommonAdminTools,
                 CSIDL_COMMON_ADMINTOOLS,
                 "Common Administrative Tools",
                 KF_CATEGORY_COMMON,
                 FOLDERID_CommonPrograms, GUID_NULL,
                 "Administrative Tools",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_CommonOEMLinks,
                 CSIDL_COMMON_OEM_LINKS,
                 "OEM Links",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "OEM Links",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_CommonPrograms,
                 CSIDL_COMMON_PROGRAMS,
                 "Common Programs",
                 KF_CATEGORY_COMMON,
                 FOLDERID_CommonStartMenu, GUID_NULL,
                 "Programs",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_CommonStartMenu,
                 CSIDL_COMMON_STARTMENU,
                 "Common Start Menu",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "Microsoft\\Windows\\Start Menu\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_CommonStartup,
                 CSIDL_COMMON_STARTUP,
                 "Common Startup",
                 KF_CATEGORY_COMMON,
                 FOLDERID_CommonPrograms, GUID_NULL,
                 "StartUp",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_CommonTemplates,
                 CSIDL_COMMON_TEMPLATES,
                 "Common Templates",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "Microsoft\\Windows\\Templates\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ComputerFolder,
                 CSIDL_DRIVES,
                 "MyComputerFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ConflictFolder,
                 NO_CSIDL,
                 "ConflictFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{E413D040-6788-4C22-957E-175D1C513A34},\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{E413D040-6788-4C22-957E-175D1C513A34},\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ConnectionsFolder,
                 CSIDL_CONNECTIONS,
                 "ConnectionsFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Contacts,
                 NO_CSIDL,
                 "Contacts",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Contacts",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{56784854-C6CB-462B-8169-88E350ACB882}\0\0",
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_ControlPanelFolder,
                 CSIDL_CONTROLS,
                 "ControlPanelFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Cookies,
                 CSIDL_COOKIES,
                 "Cookies",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, FOLDERID_LocalAppData,
                 "Microsoft\\Windows\\Cookies\0Microsoft\\Windows\\INetCookies\0" /* win8 */,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Desktop,
                 CSIDL_DESKTOP,
                 "Desktop",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Desktop",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_DeviceMetadataStore,
                 NO_CSIDL,
                 "Device Metadata Store",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "Microsoft\\Windows\\DeviceMetadataStore\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Documents,
                 CSIDL_MYDOCUMENTS,
                 "Personal",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Documents\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{FDD39AD0-238F-46AF-ADB4-6C85480369C7}\0shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}\0\0", /* win8 */
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_DocumentsLibrary,
                 NO_CSIDL,
                 "DocumentsLibrary",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Libraries, GUID_NULL,
                 "Documents.library-ms\0",
                 "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}\\{7b0db17d-9cd2-4a93-9733-46cc89022e7c}\0\0",
                 0,
                 KFDF_PRECREATE | KFDF_STREAM),
    KNOWN_FOLDER(FOLDERID_Downloads,
                 NO_CSIDL,
                 "Downloads",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Downloads\0",
                 "(null)\0shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{374DE290-123F-4565-9164-39C4925E467B}\0\0", /* win8 */
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_Favorites,
                 CSIDL_FAVORITES,
                 "Favorites",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Favorites\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_Fonts,
                 CSIDL_FONTS,
                 "Fonts",
                 KF_CATEGORY_FIXED,
                 FOLDERID_Windows, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Games,
                 NO_CSIDL,
                 "Games",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{ED228FDF-9EA8-4870-83b1-96b02CFE0D52}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_GameTasks,
                 NO_CSIDL,
                 "GameTasks",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows\\GameExplorer\0",
                 NULL,
                 0,
                 KFDF_LOCAL_REDIRECT_ONLY),
    KNOWN_FOLDER(FOLDERID_History,
                 CSIDL_HISTORY,
                 "History",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows\\History\0",
                 NULL,
                 0,
                 KFDF_LOCAL_REDIRECT_ONLY),
    KNOWN_FOLDER(FOLDERID_HomeGroup,
                 NO_CSIDL,
                 "HomeGroupFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{B4FB3F98-C1EA-428d-A78A-D1F5659CBA93}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ImplicitAppShortcuts,
                 NO_CSIDL,
                 "ImplicitAppShortcuts",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_UserPinned, GUID_NULL,
                 "ImplicitAppShortcuts\0",
                 NULL,
                 0,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_InternetCache,
                 CSIDL_INTERNET_CACHE,
                 "Cache",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows\\Temporary Internet Files\0Microsoft\\Windows\\INetCache\0\0", /* win8 */
                 NULL,
                 0,
                 KFDF_LOCAL_REDIRECT_ONLY),
    KNOWN_FOLDER(FOLDERID_InternetFolder,
                 CSIDL_INTERNET,
                 "InternetFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{871C5380-42A0-1069-A2EA-08002B30309D}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Libraries,
                 NO_CSIDL,
                 "Libraries",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Libraries\0",
                 NULL,
                 0,
                 KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_Links,
                 NO_CSIDL,
                 "Links",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Links\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}\0\0",
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_LocalAppData,
                 CSIDL_LOCAL_APPDATA,
                 "Local AppData",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "AppData\\Local\0",
                 NULL,
                 0,
                 KFDF_LOCAL_REDIRECT_ONLY | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_LocalAppDataLow,
                 NO_CSIDL,
                 "LocalAppDataLow",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "AppData\\LocalLow\0",
                 NULL,
                 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
                 KFDF_LOCAL_REDIRECT_ONLY | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_LocalizedResourcesDir,
                 CSIDL_RESOURCES_LOCALIZED,
                 "LocalizedResourcesDir",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Music,
                 CSIDL_MYMUSIC,
                 "My Music",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Music\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{4BD8D571-6D19-48D3-BE97-422220080E43}\0shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{1CF1260C-4DD0-4EBB-811F-33C572699FDE}\0\0", /* win8 */
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_MusicLibrary,
                 NO_CSIDL,
                 "MusicLibrary",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Libraries, GUID_NULL,
                 "Music.library-ms\0",
                 "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}\\{2112AB0A-C86A-4ffe-A368-0DE96E47012E}\0\0",
                 0,
                 KFDF_PRECREATE | KFDF_STREAM),
    KNOWN_FOLDER(FOLDERID_NetHood,
                 CSIDL_NETHOOD,
                 "NetHood",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Network Shortcuts\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_NetworkFolder,
                 CSIDL_NETWORK,
                 "NetworkPlacesFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_OriginalImages,
                 NO_CSIDL,
                 "Original Images",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows Photo Gallery\\Original Images\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_PhotoAlbums,
                 NO_CSIDL,
                 "PhotoAlbums",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Pictures, GUID_NULL,
                 "Slide Shows\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 0),
    KNOWN_FOLDER(FOLDERID_Pictures,
                 CSIDL_MYPICTURES,
                 "My Pictures",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Pictures\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{33E28130-4E1E-4676-835A-98395C3BC3BB}\0shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}\0\0", /* win8 */
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PicturesLibrary,
                 NO_CSIDL,
                 "PicturesLibrary",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Libraries, GUID_NULL,
                 "Pictures.library-ms\0",
                 "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}\\{A990AE9F-A03B-4e80-94BC-9912D7504104}\0\0",
                 0,
                 KFDF_PRECREATE | KFDF_STREAM),
    KNOWN_FOLDER(FOLDERID_Playlists,
                 NO_CSIDL,
                 "Playlists",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Music, GUID_NULL,
                 "Playlists\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 0),
    KNOWN_FOLDER(FOLDERID_PrintersFolder,
                 CSIDL_PRINTERS,
                 "PrintersFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_PrintHood,
                 CSIDL_PRINTHOOD,
                 "PrintHood",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Printer Shortcuts\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Profile,
                 CSIDL_PROFILE,
                 "Profile",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramData,
                 CSIDL_COMMON_APPDATA,
                 "Common AppData",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramFiles,
                 CSIDL_PROGRAM_FILES,
                 "ProgramFiles",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE
                ),
    KNOWN_FOLDER(FOLDERID_ProgramFilesCommon,
                 CSIDL_PROGRAM_FILES_COMMON,
                 "ProgramFilesCommon",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramFilesCommonX64,
                 NO_CSIDL,
                 "ProgramFilesCommonX64",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramFilesCommonX86,
                 NO_CSIDL,
                 "ProgramFilesCommonX86",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramFilesX64,
                 NO_CSIDL,
                 "ProgramFilesX64",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ProgramFilesX86,
                 CSIDL_PROGRAM_FILESX86,
                 "ProgramFilesX86",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_Programs,
                 CSIDL_PROGRAMS,
                 "Programs",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_StartMenu, GUID_NULL,
                 "Programs\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_Public,
                 NO_CSIDL,
                 "Public",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{4336a54d-038b-4685-ab02-99bb52d3fb8b}\0"
                 "(null)\0\0" /* 6.1 */,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicDesktop,
                 CSIDL_COMMON_DESKTOPDIRECTORY,
                 "Common Desktop",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Desktop\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicDocuments,
                 CSIDL_COMMON_DOCUMENTS,
                 "Common Documents",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Documents\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicDownloads,
                 NO_CSIDL,
                 "CommonDownloads",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Downloads\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicGameTasks,
                 NO_CSIDL,
                 "PublicGameTasks",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "Microsoft\\Windows\\GameExplorer\0",
                 NULL,
                 0,
                 KFDF_LOCAL_REDIRECT_ONLY),
    KNOWN_FOLDER(FOLDERID_PublicLibraries,
                 NO_CSIDL,
                 "PublicLibraries",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Libraries\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicMusic,
                 CSIDL_COMMON_MUSIC,
                 "CommonMusic",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Music\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicPictures,
                 CSIDL_COMMON_PICTURES,
                 "CommonPictures",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Pictures\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicRingtones,
                 NO_CSIDL,
                 "CommonRingtones",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramData, GUID_NULL,
                 "Microsoft\\Windows\\Ringtones\0",
                 NULL,
                 0,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_PublicVideos,
                 CSIDL_COMMON_VIDEO,
                 "CommonVideo",
                 KF_CATEGORY_COMMON,
                 FOLDERID_Public, GUID_NULL,
                 "Videos\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_QuickLaunch,
                 NO_CSIDL,
                 "Quick Launch",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Internet Explorer\\Quick Launch\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Recent,
                 CSIDL_RECENT,
                 "Recent",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Recent\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_RecordedTVLibrary,
                 NO_CSIDL,
                 "RecordedTVLibrary",
                 KF_CATEGORY_COMMON,
                 FOLDERID_PublicLibraries, GUID_NULL,
                 "RecordedTV.library-ms\0",
                 NULL,
                 0,
                 KFDF_PRECREATE | KFDF_STREAM),
    KNOWN_FOLDER(FOLDERID_RecycleBinFolder,
                 CSIDL_BITBUCKET,
                 "RecycleBinFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{645FF040-5081-101B-9F08-00AA002F954E}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_ResourceDir,
                 CSIDL_RESOURCES,
                 "ResourceDir",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Ringtones,
                 NO_CSIDL,
                 "Ringtones",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows\\Ringtones\0",
                 NULL,
                 0,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_RoamingAppData,
                 CSIDL_APPDATA,
                 "AppData",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "AppData\\Roaming\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SampleMusic,
                 NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */,
                 "SampleMusic",
                 KF_CATEGORY_COMMON,
                 FOLDERID_PublicMusic, GUID_NULL,
                 "Sample Music\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_SamplePictures,
                 NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */,
                 "SamplePictures",
                 KF_CATEGORY_COMMON,
                 FOLDERID_PublicPictures, GUID_NULL,
                 "Sample Pictures\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_SamplePlaylists,
                 NO_CSIDL,
                 "SamplePlaylists",
                 KF_CATEGORY_COMMON,
                 FOLDERID_PublicMusic, GUID_NULL,
                 "Sample Playlists\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 0),
    KNOWN_FOLDER(FOLDERID_SampleVideos,
                 NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */,
                 "SampleVideos",
                 KF_CATEGORY_COMMON,
                 FOLDERID_PublicVideos, GUID_NULL,
                 "Sample Videos\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_SavedGames,
                 NO_CSIDL,
                 "SavedGames",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Saved Games\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}\0\0",
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_SavedSearches,
                 NO_CSIDL,
                 "Searches",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Searches\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{7d1d3a04-debb-4115-95cf-2f29da2920da}\0\0",
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH),
    KNOWN_FOLDER(FOLDERID_SEARCH_CSC,
                 NO_CSIDL,
                 "CSCFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "shell:::{BD7A2E7B-21CB-41b2-A086-B309680C6B7E}\\*\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SearchHome,
                 NO_CSIDL,
                 "SearchHomeFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{9343812e-1c37-4a49-a12e-4b2d810d956b}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SEARCH_MAPI,
                 NO_CSIDL,
                 "MAPIFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "shell:::{89D83576-6BD1-4C86-9454-BEB04E94C819}\\*\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SendTo,
                 CSIDL_SENDTO,
                 "SendTo",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\SendTo\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SidebarDefaultParts,
                 NO_CSIDL,
                 "Default Gadgets",
                 KF_CATEGORY_COMMON,
                 FOLDERID_ProgramFiles, GUID_NULL,
                 "Windows Sidebar\\Gadgets\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SidebarParts,
                 NO_CSIDL,
                 "Gadgets",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Microsoft\\Windows Sidebar\\Gadgets\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_StartMenu,
                 CSIDL_STARTMENU,
                 "Start Menu",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Start Menu\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_Startup,
                 CSIDL_STARTUP,
                 "Startup",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Programs, GUID_NULL,
                 "StartUp\0",
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_SyncManagerFolder,
                 NO_CSIDL,
                 "SyncCenterFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SyncResultsFolder,
                 NO_CSIDL,
                 "SyncResultsFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{BC48B32F-5910-47F5-8570-5074A8A5636A},\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{BC48B32F-5910-47F5-8570-5074A8A5636A},\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SyncSetupFolder,
                 NO_CSIDL,
                 "SyncSetupFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{F1390A9A-A3F4-4E5D-9C5F-98F3BD8D935C},\0"
                 "::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}\\::{F1390A9A-A3F4-4E5D-9C5F-98F3BD8D935C},\0\0" /* 6.1 */,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_System,
                 CSIDL_SYSTEM,
                 "System",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_SystemX86,
                 CSIDL_SYSTEMX86,
                 "SystemX86",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Templates,
                 CSIDL_TEMPLATES,
                 "Templates",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_RoamingAppData, GUID_NULL,
                 "Microsoft\\Windows\\Templates\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_UserPinned,
                 NO_CSIDL,
                 "User Pinned",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_QuickLaunch, GUID_NULL,
                 "User Pinned\0",
                 NULL,
                 FILE_ATTRIBUTE_HIDDEN,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_UserProfiles,
                 NO_CSIDL,
                 "UserProfiles",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_UserProgramFiles,
                 NO_CSIDL,
                 "UserProgramFiles",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_LocalAppData, GUID_NULL,
                 "Programs\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_UserProgramFilesCommon,
                 NO_CSIDL,
                 "UserProgramFilesCommon",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_UserProgramFiles, GUID_NULL,
                 "Common\0",
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_UsersFiles,
                 NO_CSIDL,
                 "UsersFilesFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_UsersLibraries,
                 NO_CSIDL,
                 "UsersLibrariesFolder",
                 KF_CATEGORY_VIRTUAL,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}\0\0",
                 0,
                 0),
    KNOWN_FOLDER(FOLDERID_Videos,
                 CSIDL_MYVIDEO,
                 "My Video",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Profile, GUID_NULL,
                 "Videos\0",
                 "::{59031a47-3f72-44a7-89c5-5595fe6b30ee}\\{18989B1D-99B5-455B-841C-AB7C74E4DDFC}\0shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{A0953C92-50DC-43BF-BE83-3742FED03C9C}\0\0", /* win8 */
                 FILE_ATTRIBUTE_READONLY,
                 KFDF_ROAMABLE | KFDF_PRECREATE),
    KNOWN_FOLDER(FOLDERID_VideosLibrary,
                 NO_CSIDL,
                 "VideosLibrary",
                 KF_CATEGORY_PERUSER,
                 FOLDERID_Libraries, GUID_NULL,
                 "Videos.library-ms\0",
                 "::{031E4825-7B94-4dc3-B131-E946B44C8DD5}\\{491E922F-5643-4af4-A7EB-4E7A138D8174}\0\0",
                 0,
                 KFDF_PRECREATE | KFDF_STREAM),
    KNOWN_FOLDER(FOLDERID_Windows,
                 CSIDL_WINDOWS,
                 "Windows",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(_FOLDERID_CredentialManager,
                 NO_CSIDL,
                 "CredentialManager",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(_FOLDERID_CryptoKeys,
                 NO_CSIDL,
                 "CryptoKeys",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(_FOLDERID_DpapiKeys,
                 NO_CSIDL,
                 "DpapiKeys",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    KNOWN_FOLDER(_FOLDERID_SystemCertificates,
                 NO_CSIDL,
                 "SystemCertificates",
                 KF_CATEGORY_FIXED,
                 GUID_NULL, GUID_NULL,
                 NULL,
                 NULL,
                 0,
                 0),
    { 0 }
};
#undef KNOWN_FOLDER
BOOL known_folder_found[sizeof(known_folders)/sizeof(known_folders[0])-1];

static BOOL is_in_strarray(const WCHAR *needle, const char *hay)
{
    WCHAR wstr[MAX_PATH];

    if(!needle && !hay)
        return TRUE;

    while(hay && *hay)
    {
        DWORD ret;

        if(strcmp(hay, "(null)") == 0 && !needle)
            return TRUE;

        ret = MultiByteToWideChar(CP_ACP, 0, hay, -1, wstr, sizeof(wstr)/sizeof(wstr[0]));
        if(ret == 0)
        {
            ok(0, "Failed to convert string\n");
            return FALSE;
        }

        if(lstrcmpW(wstr, needle) == 0)
            return TRUE;

        hay += strlen(hay) + 1;
    }

    return FALSE;
}

static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId)
{
    HRESULT hr;
    const struct knownFolderDef *known_folder = &known_folders[0];
    int csidl, expectedCsidl, ret;
    KNOWNFOLDER_DEFINITION kfd;
    IKnownFolder *folder;
    WCHAR sName[1024];
    BOOL *current_known_folder_found = &known_folder_found[0];
    BOOL found = FALSE;

    while(known_folder->folderId != NULL)
    {
        if(IsEqualGUID(known_folder->folderId, folderId))
        {
            *current_known_folder_found = TRUE;
            found = TRUE;
            /* verify CSIDL */
            if(!(known_folder->csidl & NO_CSIDL))
            {
                /* mask off winetest flags */
                expectedCsidl = known_folder->csidl & 0xFFFF;

                hr = IKnownFolderManager_FolderIdToCsidl(mgr, folderId, &csidl);
                ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot retrieve CSIDL for folder %s\n", known_folder->sFolderId);

                ok_(__FILE__, known_folder->line)(csidl == expectedCsidl, "invalid CSIDL retrieved for folder %s. %d (%s) expected, but %d found\n", known_folder->sFolderId, expectedCsidl, known_folder->sCsidl, csidl);
            }

            hr = IKnownFolderManager_GetFolder(mgr, folderId, &folder);
            ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder for %s\n", known_folder->sFolderId);
            if(SUCCEEDED(hr))
            {
                hr = IKnownFolder_GetFolderDefinition(folder, &kfd);
                ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder definition for %s\n", known_folder->sFolderId);
                if(SUCCEEDED(hr))
                {
                    ret = MultiByteToWideChar(CP_ACP, 0, known_folder->sName, -1,  sName, sizeof(sName)/sizeof(sName[0]));
                    ok_(__FILE__, known_folder->line)(ret != 0, "cannot convert known folder name \"%s\" to wide characters\n", known_folder->sName);

                    ok_(__FILE__, known_folder->line)(lstrcmpW(kfd.pszName, sName)==0, "invalid known folder name returned for %s: %s expected, but %s retrieved\n", known_folder->sFolderId, wine_dbgstr_w(sName), wine_dbgstr_w(kfd.pszName));

                    ok_(__FILE__, known_folder->line)(kfd.category == known_folder->category, "invalid known folder category for %s: %d expected, but %d retrieved\n", known_folder->sFolderId, known_folder->category, kfd.category);

                    ok_(__FILE__, known_folder->line)(IsEqualGUID(known_folder->fidParents[0], &kfd.fidParent) ||
                                                              IsEqualGUID(known_folder->fidParents[1], &kfd.fidParent),
                                                      "invalid known folder parent for %s: %s retrieved\n",
                                                      known_folder->sFolderId, wine_dbgstr_guid(&kfd.fidParent));

                    ok_(__FILE__, known_folder->line)(is_in_strarray(kfd.pszRelativePath, known_folder->sRelativePath), "invalid known folder relative path returned for %s: %s expected, but %s retrieved\n", known_folder->sFolderId, known_folder->sRelativePath, wine_dbgstr_w(kfd.pszRelativePath));

                    ok_(__FILE__, known_folder->line)(is_in_strarray(kfd.pszParsingName, known_folder->sParsingName), "invalid known folder parsing name returned for %s: %s retrieved\n", known_folder->sFolderId, wine_dbgstr_w(kfd.pszParsingName));

                    ok_(__FILE__, known_folder->line)(known_folder->attributes == kfd.dwAttributes ||
                            (known_folder->csidl & WINE_ATTRIBUTES_OPTIONAL && kfd.dwAttributes == 0),
                            "invalid known folder attributes for %s: 0x%08x expected, but 0x%08x retrieved\n", known_folder->sFolderId, known_folder->attributes, kfd.dwAttributes);

                    ok_(__FILE__, known_folder->line)(!(kfd.kfdFlags & (~known_folder->definitionFlags)), "invalid known folder flags for %s: 0x%08x expected, but 0x%08x retrieved\n", known_folder->sFolderId, known_folder->definitionFlags, kfd.kfdFlags);

                    FreeKnownFolderDefinitionFields(&kfd);
                }

            IKnownFolder_Release(folder);
            }

            break;
        }
        known_folder++;
        current_known_folder_found++;
    }

    if(!found)
    {
        trace("unknown known folder found: %s\n", wine_dbgstr_guid(folderId));

        hr = IKnownFolderManager_GetFolder(mgr, folderId, &folder);
        ok(hr == S_OK, "cannot get known folder for %s\n", wine_dbgstr_guid(folderId));
        if(SUCCEEDED(hr))
        {
            hr = IKnownFolder_GetFolderDefinition(folder, &kfd);
            todo_wine
            ok(hr == S_OK, "cannot get known folder definition for %s\n", wine_dbgstr_guid(folderId));
            if(SUCCEEDED(hr))
            {
                trace("  category: %d\n", kfd.category);
                trace("  name: %s\n", wine_dbgstr_w(kfd.pszName));
                trace("  description: %s\n", wine_dbgstr_w(kfd.pszDescription));
                trace("  parent: %s\n", wine_dbgstr_guid(&kfd.fidParent));
                trace("  relative path: %s\n", wine_dbgstr_w(kfd.pszRelativePath));
                trace("  parsing name: %s\n", wine_dbgstr_w(kfd.pszParsingName));
                trace("  tooltip: %s\n", wine_dbgstr_w(kfd.pszTooltip));
                trace("  localized name: %s\n", wine_dbgstr_w(kfd.pszLocalizedName));
                trace("  icon: %s\n", wine_dbgstr_w(kfd.pszIcon));
                trace("  security: %s\n", wine_dbgstr_w(kfd.pszSecurity));
                trace("  attributes: 0x%08x\n", kfd.dwAttributes);
                trace("  flags: 0x%08x\n", kfd.kfdFlags);
                trace("  type: %s\n", wine_dbgstr_guid(&kfd.ftidType));
                FreeKnownFolderDefinitionFields(&kfd);
            }

            IKnownFolder_Release(folder);
        }
    }
}
#undef NO_CSIDL

static void test_knownFolders(void)
{
    static const WCHAR sWindows[] = {'W','i','n','d','o','w','s',0};
    static const WCHAR sExample[] = {'E','x','a','m','p','l','e',0};
    static const WCHAR sExample2[] = {'E','x','a','m','p','l','e','2',0};
    static const WCHAR sSubFolder[] = {'S','u','b','F','o','l','d','e','r',0};
    static const WCHAR sBackslash[] = {'\\',0};
    static const KNOWNFOLDERID newFolderId = {0x01234567, 0x89AB, 0xCDEF, {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01} };
    static const KNOWNFOLDERID subFolderId = {0xFEDCBA98, 0x7654, 0x3210, {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} };
    HRESULT hr;
    IKnownFolderManager *mgr = NULL;
    IKnownFolder *folder = NULL, *subFolder = NULL;
    KNOWNFOLDERID folderId, *folders;
    KF_CATEGORY cat = 0;
    KNOWNFOLDER_DEFINITION kfDefinition, kfSubDefinition;
    int csidl, i;
    UINT nCount = 0;
    LPWSTR folderPath, errorMsg;
    KF_REDIRECTION_CAPABILITIES redirectionCapabilities = 1;
    WCHAR sWinDir[MAX_PATH], sExamplePath[MAX_PATH], sExample2Path[MAX_PATH], sSubFolderPath[MAX_PATH], sSubFolder2Path[MAX_PATH];
    BOOL bRes;
    DWORD dwAttributes;

    GetWindowsDirectoryW( sWinDir, MAX_PATH );

    GetTempPathW(sizeof(sExamplePath)/sizeof(sExamplePath[0]), sExamplePath);
    lstrcatW(sExamplePath, sExample);

    GetTempPathW(sizeof(sExample2Path)/sizeof(sExample2Path[0]), sExample2Path);
    lstrcatW(sExample2Path, sExample2);

    lstrcpyW(sSubFolderPath, sExamplePath);
    lstrcatW(sSubFolderPath, sBackslash);
    lstrcatW(sSubFolderPath, sSubFolder);

    lstrcpyW(sSubFolder2Path, sExample2Path);
    lstrcatW(sSubFolder2Path, sBackslash);
    lstrcatW(sSubFolder2Path, sSubFolder);

    CoInitialize(NULL);

    hr = CoCreateInstance(&CLSID_KnownFolderManager, NULL, CLSCTX_INPROC_SERVER,
                          &IID_IKnownFolderManager, (LPVOID*)&mgr);
    if(hr == REGDB_E_CLASSNOTREG)
        win_skip("IKnownFolderManager unavailable\n");
    else
    {
        IUnknown *unk;

        ok(hr == S_OK, "failed to create KnownFolderManager instance: 0x%08x\n", hr);

        hr = IKnownFolderManager_QueryInterface(mgr, &IID_IMarshal, (void**)&unk);
        ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);

        hr = IKnownFolderManager_FolderIdFromCsidl(mgr, CSIDL_WINDOWS, &folderId);
        ok(hr == S_OK, "failed to convert CSIDL to KNOWNFOLDERID: 0x%08x\n", hr);
        ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");

        hr = IKnownFolderManager_FolderIdToCsidl(mgr, &FOLDERID_Windows, &csidl);
        ok(hr == S_OK, "failed to convert CSIDL to KNOWNFOLDERID: 0x%08x\n", hr);
        ok(csidl == CSIDL_WINDOWS, "invalid CSIDL returned\n");

        hr = IKnownFolderManager_GetFolder(mgr, &FOLDERID_Windows, &folder);
        ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
        if(SUCCEEDED(hr))
        {
            hr = IKnownFolder_QueryInterface(folder, &IID_IMarshal, (void**)&unk);
            ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);

            hr = IKnownFolder_GetCategory(folder, &cat);
            ok(hr == S_OK, "failed to get folder category: 0x%08x\n", hr);
            ok(cat==KF_CATEGORY_FIXED, "invalid folder category: %d\n", cat);

            hr = IKnownFolder_GetId(folder, &folderId);
            ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
            ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");

            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
            ok(hr == S_OK, "failed to get path from known folder: 0x%08x\n", hr);
            ok(lstrcmpiW(sWinDir, folderPath)==0, "invalid path returned: \"%s\", expected: \"%s\"\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sWinDir));
            CoTaskMemFree(folderPath);

            hr = IKnownFolder_GetRedirectionCapabilities(folder, &redirectionCapabilities);
            todo_wine
            ok(hr == S_OK, "failed to get redirection capabilities: 0x%08x\n", hr);
            todo_wine
            ok(redirectionCapabilities==0, "invalid redirection capabilities returned: %d\n", redirectionCapabilities);

            hr = IKnownFolder_SetPath(folder, 0, sWinDir);
            todo_wine
            ok(hr == E_INVALIDARG, "unexpected value from SetPath: 0x%08x\n", hr);

            hr = IKnownFolder_GetFolderDefinition(folder, &kfDefinition);
            ok(hr == S_OK, "failed to get folder definition: 0x%08x\n", hr);
            if(SUCCEEDED(hr))
            {
                ok(kfDefinition.category==KF_CATEGORY_FIXED, "invalid folder category: 0x%08x\n", kfDefinition.category);
                ok(lstrcmpW(kfDefinition.pszName, sWindows)==0, "invalid folder name: %s\n", wine_dbgstr_w(kfDefinition.pszName));
                ok(kfDefinition.dwAttributes==0, "invalid folder attributes: %d\n", kfDefinition.dwAttributes);
                FreeKnownFolderDefinitionFields(&kfDefinition);
            }

            hr = IKnownFolder_Release(folder);
            ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
        }

        hr = IKnownFolderManager_GetFolderByName(mgr, sWindows, &folder);
        todo_wine
        ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
        if(SUCCEEDED(hr))
        {
            hr = IKnownFolder_GetId(folder, &folderId);
            ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
            ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");

            hr = IKnownFolder_Release(folder);
            ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
        }

        for(i=0; i<sizeof(known_folder_found)/sizeof(known_folder_found[0]); ++i)
            known_folder_found[i] = FALSE;

        hr = IKnownFolderManager_GetFolderIds(mgr, &folders, &nCount);
        ok(hr == S_OK, "failed to get known folders: 0x%08x\n", hr);
        for(i=0;i<nCount;++i)
            check_known_folder(mgr, &folders[i]);

        for(i=0; i<sizeof(known_folder_found)/sizeof(known_folder_found[0]); ++i)
            if(!known_folder_found[i])
                trace("Known folder %s not found on current platform\n", known_folders[i].sFolderId);

        CoTaskMemFree(folders);

        /* test of registering new known folders */
        bRes = CreateDirectoryW(sExamplePath, NULL);
        ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sExamplePath));
        bRes = CreateDirectoryW(sExample2Path, NULL);
        ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sExample2Path));
        bRes = CreateDirectoryW(sSubFolderPath, NULL);
        ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolderPath));

        ZeroMemory(&kfDefinition, sizeof(kfDefinition));
        kfDefinition.category = KF_CATEGORY_PERUSER;
        kfDefinition.pszName = CoTaskMemAlloc(sizeof(sExample));
        lstrcpyW(kfDefinition.pszName, sExample);
        kfDefinition.pszDescription = CoTaskMemAlloc(sizeof(sExample));
        lstrcpyW(kfDefinition.pszDescription, sExample);
        kfDefinition.pszRelativePath = CoTaskMemAlloc(sizeof(sExamplePath));
        lstrcpyW(kfDefinition.pszRelativePath, sExamplePath);

        hr = IKnownFolderManager_RegisterFolder(mgr, &newFolderId, &kfDefinition);
        if(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED))
            win_skip("No permissions required to register custom known folder\n");
        else
        {
            ok(hr == S_OK, "failed to register known folder: 0x%08x\n", hr);
            if(SUCCEEDED(hr))
            {
                hr = IKnownFolderManager_GetFolder(mgr, &newFolderId, &folder);
                ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
                if(SUCCEEDED(hr))
                {
                    hr = IKnownFolder_GetCategory(folder, &cat);
                    ok(hr == S_OK, "failed to get folder category: hr=0x%0x\n", hr);
                    ok(cat == KF_CATEGORY_PERUSER, "invalid category returned: %d, while %d (KF_CATEGORY_PERUSER) expected\n", cat, KF_CATEGORY_PERUSER);

                    hr = IKnownFolder_GetId(folder, &folderId);
                    ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
                    ok(IsEqualGUID(&folderId, &newFolderId)==TRUE, "invalid KNOWNFOLDERID returned\n");

                    /* current path should be Temp\Example */
                    hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                    ok(hr == S_OK, "failed to get path from known folder: 0x%08x\n", hr);
                    ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                    CoTaskMemFree(folderPath);

                    /* register sub-folder and mark it as child of Example folder */
                    ZeroMemory(&kfSubDefinition, sizeof(kfSubDefinition));
                    kfSubDefinition.category = KF_CATEGORY_PERUSER;
                    kfSubDefinition.pszName = CoTaskMemAlloc(sizeof(sSubFolder));
                    lstrcpyW(kfSubDefinition.pszName, sSubFolder);
                    kfSubDefinition.pszDescription = CoTaskMemAlloc(sizeof(sSubFolder));
                    lstrcpyW(kfSubDefinition.pszDescription, sSubFolder);
                    kfSubDefinition.pszRelativePath = CoTaskMemAlloc(sizeof(sSubFolder));
                    lstrcpyW(kfSubDefinition.pszRelativePath, sSubFolder);
                    kfSubDefinition.fidParent = newFolderId;

                    hr = IKnownFolderManager_RegisterFolder(mgr, &subFolderId, &kfSubDefinition);
                    ok(hr == S_OK, "failed to register known folder: 0x%08x\n", hr);
                    if(SUCCEEDED(hr))
                    {

                        hr = IKnownFolderManager_GetFolder(mgr, &subFolderId, &subFolder);
                        ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
                        if(SUCCEEDED(hr))
                        {
                            /* check sub folder path */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
                            CoTaskMemFree(folderPath);


                            /* try to redirect Example to Temp\Example2  */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 0, NULL, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder - it should fail now, as we redirected its parent folder, but we have no sub folder in new location */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "unexpected value from GetPath(): 0x%08x\n", hr);
                            ok(folderPath==NULL, "invalid known folder path retrieved: \"%s\" when NULL pointer was expected\n", wine_dbgstr_w(folderPath));
                            CoTaskMemFree(folderPath);


                            /* set Example path to original. Using SetPath() is valid here, as it also uses redirection internally */
                            hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
                            ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                            CoTaskMemFree(folderPath);


                            /* create sub folder in Temp\Example2 */
                            bRes = CreateDirectoryW(sSubFolder2Path, NULL);
                            ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolder2Path));

                            /* again perform that same redirection */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 0, NULL, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify sub folder. It should succeed now, as the required sub folder exists */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
                            CoTaskMemFree(folderPath);

                            /* remove newly created directory */
                            RemoveDirectoryW(sSubFolder2Path);

                            /* verify sub folder. It still succeedes, so Windows does not check folder presence each time */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            todo_wine
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            todo_wine
                            ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
                            CoTaskMemFree(folderPath);


                            /* set Example path to original */
                            hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
                            ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
                            CoTaskMemFree(folderPath);


                            /* create sub folder in Temp\Example2 */
                            bRes = CreateDirectoryW(sSubFolder2Path, NULL);
                            ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolder2Path));

                            /* do that same redirection, but try to exclude sub-folder */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 1, &subFolderId, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder. Unexpectedly, this path was also changed. So, exclusion seems to be ignored (Windows bug)? This test however will let us know, if this behavior is changed */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
                            CoTaskMemFree(folderPath);

                            /* remove newly created directory */
                            RemoveDirectoryW(sSubFolder2Path);


                            /* set Example path to original */
                            hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
                            ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
                            CoTaskMemFree(folderPath);


                            /* do that same redirection again, but set it to copy content. It should also copy the sub folder, so checking it would succeed now */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS, sExample2Path, 0, NULL, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
                            CoTaskMemFree(folderPath);

                            /* remove copied directory */
                            RemoveDirectoryW(sSubFolder2Path);


                            /* set Example path to original */
                            hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
                            ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
                            CoTaskMemFree(folderPath);


                            /* redirect again, set it to copy content and remove originals */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS | KF_REDIRECT_DEL_SOURCE_CONTENTS, sExample2Path, 0, NULL, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
                            CoTaskMemFree(folderPath);

                            /* check if original directory was really removed */
                            dwAttributes = GetFileAttributesW(sExamplePath);
                            ok(dwAttributes==INVALID_FILE_ATTRIBUTES, "directory should not exist, but has attributes: 0x%08x\n", dwAttributes );


                            /* redirect (with copy) to original path */
                            hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS,  sExamplePath, 0, NULL, &errorMsg);
                            ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));

                            /* verify */
                            hr = IKnownFolder_GetPath(folder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
                            CoTaskMemFree(folderPath);

                            /* verify sub folder */
                            hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
                            ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
                            ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
                            CoTaskMemFree(folderPath);

                            /* check shell utility functions */
                            if(!pSHGetKnownFolderPath || !pSHSetKnownFolderPath)
                                todo_wine
                                win_skip("cannot get SHGet/SetKnownFolderPath routines\n");
                            else
                            {
                                /* try to get current known folder path */
                                hr = pSHGetKnownFolderPath(&newFolderId, 0, NULL, &folderPath);
                                todo_wine
                                ok(hr==S_OK, "cannot get known folder path: hr=0x%0x\n", hr);
                                todo_wine
                                ok(lstrcmpW(folderPath, sExamplePath)==0, "invalid path returned: %s\n", wine_dbgstr_w(folderPath));

                                /* set it to new value */
                                hr = pSHSetKnownFolderPath(&newFolderId, 0, NULL, sExample2Path);
                                todo_wine
                                ok(hr==S_OK, "cannot set known folder path: hr=0x%0x\n", hr);

                                /* check if it changed */
                                hr = pSHGetKnownFolderPath(&newFolderId, 0, NULL, &folderPath);
                                todo_wine
                                ok(hr==S_OK, "cannot get known folder path: hr=0x%0x\n", hr);
                                todo_wine
                                ok(lstrcmpW(folderPath, sExample2Path)==0, "invalid path returned: %s\n", wine_dbgstr_w(folderPath));

                                /* set it back */
                                hr = pSHSetKnownFolderPath(&newFolderId, 0, NULL, sExamplePath);
                                todo_wine
                                ok(hr==S_OK, "cannot set known folder path: hr=0x%0x\n", hr);
                            }

                            IKnownFolder_Release(subFolder);
                        }

                        hr = IKnownFolderManager_UnregisterFolder(mgr, &subFolderId);
                        ok(hr == S_OK, "failed to unregister folder: 0x%08x\n", hr);
                    }

                    FreeKnownFolderDefinitionFields(&kfSubDefinition);

                    hr = IKnownFolder_Release(folder);
                    ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);

                    /* update the folder */
                    CoTaskMemFree(kfDefinition.pszName);
                    kfDefinition.pszName = CoTaskMemAlloc(sizeof(sExample2));
                    lstrcpyW(kfDefinition.pszName, sExample2);
                    hr = IKnownFolderManager_RegisterFolder(mgr, &newFolderId, &kfDefinition);
                    ok(hr == S_OK, "failed to re-register known folder: 0x%08x\n", hr);

                    hr = IKnownFolderManager_GetFolder(mgr, &newFolderId, &folder);
                    ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);

                    hr = IKnownFolder_GetFolderDefinition(folder, &kfSubDefinition);
                    ok(hr == S_OK, "failed to get folder definition: 0x%08x\n", hr);
                    ok(!memcmp(kfDefinition.pszName, kfSubDefinition.pszName, sizeof(sExample2)),
                            "Got wrong updated name: %s\n", wine_dbgstr_w(kfSubDefinition.pszName));

                    FreeKnownFolderDefinitionFields(&kfSubDefinition);

                    hr = IKnownFolder_Release(folder);
                    ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
                }

                hr = IKnownFolderManager_UnregisterFolder(mgr, &newFolderId);
                ok(hr == S_OK, "failed to unregister folder: 0x%08x\n", hr);
            }
        }
        FreeKnownFolderDefinitionFields(&kfDefinition);

        RemoveDirectoryW(sSubFolder2Path);
        RemoveDirectoryW(sSubFolderPath);
        RemoveDirectoryW(sExamplePath);
        RemoveDirectoryW(sExample2Path);

        hr = IKnownFolderManager_Release(mgr);
        ok(hr == S_OK, "failed to release KnownFolderManager instance: 0x%08x\n", hr);
    }
    CoUninitialize();
}


static void test_DoEnvironmentSubst(void)
{
    WCHAR expectedW[MAX_PATH];
    WCHAR bufferW[MAX_PATH];
    CHAR  expectedA[MAX_PATH];
    CHAR  bufferA[MAX_PATH];
    DWORD res;
    DWORD res2;
    DWORD len;
    INT   i;
    static const WCHAR does_not_existW[] = {'%','D','O','E','S','_','N','O','T','_','E','X','I','S','T','%',0};
    static const CHAR  does_not_existA[] = "%DOES_NOT_EXIST%";
    static const CHAR  *names[] = {
                            /* interactive apps and services (works on all windows versions) */
                            "%ALLUSERSPROFILE%", "%APPDATA%", "%LOCALAPPDATA%",
                            "%NUMBER_OF_PROCESSORS%", "%OS%", "%PROCESSOR_ARCHITECTURE%",
                            "%PROCESSOR_IDENTIFIER%", "%PROCESSOR_LEVEL%", "%PROCESSOR_REVISION%",
                            "%ProgramFiles%", "%SystemDrive%",
                            "%SystemRoot%", "%USERPROFILE%", "%windir%",
                            /* todo_wine: "%COMPUTERNAME%", "%ProgramData%", "%PUBLIC%", */

                            /* replace more than one var is allowed */
                            "%HOMEDRIVE%%HOMEPATH%",
                            "%OS% %windir%"}; /* always the last entry in the table */

    for (i = 0; i < (sizeof(names)/sizeof(LPSTR)); i++)
    {
        memset(bufferA, '#', MAX_PATH - 1);
        bufferA[MAX_PATH - 1] = 0;
        lstrcpyA(bufferA, names[i]);
        MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));

        res2 = ExpandEnvironmentStringsA(names[i], expectedA, MAX_PATH);
        res = DoEnvironmentSubstA(bufferA, MAX_PATH);

        /* is the space for the terminating 0 included? */
        if (!i && HIWORD(res) && (LOWORD(res) == (lstrlenA(bufferA))))
        {
            win_skip("DoEnvironmentSubstA/W are broken on NT 4\n");
            return;
        }
        ok(HIWORD(res) && (LOWORD(res) == res2),
            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
        ok(!lstrcmpA(bufferA, expectedA),
            "%d: got %s (expected %s)\n", i, bufferA, expectedA);

        res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
        res = DoEnvironmentSubstW(bufferW, MAX_PATH);
        ok(HIWORD(res) && (LOWORD(res) == res2),
            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
        ok(!lstrcmpW(bufferW, expectedW),
            "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
    }

    i--; /* reuse data in the last table entry */
    len = LOWORD(res); /* needed length */

    /* one character extra is fine */
    memset(bufferA, '#', MAX_PATH - 1);
    bufferA[len + 2] = 0;
    lstrcpyA(bufferA, names[i]);
    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));

    res2 = ExpandEnvironmentStringsA(bufferA, expectedA, MAX_PATH);
    res = DoEnvironmentSubstA(bufferA, len + 1);
    ok(HIWORD(res) && (LOWORD(res) == res2),
        "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
    ok(!lstrcmpA(bufferA, expectedA),
        "+1: got %s (expected %s)\n", bufferA, expectedA);

    res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
    res = DoEnvironmentSubstW(bufferW, len + 1);
    ok(HIWORD(res) && (LOWORD(res) == res2),
        "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
    ok(!lstrcmpW(bufferW, expectedW),
        "+1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));


    /* minimal buffer length (result string and terminating 0) */
    memset(bufferA, '#', MAX_PATH - 1);
    bufferA[len + 2] = 0;
    lstrcpyA(bufferA, names[i]);
    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));

    /* ANSI version failed without an extra byte, as documented on msdn */
    res = DoEnvironmentSubstA(bufferA, len);
    ok(!HIWORD(res) && (LOWORD(res) == len),
        " 0: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len);
    ok(!lstrcmpA(bufferA, names[i]),
        " 0: got %s (expected %s)\n", bufferA, names[i]);

    /* DoEnvironmentSubstW works as expected */
    res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
    res = DoEnvironmentSubstW(bufferW, len);
    ok(HIWORD(res) && (LOWORD(res) == res2),
        " 0: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
    ok(!lstrcmpW(bufferW, expectedW),
        " 0: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));


    /* Buffer too small */
    /* result: FALSE / provided buffer length / the buffer is untouched */
    memset(bufferA, '#', MAX_PATH - 1);
    bufferA[len + 2] = 0;
    lstrcpyA(bufferA, names[i]);
    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));

    res = DoEnvironmentSubstA(bufferA, len - 1);
    ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
        "-1: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
    ok(!lstrcmpA(bufferA, names[i]),
        "-1: got %s (expected %s)\n", bufferA, names[i]);

    lstrcpyW(expectedW, bufferW);
    res = DoEnvironmentSubstW(bufferW, len - 1);
    ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
        "-1: got %d/%d  (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
    ok(!lstrcmpW(bufferW, expectedW),
        "-1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));


    /* unknown variable */
    /* result: TRUE / string length including terminating 0 / the buffer is untouched */
    memset(bufferA, '#', MAX_PATH - 1);
    bufferA[MAX_PATH - 1] = 0;
    lstrcpyA(bufferA, does_not_existA);
    MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, sizeof(bufferW)/sizeof(WCHAR));

    res2 = lstrlenA(does_not_existA) + 1;
    res = DoEnvironmentSubstA(bufferA, MAX_PATH);
    ok(HIWORD(res) && (LOWORD(res) == res2),
            "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
    ok(!lstrcmpA(bufferA, does_not_existA),
        "%d: got %s (expected %s)\n", i, bufferA, does_not_existA);

    res = DoEnvironmentSubstW(bufferW, MAX_PATH);
    ok(HIWORD(res) && (LOWORD(res) == res2),
        "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
    ok(!lstrcmpW(bufferW, does_not_existW),
        "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(does_not_existW));


    if (0)
    {
        /* NULL crashes on windows */
        res = DoEnvironmentSubstA(NULL, MAX_PATH);
        res = DoEnvironmentSubstW(NULL, MAX_PATH);
    }
}

static void test_PathYetAnotherMakeUniqueName(void)
{
    static const WCHAR shortW[] = {'f','i','l','e','.','t','s','t',0};
    static const WCHAR short2W[] = {'f','i','l','e',' ','(','2',')','.','t','s','t',0};
    static const WCHAR tmpW[] = {'t','m','p',0};
    static const WCHAR longW[] = {'n','a','m','e',0};
    static const WCHAR long2W[] = {'n','a','m','e',' ','(','2',')',0};
    WCHAR nameW[MAX_PATH], buffW[MAX_PATH], pathW[MAX_PATH];
    HANDLE file;
    BOOL ret;

    if (!pPathYetAnotherMakeUniqueName)
    {
        win_skip("PathYetAnotherMakeUniqueName() is not available.\n");
        return;
    }

if (0)
{
    /* crashes on Windows */
    ret = pPathYetAnotherMakeUniqueName(NULL, NULL, NULL, NULL);
    ok(!ret, "got %d\n", ret);

    ret = pPathYetAnotherMakeUniqueName(nameW, NULL, NULL, NULL);
    ok(!ret, "got %d\n", ret);
}

    GetTempPathW(sizeof(pathW)/sizeof(WCHAR), pathW);

    /* Using short name only first */
    nameW[0] = 0;
    ret = pPathYetAnotherMakeUniqueName(nameW, pathW, shortW, NULL);
    ok(ret, "got %d\n", ret);
    lstrcpyW(buffW, pathW);
    lstrcatW(buffW, shortW);
    ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));

    /* now create a file with this name and get next name */
    file = CreateFileW(nameW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
    ok(file != NULL, "got %p\n", file);

    nameW[0] = 0;
    ret = pPathYetAnotherMakeUniqueName(nameW, pathW, shortW, NULL);
    ok(ret, "got %d\n", ret);
    lstrcpyW(buffW, pathW);
    lstrcatW(buffW, short2W);
    ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));

    CloseHandle(file);

    /* Using short and long */
    nameW[0] = 0;
    ret = pPathYetAnotherMakeUniqueName(nameW, pathW, tmpW, longW);
    ok(ret, "got %d\n", ret);
    lstrcpyW(buffW, pathW);
    lstrcatW(buffW, longW);
    ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));

    file = CreateFileW(nameW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
    ok(file != NULL, "got %p\n", file);

    nameW[0] = 0;
    ret = pPathYetAnotherMakeUniqueName(nameW, pathW, tmpW, longW);
    ok(ret, "got %d\n", ret);
    lstrcpyW(buffW, pathW);
    lstrcatW(buffW, long2W);
    ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));

    CloseHandle(file);

    /* Using long only */
    nameW[0] = 0;
    ret = pPathYetAnotherMakeUniqueName(nameW, pathW, NULL, longW);
    ok(ret, "got %d\n", ret);
    lstrcpyW(buffW, pathW);
    lstrcatW(buffW, longW);
    ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
}

static void test_SHGetKnownFolderIDList(void)
{
    PIDLIST_ABSOLUTE pidl;
    HRESULT hr;

    if (!pSHGetKnownFolderIDList)
    {
        win_skip("SHGetKnownFolderIDList is not available.\n");
        return;
    }

    hr = pSHGetKnownFolderIDList(NULL, 0, NULL, NULL);
    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);

if (0) { /* crashes on native */
    pidl = (void*)0xdeadbeef;
    hr = pSHGetKnownFolderIDList(NULL, 0, NULL, &pidl);
}
    /* not a known folder */
    pidl = (void*)0xdeadbeef;
    hr = pSHGetKnownFolderIDList(&IID_IUnknown, 0, NULL, &pidl);
    ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
    ok(pidl == NULL, "got %p\n", pidl);

    hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, NULL);
    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);

    hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, &pidl);
    ok(hr == S_OK, "got 0x%08x\n", hr);
    CoTaskMemFree(pidl);
}

START_TEST(shellpath)
{
    if (!init()) return;

    loadShell32();
    pGetSystemWow64DirectoryA = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"),
                                                        "GetSystemWow64DirectoryA" );
    if (myARGC >= 3)
        doChild(myARGV[2]);
    else
    {
        /* Report missing functions once */
        if (!pSHGetFolderLocation)
            win_skip("SHGetFolderLocation is not available\n");

        /* first test various combinations of parameters: */
        test_parameters();

        /* check known values: */
        test_PidlTypes();
        test_GUIDs();
        test_EnvVars();
        testWinDir();
        testSystemDir();
        test_NonExistentPath();
        test_SHGetFolderPathEx();
        test_knownFolders();
        test_DoEnvironmentSubst();
        test_PathYetAnotherMakeUniqueName();
        test_SHGetKnownFolderIDList();
    }
}
