ReactOS 0.4.15-dev-5895-g2687c1b
shellpath.c File Reference
#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"
Include dependency graph for shellpath.c:

Go to the source code of this file.

Classes

struct  shellExpectedValues
 
struct  knownFolderDef
 

Macros

#define COBJMACROS
 
#define OLD_CSIDL_MYDOCUMENTS   0x000c
 
#define PT_CPL   0x01 /* no path */
 
#define PT_GUID   0x1f /* no path */
 
#define PT_DRIVE   0x23 /* has path */
 
#define PT_DRIVE2   0x25 /* has path */
 
#define PT_SHELLEXT   0x2e /* no path */
 
#define PT_FOLDER   0x31 /* has path */
 
#define PT_FOLDERW   0x35 /* has path */
 
#define PT_WORKGRP   0x41 /* no path */
 
#define PT_YAGUID   0x70 /* no path */
 
#define PT_IESPECIAL2   0xb1 /* has path */
 
#define DECLARE_TYPE(x, y)   { x, ARRAY_SIZE(y), y }
 
#define GET_PROC(func)
 
#define CSIDL_PROFILES   0x003e
 
#define CSIDL_TO_STR(x)   case x: return#x;
 
#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__ }
 

Functions

 DEFINE_GUID (GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
 
static HRESULT (WINAPI *pDllGetVersion)(DLLVERSIONINFO *)
 
static LPITEMIDLIST *static BOOL (WINAPI *pSHGetSpecialFolderPathA)(HWND
 
static LPITEMIDLIST *static LPITEMIDLIST (WINAPI *pILFindLastID)(LPCITEMIDLIST)
 
static int (WINAPI *pSHFileOperationA)(LPSHFILEOPSTRUCTA)
 
static UINT (WINAPI *pGetSystemWow64DirectoryA)(LPSTR
 
static void loadShell32 (void)
 
static const chargetFolderName (int folder)
 
static void test_parameters (void)
 
static BYTE testSHGetFolderLocation (int folder)
 
static BYTE testSHGetSpecialFolderLocation (int folder)
 
static void test_SHGetFolderPath (BOOL optional, int folder)
 
static void test_SHGetSpecialFolderPath (BOOL optional, int folder)
 
static void test_ShellValues (const struct shellExpectedValues testEntries[], int numEntries, BOOL optional)
 
static void matchSpecialFolderPathToEnv (int folder, const char *envVar)
 
static void matchGUID (int folder, const GUID *guid, const GUID *guid_alt)
 
static void test_PidlTypes (void)
 
 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)
 
static void test_GUIDs (void)
 
static void test_EnvVars (void)
 
static BOOL myPathIsRootA (LPCSTR lpszPath)
 
static LPSTR myPathRemoveBackslashA (LPSTR lpszPath)
 
static void testWinDir (void)
 
static void testSystemDir (void)
 
static BOOL init (void)
 
static void doChild (const char *arg)
 
static void test_NonExistentPath (void)
 
static void test_SHGetFolderPathEx (void)
 
static BOOL is_in_strarray (const WCHAR *needle, const char *hay)
 
static void check_known_folder (IKnownFolderManager *mgr, KNOWNFOLDERID *folderId)
 
static void test_knownFolders (void)
 
static void test_DoEnvironmentSubst (void)
 
static void test_PathYetAnotherMakeUniqueName (void)
 
static void test_SHGetKnownFolderIDList (void)
 
 START_TEST (shellpath)
 

Variables

static GUID CLSID_CommonDocuments = { 0x0000000c, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x1a } }
 
static int
 
static HANDLE
 
static DWORD
 
static LPSTR
 
static LPITEMIDLIST *static BOOL
 
static UINT
 
static PWSTR *static PWSTR
 
static LPWSTR
 
static PCWSTR
 
static 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 }
 
static const BYTE folderOrSpecialType [] = { PT_FOLDER, PT_IESPECIAL2 }
 
static const BYTE personalType []
 
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 }
 
static const struct shellExpectedValues requiredShellValues []
 
static const struct shellExpectedValues optionalShellValues []
 
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} }
 
static const struct knownFolderDef known_folders []
 
BOOL known_folder_found [ARRAY_SIZE(known_folders)]
 
static int myARGC
 
static char ** myARGV
 
static char base [MAX_PATH]
 
static char selfname [MAX_PATH]
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 24 of file shellpath.c.

◆ CSIDL_PROFILES

#define CSIDL_PROFILES   0x003e

Definition at line 231 of file shellpath.c.

◆ CSIDL_TO_STR

#define CSIDL_TO_STR (   x)    case x: return#x;

◆ DECLARE_TYPE

#define DECLARE_TYPE (   x,
  y 
)    { x, ARRAY_SIZE(y), y }

Definition at line 117 of file shellpath.c.

◆ GET_PROC

#define GET_PROC (   func)
Value:
p ## func = (void*)GetProcAddress(hShell32, #func); \
if(!p ## func) \
trace("GetProcAddress(%s) failed\n", #func);
#define GetProcAddress(x, y)
Definition: compat.h:753
GLenum func
Definition: glext.h:6028
GLfloat GLfloat p
Definition: glext.h:8902
static HMODULE hShell32
Definition: string.c:34

◆ KNOWN_FOLDER

#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__ }

Definition at line 310 of file shellpath.c.

◆ NO_CSIDL

#define NO_CSIDL   0x10000

Definition at line 308 of file shellpath.c.

◆ OLD_CSIDL_MYDOCUMENTS

#define OLD_CSIDL_MYDOCUMENTS   0x000c

Definition at line 42 of file shellpath.c.

◆ PT_CPL

#define PT_CPL   0x01 /* no path */

Definition at line 48 of file shellpath.c.

◆ PT_DRIVE

#define PT_DRIVE   0x23 /* has path */

Definition at line 54 of file shellpath.c.

◆ PT_DRIVE2

#define PT_DRIVE2   0x25 /* has path */

Definition at line 57 of file shellpath.c.

◆ PT_FOLDER

#define PT_FOLDER   0x31 /* has path */

Definition at line 63 of file shellpath.c.

◆ PT_FOLDERW

#define PT_FOLDERW   0x35 /* has path */

Definition at line 66 of file shellpath.c.

◆ PT_GUID

#define PT_GUID   0x1f /* no path */

Definition at line 51 of file shellpath.c.

◆ PT_IESPECIAL2

#define PT_IESPECIAL2   0xb1 /* has path */

Definition at line 76 of file shellpath.c.

◆ PT_SHELLEXT

#define PT_SHELLEXT   0x2e /* no path */

Definition at line 60 of file shellpath.c.

◆ PT_WORKGRP

#define PT_WORKGRP   0x41 /* no path */

Definition at line 69 of file shellpath.c.

◆ PT_YAGUID

#define PT_YAGUID   0x70 /* no path */

Definition at line 72 of file shellpath.c.

◆ WINE_ATTRIBUTES_OPTIONAL

#define WINE_ATTRIBUTES_OPTIONAL   0x20000

Definition at line 309 of file shellpath.c.

Function Documentation

◆ BOOL()

static LPITEMIDLIST *static BOOL ( WINAPI pSHGetSpecialFolderPathA)
static

◆ check_known_folder()

static void check_known_folder ( IKnownFolderManager mgr,
KNOWNFOLDERID folderId 
)
static

Definition at line 1967 of file shellpath.c.

1968{
1969 HRESULT hr;
1970 int csidl, expectedCsidl, ret;
1972 IKnownFolder *folder;
1973 WCHAR sName[1024];
1974 BOOL found = FALSE;
1975 unsigned int i;
1976
1977 for (i = 0; i < ARRAY_SIZE(known_folders); ++i)
1978 {
1979 const struct knownFolderDef *known_folder = &known_folders[i];
1980
1981 if(IsEqualGUID(known_folder->folderId, folderId))
1982 {
1984 found = TRUE;
1985 /* verify CSIDL */
1986 if(!(known_folder->csidl & NO_CSIDL))
1987 {
1988 /* mask off winetest flags */
1989 expectedCsidl = known_folder->csidl & 0xFFFF;
1990
1991 hr = IKnownFolderManager_FolderIdToCsidl(mgr, folderId, &csidl);
1992 ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot retrieve CSIDL for folder %s\n", known_folder->sFolderId);
1993
1994 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);
1995 }
1996
1997 hr = IKnownFolderManager_GetFolder(mgr, folderId, &folder);
1998 ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder for %s\n", known_folder->sFolderId);
1999 if(SUCCEEDED(hr))
2000 {
2001 hr = IKnownFolder_GetFolderDefinition(folder, &kfd);
2002 ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder definition for %s\n", known_folder->sFolderId);
2003 if(SUCCEEDED(hr))
2004 {
2005 ret = MultiByteToWideChar(CP_ACP, 0, known_folder->sName, -1, sName, ARRAY_SIZE(sName));
2006 ok_(__FILE__, known_folder->line)(ret != 0, "cannot convert known folder name \"%s\" to wide characters\n", known_folder->sName);
2007
2008 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));
2009
2010 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);
2011
2012 ok_(__FILE__, known_folder->line)(IsEqualGUID(known_folder->fidParents[0], &kfd.fidParent) ||
2013 IsEqualGUID(known_folder->fidParents[1], &kfd.fidParent),
2014 "invalid known folder parent for %s: %s retrieved\n",
2015 known_folder->sFolderId, wine_dbgstr_guid(&kfd.fidParent));
2016
2017 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));
2018
2019 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));
2020
2021 ok_(__FILE__, known_folder->line)(known_folder->attributes == kfd.dwAttributes ||
2022 (known_folder->csidl & WINE_ATTRIBUTES_OPTIONAL && kfd.dwAttributes == 0),
2023 "invalid known folder attributes for %s: 0x%08x expected, but 0x%08x retrieved\n", known_folder->sFolderId, known_folder->attributes, kfd.dwAttributes);
2024
2025 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);
2026
2028 }
2029
2030 IKnownFolder_Release(folder);
2031 }
2032
2033 break;
2034 }
2035 }
2036
2037 if(!found)
2038 {
2039 trace("unknown known folder found: %s\n", wine_dbgstr_guid(folderId));
2040
2041 hr = IKnownFolderManager_GetFolder(mgr, folderId, &folder);
2042 ok(hr == S_OK, "cannot get known folder for %s\n", wine_dbgstr_guid(folderId));
2043 if(SUCCEEDED(hr))
2044 {
2045 hr = IKnownFolder_GetFolderDefinition(folder, &kfd);
2046 todo_wine
2047 ok(hr == S_OK, "cannot get known folder definition for %s\n", wine_dbgstr_guid(folderId));
2048 if(SUCCEEDED(hr))
2049 {
2050 trace(" category: %d\n", kfd.category);
2051 trace(" name: %s\n", wine_dbgstr_w(kfd.pszName));
2052 trace(" description: %s\n", wine_dbgstr_w(kfd.pszDescription));
2053 trace(" parent: %s\n", wine_dbgstr_guid(&kfd.fidParent));
2054 trace(" relative path: %s\n", wine_dbgstr_w(kfd.pszRelativePath));
2055 trace(" parsing name: %s\n", wine_dbgstr_w(kfd.pszParsingName));
2056 trace(" tooltip: %s\n", wine_dbgstr_w(kfd.pszTooltip));
2057 trace(" localized name: %s\n", wine_dbgstr_w(kfd.pszLocalizedName));
2058 trace(" icon: %s\n", wine_dbgstr_w(kfd.pszIcon));
2059 trace(" security: %s\n", wine_dbgstr_w(kfd.pszSecurity));
2060 trace(" attributes: 0x%08x\n", kfd.dwAttributes);
2061 trace(" flags: 0x%08x\n", kfd.kfdFlags);
2062 trace(" type: %s\n", wine_dbgstr_guid(&kfd.ftidType));
2064 }
2065
2066 IKnownFolder_Release(folder);
2067 }
2068 }
2069}
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(A)
Definition: main.h:33
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define wine_dbgstr_w
Definition: kernel32.h:34
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define todo_wine
Definition: custom.c:79
#define NO_CSIDL
Definition: shellpath.c:308
static BOOL is_in_strarray(const WCHAR *needle, const char *hay)
Definition: shellpath.c:1937
BOOL known_folder_found[ARRAY_SIZE(known_folders)]
Definition: shellpath.c:1311
#define WINE_ATTRIBUTES_OPTIONAL
Definition: shellpath.c:309
static const struct knownFolderDef known_folders[]
Definition: shellpath.c:343
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
HRESULT hr
Definition: shlfolder.c:183
static void FreeKnownFolderDefinitionFields(KNOWNFOLDER_DEFINITION *pKFD)
Definition: shobjidl.idl:4032
Definition: fci.c:116
const DWORD attributes
Definition: shellpath.c:329
const char * sRelativePath
Definition: shellpath.c:327
const KF_CATEGORY category
Definition: shellpath.c:325
const int csidl
Definition: shellpath.c:322
const KNOWNFOLDERID * folderId
Definition: shellpath.c:320
const char * sFolderId
Definition: shellpath.c:321
const char * sName
Definition: shellpath.c:324
const KF_DEFINITION_FLAGS definitionFlags
Definition: shellpath.c:330
const char * sCsidl
Definition: shellpath.c:323
const int line
Definition: shellpath.c:331
const KNOWNFOLDERID * fidParents[2]
Definition: shellpath.c:326
const char * sParsingName
Definition: shellpath.c:328
KF_DEFINITION_FLAGS kfdFlags
Definition: shobjidl.idl:3913
int ret
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by test_knownFolders().

◆ DEFINE_GUID() [1/3]

DEFINE_GUID ( _CLSID_Documents  ,
0xA8CDFF1C  ,
0x4878  ,
0x43be  ,
0xB5  ,
0xFD  ,
0xF8  ,
0x09  ,
0x1C  ,
0x1C  ,
0x60  ,
0xD0   
)

◆ DEFINE_GUID() [2/3]

DEFINE_GUID ( CLSID_NetworkExplorerFolder  ,
0xF02C1A0D  ,
0xBE21  ,
0x4350  ,
0x88  ,
0xB0  ,
0x73  ,
0x67  ,
0xFC  ,
0x96  ,
0xEF  ,
0x3C   
)

◆ DEFINE_GUID() [3/3]

DEFINE_GUID ( GUID_NULL  ,
,
,
,
,
,
,
,
,
,
,
 
)

◆ doChild()

static void doChild ( const char arg)
static

Definition at line 1693 of file shellpath.c.

1694{
1695 char path[MAX_PATH];
1696 HRESULT hr;
1697
1698 if (arg[0] == '1')
1699 {
1700 LPITEMIDLIST pidl;
1701 char *p;
1702
1703 /* test what happens when CSIDL_FAVORITES is set to a nonexistent directory */
1704
1705 /* test some failure cases first: */
1706 hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path);
1708 "SHGetFolderPath returned 0x%08x, expected 0x80070002\n", hr);
1709
1710 pidl = NULL;
1711 hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, NULL, 0, &pidl);
1713 "SHGetFolderLocation returned 0x%08x\n", hr);
1714 if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl);
1715
1716 ok(!pSHGetSpecialFolderPathA(NULL, path, CSIDL_FAVORITES, FALSE),
1717 "SHGetSpecialFolderPath succeeded, expected failure\n");
1718
1719 pidl = NULL;
1720 hr = pSHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl);
1722 "SHGetFolderLocation returned 0x%08x\n", hr);
1723
1724 if (hr == S_OK && pidl) IMalloc_Free(pMalloc, pidl);
1725
1726 /* now test success: */
1727 hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL,
1729 ok (hr == S_OK, "got 0x%08x\n", hr);
1730 if (hr == S_OK)
1731 {
1732 BOOL ret;
1733
1734 trace("CSIDL_FAVORITES was changed to %s\n", path);
1736 ok(!ret, "expected failure with ERROR_ALREADY_EXISTS\n");
1737 if (!ret)
1739 "got %d, expected ERROR_ALREADY_EXISTS\n", GetLastError());
1740
1741 p = path + strlen(path);
1742 strcpy(p, "\\desktop.ini");
1744 *p = 0;
1747 ok( ret, "failed to remove %s error %u\n", path, GetLastError() );
1748 }
1749 }
1750 else if (arg[0] == '2')
1751 {
1752 /* make sure SHGetFolderPath still succeeds when the
1753 original value of CSIDL_FAVORITES is restored. */
1754 hr = pSHGetFolderPathA(NULL, CSIDL_FAVORITES | CSIDL_FLAG_CREATE, NULL,
1756 ok(hr == S_OK, "SHGetFolderPath failed: 0x%08x\n", hr);
1757 }
1758}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
Definition: dir.c:714
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:776
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define CSIDL_FLAG_CREATE
@ SHGFP_TYPE_CURRENT
Definition: shlobj.h:2001
#define CSIDL_FAVORITES
Definition: shlobj.h:2031
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
DWORD WINAPI GetLastError(void)
Definition: except.c:1040
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

Referenced by START_TEST().

◆ getFolderName()

static const char * getFolderName ( int  folder)
static

Definition at line 235 of file shellpath.c.

236{
237 static char unknown[32];
238
239#define CSIDL_TO_STR(x) case x: return#x;
240 switch (folder)
241 {
300#undef CSIDL_TO_STR
301 default:
302 sprintf(unknown, "unknown (0x%04x)", folder);
303 return unknown;
304 }
305}
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define OLD_CSIDL_MYDOCUMENTS
Definition: shellpath.c:42
#define CSIDL_PROFILES
Definition: shellpath.c:231
#define CSIDL_TO_STR(x)
#define CSIDL_COMMON_TEMPLATES
Definition: shlobj.h:2069
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2049
#define CSIDL_TEMPLATES
Definition: shlobj.h:2045
#define CSIDL_PROGRAM_FILES
Definition: shlobj.h:2062
#define CSIDL_INTERNET_CACHE
Definition: shlobj.h:2056
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2040
#define CSIDL_SENDTO
Definition: shlobj.h:2034
#define CSIDL_RECENT
Definition: shlobj.h:2033
#define CSIDL_ADMINTOOLS
Definition: shlobj.h:2072
#define CSIDL_COMMON_STARTMENU
Definition: shlobj.h:2046
#define CSIDL_CDBURN_AREA
Definition: shlobj.h:2080
#define CSIDL_COMMON_ALTSTARTUP
Definition: shlobj.h:2054
#define CSIDL_FONTS
Definition: shlobj.h:2044
#define CSIDL_PERSONAL
Definition: shlobj.h:2030
#define CSIDL_COMMON_APPDATA
Definition: shlobj.h:2059
#define CSIDL_CONNECTIONS
Definition: shlobj.h:2073
#define CSIDL_COMMON_PROGRAMS
Definition: shlobj.h:2047
#define CSIDL_COMPUTERSNEARME
Definition: shlobj.h:2081
#define CSIDL_MYPICTURES
Definition: shlobj.h:2063
#define CSIDL_COOKIES
Definition: shlobj.h:2057
#define CSIDL_COMMON_FAVORITES
Definition: shlobj.h:2055
#define CSIDL_PRINTERS
Definition: shlobj.h:2029
#define CSIDL_RESOURCES
Definition: shlobj.h:2077
#define CSIDL_SYSTEM
Definition: shlobj.h:2061
#define CSIDL_HISTORY
Definition: shlobj.h:2058
#define CSIDL_LOCAL_APPDATA
Definition: shlobj.h:2052
#define CSIDL_PROFILE
Definition: shlobj.h:2064
#define CSIDL_PROGRAM_FILES_COMMONX86
Definition: shlobj.h:2068
#define CSIDL_PROGRAM_FILES_COMMON
Definition: shlobj.h:2067
#define CSIDL_COMMON_MUSIC
Definition: shlobj.h:2074
#define CSIDL_COMMON_VIDEO
Definition: shlobj.h:2076
#define CSIDL_DESKTOP
Definition: shlobj.h:2025
#define CSIDL_NETWORK
Definition: shlobj.h:2042
#define CSIDL_STARTMENU
Definition: shlobj.h:2036
#define CSIDL_PROGRAM_FILESX86
Definition: shlobj.h:2066
#define CSIDL_COMMON_PICTURES
Definition: shlobj.h:2075
#define CSIDL_PROGRAMS
Definition: shlobj.h:2027
#define CSIDL_COMMON_STARTUP
Definition: shlobj.h:2048
#define CSIDL_APPDATA
Definition: shlobj.h:2050
#define CSIDL_PRINTHOOD
Definition: shlobj.h:2051
#define CSIDL_ALTSTARTUP
Definition: shlobj.h:2053
#define CSIDL_SYSTEMX86
Definition: shlobj.h:2065
#define CSIDL_STARTUP
Definition: shlobj.h:2032
#define CSIDL_WINDOWS
Definition: shlobj.h:2060
#define CSIDL_DRIVES
Definition: shlobj.h:2041
#define CSIDL_MYMUSIC
Definition: shlobj.h:2038
#define CSIDL_INTERNET
Definition: shlobj.h:2026
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2070
#define CSIDL_CONTROLS
Definition: shlobj.h:2028
#define CSIDL_BITBUCKET
Definition: shlobj.h:2035
#define CSIDL_NETHOOD
Definition: shlobj.h:2043
#define CSIDL_COMMON_OEM_LINKS
Definition: shlobj.h:2079
#define CSIDL_COMMON_ADMINTOOLS
Definition: shlobj.h:2071
#define CSIDL_MYVIDEO
Definition: shlobj.h:2039
#define CSIDL_RESOURCES_LOCALIZED
Definition: shlobj.h:2078

Referenced by matchGUID(), test_ShellValues(), test_SHGetFolderPath(), test_SHGetSpecialFolderPath(), testSHGetFolderLocation(), and testSHGetSpecialFolderLocation().

◆ HRESULT()

static HRESULT ( WINAPI pDllGetVersion)
static

◆ init()

static BOOL init ( void  )
static

Definition at line 1685 of file shellpath.c.

1686{
1688 if (!GetCurrentDirectoryA(sizeof(base), base)) return FALSE;
1689 strcpy(selfname, myARGV[0]);
1690 return TRUE;
1691}
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2146
static int myARGC
Definition: shellpath.c:1680
static char ** myARGV
Definition: shellpath.c:1681
static char selfname[MAX_PATH]
Definition: shellpath.c:1683
int winetest_get_mainargs(char ***pargv)

Referenced by START_TEST().

◆ int()

static int ( WINAPI pSHFileOperationA)
static

◆ is_in_strarray()

static BOOL is_in_strarray ( const WCHAR needle,
const char hay 
)
static

Definition at line 1937 of file shellpath.c.

1938{
1939 WCHAR wstr[MAX_PATH];
1940
1941 if(!needle && !hay)
1942 return TRUE;
1943
1944 while(hay && *hay)
1945 {
1946 DWORD ret;
1947
1948 if(strcmp(hay, "(null)") == 0 && !needle)
1949 return TRUE;
1950
1951 ret = MultiByteToWideChar(CP_ACP, 0, hay, -1, wstr, ARRAY_SIZE(wstr));
1952 if(ret == 0)
1953 {
1954 ok(0, "Failed to convert string\n");
1955 return FALSE;
1956 }
1957
1958 if(lstrcmpW(wstr, needle) == 0)
1959 return TRUE;
1960
1961 hay += strlen(hay) + 1;
1962 }
1963
1964 return FALSE;
1965}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
unsigned long DWORD
Definition: ntddk_ex.h:95

Referenced by check_known_folder().

◆ loadShell32()

static void loadShell32 ( void  )
static

Definition at line 186 of file shellpath.c.

187{
188 HMODULE hShell32 = GetModuleHandleA("shell32");
189
190#define GET_PROC(func) \
191 p ## func = (void*)GetProcAddress(hShell32, #func); \
192 if(!p ## func) \
193 trace("GetProcAddress(%s) failed\n", #func);
194
197 GET_PROC(SHGetFolderPathEx)
199 GET_PROC(SHGetKnownFolderPath)
200 GET_PROC(SHSetKnownFolderPath)
204 if (!pILFindLastID)
205 pILFindLastID = (void *)GetProcAddress(hShell32, (LPCSTR)16);
209 GET_PROC(SHGetKnownFolderIDList)
210
211 ok(pSHGetMalloc != NULL, "shell32 is missing SHGetMalloc\n");
212 if (pSHGetMalloc)
213 {
214 HRESULT hr = pSHGetMalloc(&pMalloc);
215
216 ok(hr == S_OK, "SHGetMalloc failed: 0x%08x\n", hr);
217 ok(pMalloc != NULL, "SHGetMalloc returned a NULL IMalloc\n");
218 }
219
220 if (pDllGetVersion)
221 {
222 shellVersion.cbSize = sizeof(shellVersion);
223 pDllGetVersion(&shellVersion);
224 trace("shell32 version is %d.%d\n",
225 shellVersion.dwMajorVersion, shellVersion.dwMinorVersion);
226 }
227#undef GET_PROC
228}
STDAPI DllGetVersion(DLLVERSIONINFO *info)
Definition: browseui.cpp:221
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal)
Definition: shellole.c:285
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3194
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3093
BOOL WINAPI SHGetSpecialFolderPathA(HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3048
HRESULT WINAPI SHGetFolderPathA(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPSTR pszPath)
Definition: shellpath.c:2805
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:705
static PIDLIST_ABSOLUTE *static DLLVERSIONINFO shellVersion
Definition: shellpath.c:103
#define GET_PROC(func)
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)
Definition: shlfileop.cpp:1069
const char * LPCSTR
Definition: xmlstorage.h:183

Referenced by START_TEST().

◆ LPITEMIDLIST()

static LPITEMIDLIST *static LPITEMIDLIST ( WINAPI pILFindLastID)
static

◆ matchGUID()

static void matchGUID ( int  folder,
const GUID guid,
const GUID guid_alt 
)
static

Definition at line 1529 of file shellpath.c.

1530{
1531 LPITEMIDLIST pidl;
1532 HRESULT hr;
1533
1534 if (!pSHGetFolderLocation) return;
1535 if (!guid) return;
1536
1537 pidl = NULL;
1538 hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
1539 if (hr == S_OK)
1540 {
1541 LPITEMIDLIST pidlLast = pILFindLastID(pidl);
1542
1543 if (pidlLast && (pidlLast->mkid.abID[0] == PT_SHELLEXT ||
1544 pidlLast->mkid.abID[0] == PT_GUID))
1545 {
1546 GUID *shellGuid = (GUID *)(pidlLast->mkid.abID + 2);
1547
1548 if (!guid_alt)
1549 ok(IsEqualIID(shellGuid, guid),
1550 "%s: got GUID %s, expected %s\n", getFolderName(folder),
1552 else
1553 ok(IsEqualIID(shellGuid, guid) ||
1554 IsEqualIID(shellGuid, guid_alt),
1555 "%s: got GUID %s, expected %s or %s\n", getFolderName(folder),
1556 wine_dbgstr_guid(shellGuid), wine_dbgstr_guid(guid), wine_dbgstr_guid(guid_alt));
1557 }
1558 IMalloc_Free(pMalloc, pidl);
1559 }
1560}
const GUID * guid
static const char * getFolderName(int folder)
Definition: shellpath.c:235
#define PT_GUID
Definition: shellpath.c:51
#define PT_SHELLEXT
Definition: shellpath.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95

Referenced by test_GUIDs().

◆ matchSpecialFolderPathToEnv()

static void matchSpecialFolderPathToEnv ( int  folder,
const char envVar 
)
static

Definition at line 1507 of file shellpath.c.

1508{
1509 char path[MAX_PATH];
1510
1511 if (!pSHGetSpecialFolderPathA) return;
1512
1513 if (pSHGetSpecialFolderPathA(NULL, path, folder, FALSE))
1514 {
1515 char *envVal = getenv(envVar);
1516
1517 ok(!envVal || !lstrcmpiA(envVal, path),
1518 "%%%s%% does not match SHGetSpecialFolderPath:\n"
1519 "%%%s%% is %s\nSHGetSpecialFolderPath returns %s\n",
1520 envVar, envVar, envVal, path);
1521 }
1522}
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42

Referenced by test_EnvVars().

◆ myPathIsRootA()

static BOOL myPathIsRootA ( LPCSTR  lpszPath)
static

Definition at line 1606 of file shellpath.c.

1607{
1608 if (lpszPath && *lpszPath &&
1609 lpszPath[1] == ':' && lpszPath[2] == '\\' && lpszPath[3] == '\0')
1610 return TRUE; /* X:\ */
1611 return FALSE;
1612}

Referenced by myPathRemoveBackslashA().

◆ myPathRemoveBackslashA()

static LPSTR myPathRemoveBackslashA ( LPSTR  lpszPath)
static

Definition at line 1613 of file shellpath.c.

1614{
1615 LPSTR szTemp = NULL;
1616
1617 if(lpszPath)
1618 {
1619 szTemp = CharPrevA(lpszPath, lpszPath + strlen(lpszPath));
1620 if (!myPathIsRootA(lpszPath) && *szTemp == '\\')
1621 *szTemp = '\0';
1622 }
1623 return szTemp;
1624}
static BOOL myPathIsRootA(LPCSTR lpszPath)
Definition: shellpath.c:1606
LPSTR WINAPI CharPrevA(_In_ LPCSTR, _In_ LPCSTR)
char * LPSTR
Definition: xmlstorage.h:182

Referenced by testSystemDir(), and testWinDir().

◆ START_TEST()

START_TEST ( shellpath  )

Definition at line 2845 of file shellpath.c.

2846{
2847 if (!init()) return;
2848
2849 loadShell32();
2850 pGetSystemWow64DirectoryA = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"),
2851 "GetSystemWow64DirectoryA" );
2852 if (myARGC >= 3)
2853 doChild(myARGV[2]);
2854 else
2855 {
2856 /* Report missing functions once */
2857 if (!pSHGetFolderLocation)
2858 win_skip("SHGetFolderLocation is not available\n");
2859
2860 /* first test various combinations of parameters: */
2862
2863 /* check known values: */
2865 test_GUIDs();
2866 test_EnvVars();
2867 testWinDir();
2868 testSystemDir();
2875 }
2876}
static void test_SHGetKnownFolderIDList(void)
Definition: shellpath.c:2789
static void testSystemDir(void)
Definition: shellpath.c:1651
static void test_PidlTypes(void)
Definition: shellpath.c:1563
static void test_DoEnvironmentSubst(void)
Definition: shellpath.c:2560
static void test_NonExistentPath(void)
Definition: shellpath.c:1773
static void test_SHGetFolderPathEx(void)
Definition: shellpath.c:1842
static void test_EnvVars(void)
Definition: shellpath.c:1593
static BOOL init(void)
Definition: shellpath.c:1685
static void test_PathYetAnotherMakeUniqueName(void)
Definition: shellpath.c:2710
static void test_parameters(void)
Definition: shellpath.c:1313
static void loadShell32(void)
Definition: shellpath.c:186
static void test_knownFolders(void)
Definition: shellpath.c:2072
static void doChild(const char *arg)
Definition: shellpath.c:1693
static void test_GUIDs(void)
Definition: shellpath.c:1578
static void testWinDir(void)
Definition: shellpath.c:1630
#define win_skip
Definition: test.h:160

◆ test_DoEnvironmentSubst()

static void test_DoEnvironmentSubst ( void  )
static

Definition at line 2560 of file shellpath.c.

2561{
2562 WCHAR expectedW[MAX_PATH];
2563 WCHAR bufferW[MAX_PATH];
2564 CHAR expectedA[MAX_PATH];
2565 CHAR bufferA[MAX_PATH];
2566 DWORD res;
2567 DWORD res2;
2568 DWORD len;
2569 INT i;
2570 static const WCHAR does_not_existW[] = {'%','D','O','E','S','_','N','O','T','_','E','X','I','S','T','%',0};
2571 static const CHAR does_not_existA[] = "%DOES_NOT_EXIST%";
2572 static const CHAR *names[] = {
2573 /* interactive apps and services (works on all windows versions) */
2574 "%ALLUSERSPROFILE%", "%APPDATA%", "%LOCALAPPDATA%",
2575 "%NUMBER_OF_PROCESSORS%", "%OS%", "%PROCESSOR_ARCHITECTURE%",
2576 "%PROCESSOR_IDENTIFIER%", "%PROCESSOR_LEVEL%", "%PROCESSOR_REVISION%",
2577 "%ProgramFiles%", "%SystemDrive%",
2578 "%SystemRoot%", "%USERPROFILE%", "%windir%",
2579 /* todo_wine: "%COMPUTERNAME%", "%ProgramData%", "%PUBLIC%", */
2580
2581 /* replace more than one var is allowed */
2582 "%HOMEDRIVE%%HOMEPATH%",
2583 "%OS% %windir%"}; /* always the last entry in the table */
2584
2585 for (i = 0; i < (ARRAY_SIZE(names)); i++)
2586 {
2587 memset(bufferA, '#', MAX_PATH - 1);
2588 bufferA[MAX_PATH - 1] = 0;
2589 lstrcpyA(bufferA, names[i]);
2590 MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, ARRAY_SIZE(bufferW));
2591
2592 res2 = ExpandEnvironmentStringsA(names[i], expectedA, MAX_PATH);
2593 res = DoEnvironmentSubstA(bufferA, MAX_PATH);
2594
2595 /* is the space for the terminating 0 included? */
2596 if (!i && HIWORD(res) && (LOWORD(res) == (lstrlenA(bufferA))))
2597 {
2598 win_skip("DoEnvironmentSubstA/W are broken on NT 4\n");
2599 return;
2600 }
2601 ok(HIWORD(res) && (LOWORD(res) == res2),
2602 "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
2603 ok(!lstrcmpA(bufferA, expectedA),
2604 "%d: got %s (expected %s)\n", i, bufferA, expectedA);
2605
2606 res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
2607 res = DoEnvironmentSubstW(bufferW, MAX_PATH);
2608 ok(HIWORD(res) && (LOWORD(res) == res2),
2609 "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
2610 ok(!lstrcmpW(bufferW, expectedW),
2611 "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
2612 }
2613
2614 i--; /* reuse data in the last table entry */
2615 len = LOWORD(res); /* needed length */
2616
2617 /* one character extra is fine */
2618 memset(bufferA, '#', MAX_PATH - 1);
2619 bufferA[len + 2] = 0;
2620 lstrcpyA(bufferA, names[i]);
2621 MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, ARRAY_SIZE(bufferW));
2622
2623 res2 = ExpandEnvironmentStringsA(bufferA, expectedA, MAX_PATH);
2624 res = DoEnvironmentSubstA(bufferA, len + 1);
2625 ok(HIWORD(res) && (LOWORD(res) == res2),
2626 "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
2627 ok(!lstrcmpA(bufferA, expectedA),
2628 "+1: got %s (expected %s)\n", bufferA, expectedA);
2629
2630 res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
2631 res = DoEnvironmentSubstW(bufferW, len + 1);
2632 ok(HIWORD(res) && (LOWORD(res) == res2),
2633 "+1: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
2634 ok(!lstrcmpW(bufferW, expectedW),
2635 "+1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
2636
2637
2638 /* minimal buffer length (result string and terminating 0) */
2639 memset(bufferA, '#', MAX_PATH - 1);
2640 bufferA[len + 2] = 0;
2641 lstrcpyA(bufferA, names[i]);
2642 MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, ARRAY_SIZE(bufferW));
2643
2644 /* ANSI version failed without an extra byte, as documented on msdn */
2645 res = DoEnvironmentSubstA(bufferA, len);
2646 ok(!HIWORD(res) && (LOWORD(res) == len),
2647 " 0: got %d/%d (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len);
2648 ok(!lstrcmpA(bufferA, names[i]),
2649 " 0: got %s (expected %s)\n", bufferA, names[i]);
2650
2651 /* DoEnvironmentSubstW works as expected */
2652 res2 = ExpandEnvironmentStringsW(bufferW, expectedW, MAX_PATH);
2653 res = DoEnvironmentSubstW(bufferW, len);
2654 ok(HIWORD(res) && (LOWORD(res) == res2),
2655 " 0: got %d/%d (expected TRUE/%d)\n", HIWORD(res), LOWORD(res), res2);
2656 ok(!lstrcmpW(bufferW, expectedW),
2657 " 0: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
2658
2659
2660 /* Buffer too small */
2661 /* result: FALSE / provided buffer length / the buffer is untouched */
2662 memset(bufferA, '#', MAX_PATH - 1);
2663 bufferA[len + 2] = 0;
2664 lstrcpyA(bufferA, names[i]);
2665 MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, ARRAY_SIZE(bufferW));
2666
2667 res = DoEnvironmentSubstA(bufferA, len - 1);
2668 ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
2669 "-1: got %d/%d (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
2670 ok(!lstrcmpA(bufferA, names[i]),
2671 "-1: got %s (expected %s)\n", bufferA, names[i]);
2672
2673 lstrcpyW(expectedW, bufferW);
2674 res = DoEnvironmentSubstW(bufferW, len - 1);
2675 ok(!HIWORD(res) && (LOWORD(res) == (len - 1)),
2676 "-1: got %d/%d (expected FALSE/%d)\n", HIWORD(res), LOWORD(res), len - 1);
2677 ok(!lstrcmpW(bufferW, expectedW),
2678 "-1: got %s (expected %s)\n", wine_dbgstr_w(bufferW), wine_dbgstr_w(expectedW));
2679
2680
2681 /* unknown variable */
2682 /* result: TRUE / string length including terminating 0 / the buffer is untouched */
2683 memset(bufferA, '#', MAX_PATH - 1);
2684 bufferA[MAX_PATH - 1] = 0;
2685 lstrcpyA(bufferA, does_not_existA);
2686 MultiByteToWideChar(CP_ACP, 0, bufferA, MAX_PATH, bufferW, ARRAY_SIZE(bufferW));
2687
2688 res2 = lstrlenA(does_not_existA) + 1;
2689 res = DoEnvironmentSubstA(bufferA, MAX_PATH);
2690 ok(HIWORD(res) && (LOWORD(res) == res2),
2691 "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
2692 ok(!lstrcmpA(bufferA, does_not_existA),
2693 "%d: got %s (expected %s)\n", i, bufferA, does_not_existA);
2694
2695 res = DoEnvironmentSubstW(bufferW, MAX_PATH);
2696 ok(HIWORD(res) && (LOWORD(res) == res2),
2697 "%d: got %d/%d (expected TRUE/%d)\n", i, HIWORD(res), LOWORD(res), res2);
2698 ok(!lstrcmpW(bufferW, does_not_existW),
2699 "%d: got %s (expected %s)\n", i, wine_dbgstr_w(bufferW), wine_dbgstr_w(does_not_existW));
2700
2701
2702 if (0)
2703 {
2704 /* NULL crashes on windows */
2707 }
2708}
#define lstrcpyW
Definition: compat.h:749
DWORD WINAPI ExpandEnvironmentStringsA(IN LPCSTR lpSrc, IN LPSTR lpDst, IN DWORD nSize)
Definition: environ.c:399
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
GLuint res
Definition: glext.h:9613
GLuint GLuint * names
Definition: glext.h:11545
GLenum GLsizei len
Definition: glext.h:6722
static WCHAR does_not_existW[]
Definition: localmon.c:90
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define LOWORD(l)
Definition: pedump.c:82
#define memset(x, y, z)
Definition: compat.h:39
DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString)
Definition: shellord.c:1861
DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString)
Definition: shellord.c:1816
int32_t INT
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
char CHAR
Definition: xmlstorage.h:175

Referenced by START_TEST().

◆ test_EnvVars()

static void test_EnvVars ( void  )
static

Definition at line 1593 of file shellpath.c.

1594{
1601 /* this is only set on Wine, but can't hurt to verify it: */
1603}
static void matchSpecialFolderPathToEnv(int folder, const char *envVar)
Definition: shellpath.c:1507

Referenced by START_TEST().

◆ test_GUIDs()

static void test_GUIDs ( void  )
static

Definition at line 1578 of file shellpath.c.

1579{
1580 matchGUID(CSIDL_BITBUCKET, &CLSID_RecycleBin, NULL);
1581 matchGUID(CSIDL_CONTROLS, &CLSID_ControlPanel, NULL);
1582 matchGUID(CSIDL_DRIVES, &CLSID_MyComputer, NULL);
1583 matchGUID(CSIDL_INTERNET, &CLSID_Internet, NULL);
1584 matchGUID(CSIDL_NETWORK, &CLSID_NetworkPlaces, &CLSID_NetworkExplorerFolder); /* Vista and higher */
1585 matchGUID(CSIDL_PERSONAL, &CLSID_MyDocuments, &_CLSID_Documents /* win8 */);
1587 matchGUID(CSIDL_PRINTERS, &CLSID_Printers, NULL);
1588}
static void matchGUID(int folder, const GUID *guid, const GUID *guid_alt)
Definition: shellpath.c:1529
static GUID CLSID_CommonDocuments
Definition: shellpath.c:79

Referenced by START_TEST().

◆ test_knownFolders()

static void test_knownFolders ( void  )
static

Definition at line 2072 of file shellpath.c.

2073{
2074 static const WCHAR sWindows[] = {'W','i','n','d','o','w','s',0};
2075 static const WCHAR sWindows2[] = {'w','i','n','d','o','w','s',0};
2076 static const WCHAR sExample[] = {'E','x','a','m','p','l','e',0};
2077 static const WCHAR sExample2[] = {'E','x','a','m','p','l','e','2',0};
2078 static const WCHAR sSubFolder[] = {'S','u','b','F','o','l','d','e','r',0};
2079 static const WCHAR sNoSuch[] = {'N','o','S','u','c','h',0};
2080 static const WCHAR sBackslash[] = {'\\',0};
2081 static const KNOWNFOLDERID newFolderId = {0x01234567, 0x89AB, 0xCDEF, {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01} };
2082 static const KNOWNFOLDERID subFolderId = {0xFEDCBA98, 0x7654, 0x3210, {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} };
2083 HRESULT hr;
2085 IKnownFolder *folder = NULL, *subFolder = NULL;
2086 KNOWNFOLDERID folderId, *folders;
2087 KF_CATEGORY cat = 0;
2088 KNOWNFOLDER_DEFINITION kfDefinition, kfSubDefinition;
2089 int csidl, i;
2090 UINT nCount = 0;
2091 LPWSTR folderPath, errorMsg;
2092 KF_REDIRECTION_CAPABILITIES redirectionCapabilities = 1;
2093 WCHAR sWinDir[MAX_PATH], sExamplePath[MAX_PATH], sExample2Path[MAX_PATH], sSubFolderPath[MAX_PATH], sSubFolder2Path[MAX_PATH];
2094 BOOL bRes;
2096
2097 GetWindowsDirectoryW( sWinDir, MAX_PATH );
2098
2099 GetTempPathW(ARRAY_SIZE(sExamplePath), sExamplePath);
2100 lstrcatW(sExamplePath, sExample);
2101
2102 GetTempPathW(ARRAY_SIZE(sExample2Path), sExample2Path);
2103 lstrcatW(sExample2Path, sExample2);
2104
2105 lstrcpyW(sSubFolderPath, sExamplePath);
2106 lstrcatW(sSubFolderPath, sBackslash);
2107 lstrcatW(sSubFolderPath, sSubFolder);
2108
2109 lstrcpyW(sSubFolder2Path, sExample2Path);
2110 lstrcatW(sSubFolder2Path, sBackslash);
2111 lstrcatW(sSubFolder2Path, sSubFolder);
2112
2114
2115 hr = CoCreateInstance(&CLSID_KnownFolderManager, NULL, CLSCTX_INPROC_SERVER,
2116 &IID_IKnownFolderManager, (LPVOID*)&mgr);
2117 if(hr == REGDB_E_CLASSNOTREG)
2118 win_skip("IKnownFolderManager unavailable\n");
2119 else
2120 {
2121 IUnknown *unk;
2122
2123 ok(hr == S_OK, "failed to create KnownFolderManager instance: 0x%08x\n", hr);
2124
2125 hr = IKnownFolderManager_QueryInterface(mgr, &IID_IMarshal, (void**)&unk);
2126 ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
2127
2128 hr = IKnownFolderManager_FolderIdFromCsidl(mgr, CSIDL_WINDOWS, &folderId);
2129 ok(hr == S_OK, "failed to convert CSIDL to KNOWNFOLDERID: 0x%08x\n", hr);
2130 ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");
2131
2132 hr = IKnownFolderManager_FolderIdToCsidl(mgr, &FOLDERID_Windows, &csidl);
2133 ok(hr == S_OK, "failed to convert CSIDL to KNOWNFOLDERID: 0x%08x\n", hr);
2134 ok(csidl == CSIDL_WINDOWS, "invalid CSIDL returned\n");
2135
2136 hr = IKnownFolderManager_GetFolder(mgr, &FOLDERID_Windows, &folder);
2137 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2138 if(SUCCEEDED(hr))
2139 {
2140 hr = IKnownFolder_QueryInterface(folder, &IID_IMarshal, (void**)&unk);
2141 ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
2142
2143 hr = IKnownFolder_GetCategory(folder, &cat);
2144 ok(hr == S_OK, "failed to get folder category: 0x%08x\n", hr);
2145 ok(cat==KF_CATEGORY_FIXED, "invalid folder category: %d\n", cat);
2146
2147 hr = IKnownFolder_GetId(folder, &folderId);
2148 ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
2149 ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");
2150
2151 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2152 ok(hr == S_OK, "failed to get path from known folder: 0x%08x\n", hr);
2153 ok(lstrcmpiW(sWinDir, folderPath)==0, "invalid path returned: \"%s\", expected: \"%s\"\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sWinDir));
2154 CoTaskMemFree(folderPath);
2155
2156 hr = IKnownFolder_GetRedirectionCapabilities(folder, &redirectionCapabilities);
2157 ok(hr == S_OK, "failed to get redirection capabilities: 0x%08x\n", hr);
2158 todo_wine
2159 ok(redirectionCapabilities==0, "invalid redirection capabilities returned: %d\n", redirectionCapabilities);
2160
2161 hr = IKnownFolder_SetPath(folder, 0, sWinDir);
2162 todo_wine
2163 ok(hr == E_INVALIDARG, "unexpected value from SetPath: 0x%08x\n", hr);
2164
2165 hr = IKnownFolder_GetFolderDefinition(folder, &kfDefinition);
2166 ok(hr == S_OK, "failed to get folder definition: 0x%08x\n", hr);
2167 if(SUCCEEDED(hr))
2168 {
2169 ok(kfDefinition.category==KF_CATEGORY_FIXED, "invalid folder category: 0x%08x\n", kfDefinition.category);
2170 ok(lstrcmpW(kfDefinition.pszName, sWindows)==0, "invalid folder name: %s\n", wine_dbgstr_w(kfDefinition.pszName));
2171 ok(kfDefinition.dwAttributes==0, "invalid folder attributes: %d\n", kfDefinition.dwAttributes);
2172 FreeKnownFolderDefinitionFields(&kfDefinition);
2173 }
2174
2175 hr = IKnownFolder_Release(folder);
2176 ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
2177 }
2178
2179 hr = IKnownFolderManager_GetFolderByName(mgr, sWindows, &folder);
2180 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2181 if(SUCCEEDED(hr))
2182 {
2183 hr = IKnownFolder_GetId(folder, &folderId);
2184 ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
2185 ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");
2186
2187 hr = IKnownFolder_Release(folder);
2188 ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
2189 }
2190
2191 hr = IKnownFolderManager_GetFolderByName(mgr, sWindows2, &folder);
2192 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2193 if(SUCCEEDED(hr))
2194 {
2195 hr = IKnownFolder_GetId(folder, &folderId);
2196 ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
2197 ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n");
2198
2199 hr = IKnownFolder_Release(folder);
2200 ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
2201 }
2202
2203 folder = (IKnownFolder *)0xdeadbeef;
2204 hr = IKnownFolderManager_GetFolderByName(mgr, sNoSuch, &folder);
2205 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
2206 ok(folder == NULL, "got %p\n", folder);
2207
2208 for(i=0; i < ARRAY_SIZE(known_folder_found); ++i)
2210
2211 hr = IKnownFolderManager_GetFolderIds(mgr, &folders, &nCount);
2212 ok(hr == S_OK, "failed to get known folders: 0x%08x\n", hr);
2213 for(i=0;i<nCount;++i)
2214 check_known_folder(mgr, &folders[i]);
2215
2216 for(i=0; i < ARRAY_SIZE(known_folder_found); ++i)
2217 if(!known_folder_found[i])
2218 trace("Known folder %s not found on current platform\n", known_folders[i].sFolderId);
2219
2220 CoTaskMemFree(folders);
2221
2222 /* test of registering new known folders */
2223 bRes = CreateDirectoryW(sExamplePath, NULL);
2224 ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sExamplePath));
2225 bRes = CreateDirectoryW(sExample2Path, NULL);
2226 ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sExample2Path));
2227 bRes = CreateDirectoryW(sSubFolderPath, NULL);
2228 ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolderPath));
2229
2230 ZeroMemory(&kfDefinition, sizeof(kfDefinition));
2231 kfDefinition.category = KF_CATEGORY_PERUSER;
2232 kfDefinition.pszName = CoTaskMemAlloc(sizeof(sExample));
2233 lstrcpyW(kfDefinition.pszName, sExample);
2234 kfDefinition.pszDescription = CoTaskMemAlloc(sizeof(sExample));
2235 lstrcpyW(kfDefinition.pszDescription, sExample);
2236 kfDefinition.pszRelativePath = CoTaskMemAlloc(sizeof(sExamplePath));
2237 lstrcpyW(kfDefinition.pszRelativePath, sExamplePath);
2238
2239 hr = IKnownFolderManager_RegisterFolder(mgr, &newFolderId, &kfDefinition);
2241 win_skip("No permissions required to register custom known folder\n");
2242 else
2243 {
2244 ok(hr == S_OK, "failed to register known folder: 0x%08x\n", hr);
2245 if(SUCCEEDED(hr))
2246 {
2247 hr = IKnownFolderManager_GetFolder(mgr, &newFolderId, &folder);
2248 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2249 if(SUCCEEDED(hr))
2250 {
2251 hr = IKnownFolder_GetCategory(folder, &cat);
2252 ok(hr == S_OK, "failed to get folder category: hr=0x%0x\n", hr);
2253 ok(cat == KF_CATEGORY_PERUSER, "invalid category returned: %d, while %d (KF_CATEGORY_PERUSER) expected\n", cat, KF_CATEGORY_PERUSER);
2254
2255 hr = IKnownFolder_GetId(folder, &folderId);
2256 ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr);
2257 ok(IsEqualGUID(&folderId, &newFolderId)==TRUE, "invalid KNOWNFOLDERID returned\n");
2258
2259 /* current path should be Temp\Example */
2260 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2261 ok(hr == S_OK, "failed to get path from known folder: 0x%08x\n", hr);
2262 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2263 CoTaskMemFree(folderPath);
2264
2265 /* register sub-folder and mark it as child of Example folder */
2266 ZeroMemory(&kfSubDefinition, sizeof(kfSubDefinition));
2267 kfSubDefinition.category = KF_CATEGORY_PERUSER;
2268 kfSubDefinition.pszName = CoTaskMemAlloc(sizeof(sSubFolder));
2269 lstrcpyW(kfSubDefinition.pszName, sSubFolder);
2270 kfSubDefinition.pszDescription = CoTaskMemAlloc(sizeof(sSubFolder));
2271 lstrcpyW(kfSubDefinition.pszDescription, sSubFolder);
2272 kfSubDefinition.pszRelativePath = CoTaskMemAlloc(sizeof(sSubFolder));
2273 lstrcpyW(kfSubDefinition.pszRelativePath, sSubFolder);
2274 kfSubDefinition.fidParent = newFolderId;
2275
2276 hr = IKnownFolderManager_RegisterFolder(mgr, &subFolderId, &kfSubDefinition);
2277 ok(hr == S_OK, "failed to register known folder: 0x%08x\n", hr);
2278 if(SUCCEEDED(hr))
2279 {
2280
2281 hr = IKnownFolderManager_GetFolder(mgr, &subFolderId, &subFolder);
2282 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2283 if(SUCCEEDED(hr))
2284 {
2285 /* check sub folder path */
2286 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2287 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2288 ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
2289 CoTaskMemFree(folderPath);
2290
2291
2292 /* try to redirect Example to Temp\Example2 */
2293 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 0, NULL, &errorMsg);
2294 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2295
2296 /* verify */
2297 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2298 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2299 ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
2300 CoTaskMemFree(folderPath);
2301
2302 /* verify sub folder - it should fail now, as we redirected its parent folder, but we have no sub folder in new location */
2303 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2304 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "unexpected value from GetPath(): 0x%08x\n", hr);
2305 ok(folderPath==NULL, "invalid known folder path retrieved: \"%s\" when NULL pointer was expected\n", wine_dbgstr_w(folderPath));
2306 CoTaskMemFree(folderPath);
2307
2308
2309 /* set Example path to original. Using SetPath() is valid here, as it also uses redirection internally */
2310 hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
2311 ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);
2312
2313 /* verify */
2314 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2315 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2316 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2317 CoTaskMemFree(folderPath);
2318
2319
2320 /* create sub folder in Temp\Example2 */
2321 bRes = CreateDirectoryW(sSubFolder2Path, NULL);
2322 ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolder2Path));
2323
2324 /* again perform that same redirection */
2325 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 0, NULL, &errorMsg);
2326 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2327
2328 /* verify sub folder. It should succeed now, as the required sub folder exists */
2329 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2330 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2331 ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
2332 CoTaskMemFree(folderPath);
2333
2334 /* remove newly created directory */
2335 RemoveDirectoryW(sSubFolder2Path);
2336
2337 /* verify subfolder. It still succeeds, so Windows does not check folder presence each time */
2338 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2339 todo_wine
2340 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2341 todo_wine
2342 ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
2343 CoTaskMemFree(folderPath);
2344
2345
2346 /* set Example path to original */
2347 hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
2348 ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);
2349
2350 /* verify */
2351 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2352 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2353 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2354 CoTaskMemFree(folderPath);
2355
2356 /* verify sub folder */
2357 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2358 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2359 ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
2360 CoTaskMemFree(folderPath);
2361
2362
2363 /* create sub folder in Temp\Example2 */
2364 bRes = CreateDirectoryW(sSubFolder2Path, NULL);
2365 ok(bRes, "cannot create example directory: %s\n", wine_dbgstr_w(sSubFolder2Path));
2366
2367 /* do that same redirection, but try to exclude sub-folder */
2368 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, 0, sExample2Path, 1, &subFolderId, &errorMsg);
2369 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2370
2371 /* verify */
2372 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2373 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2374 ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
2375 CoTaskMemFree(folderPath);
2376
2377 /* 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 */
2378 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2379 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2380 ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
2381 CoTaskMemFree(folderPath);
2382
2383 /* remove newly created directory */
2384 RemoveDirectoryW(sSubFolder2Path);
2385
2386
2387 /* set Example path to original */
2388 hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
2389 ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);
2390
2391 /* verify */
2392 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2393 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2394 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2395 CoTaskMemFree(folderPath);
2396
2397 /* verify sub folder */
2398 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2399 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2400 ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
2401 CoTaskMemFree(folderPath);
2402
2403
2404 /* do that same redirection again, but set it to copy content. It should also copy the sub folder, so checking it would succeed now */
2405 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS, sExample2Path, 0, NULL, &errorMsg);
2406 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2407
2408 /* verify */
2409 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2410 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2411 ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
2412 CoTaskMemFree(folderPath);
2413
2414 /* verify sub folder */
2415 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2416 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2417 ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
2418 CoTaskMemFree(folderPath);
2419
2420 /* remove copied directory */
2421 RemoveDirectoryW(sSubFolder2Path);
2422
2423
2424 /* set Example path to original */
2425 hr = IKnownFolder_SetPath(folder, 0, sExamplePath);
2426 ok(hr == S_OK, "SetPath() failed: 0x%08x\n", hr);
2427
2428 /* verify */
2429 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2430 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2431 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2432 CoTaskMemFree(folderPath);
2433
2434 /* verify sub folder */
2435 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2436 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2437 ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
2438 CoTaskMemFree(folderPath);
2439
2440
2441 /* redirect again, set it to copy content and remove originals */
2442 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS | KF_REDIRECT_DEL_SOURCE_CONTENTS, sExample2Path, 0, NULL, &errorMsg);
2443 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2444
2445 /* verify */
2446 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2447 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2448 ok(lstrcmpiW(folderPath, sExample2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExample2Path));
2449 CoTaskMemFree(folderPath);
2450
2451 /* verify sub folder */
2452 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2453 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2454 ok(lstrcmpiW(folderPath, sSubFolder2Path)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolder2Path));
2455 CoTaskMemFree(folderPath);
2456
2457 /* check if original directory was really removed */
2458 dwAttributes = GetFileAttributesW(sExamplePath);
2459 ok(dwAttributes==INVALID_FILE_ATTRIBUTES, "directory should not exist, but has attributes: 0x%08x\n", dwAttributes );
2460
2461
2462 /* redirect (with copy) to original path */
2463 hr = IKnownFolderManager_Redirect(mgr, &newFolderId, NULL, KF_REDIRECT_COPY_CONTENTS, sExamplePath, 0, NULL, &errorMsg);
2464 ok(hr == S_OK, "failed to redirect known folder: 0x%08x, errorMsg: %s\n", hr, wine_dbgstr_w(errorMsg));
2465
2466 /* verify */
2467 hr = IKnownFolder_GetPath(folder, 0, &folderPath);
2468 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2469 ok(lstrcmpiW(folderPath, sExamplePath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sExamplePath));
2470 CoTaskMemFree(folderPath);
2471
2472 /* verify sub folder */
2473 hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
2474 ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
2475 ok(lstrcmpiW(folderPath, sSubFolderPath)==0, "invalid known folder path retrieved: \"%s\" when \"%s\" was expected\n", wine_dbgstr_w(folderPath), wine_dbgstr_w(sSubFolderPath));
2476 CoTaskMemFree(folderPath);
2477
2478 /* check shell utility functions */
2479 if(!pSHGetKnownFolderPath || !pSHSetKnownFolderPath)
2480 todo_wine
2481 win_skip("cannot get SHGet/SetKnownFolderPath routines\n");
2482 else
2483 {
2484 /* try to get current known folder path */
2485 hr = pSHGetKnownFolderPath(&newFolderId, 0, NULL, &folderPath);
2486 todo_wine
2487 ok(hr==S_OK, "cannot get known folder path: hr=0x%0x\n", hr);
2488 todo_wine
2489 ok(lstrcmpW(folderPath, sExamplePath)==0, "invalid path returned: %s\n", wine_dbgstr_w(folderPath));
2490
2491 /* set it to new value */
2492 hr = pSHSetKnownFolderPath(&newFolderId, 0, NULL, sExample2Path);
2493 todo_wine
2494 ok(hr==S_OK, "cannot set known folder path: hr=0x%0x\n", hr);
2495
2496 /* check if it changed */
2497 hr = pSHGetKnownFolderPath(&newFolderId, 0, NULL, &folderPath);
2498 todo_wine
2499 ok(hr==S_OK, "cannot get known folder path: hr=0x%0x\n", hr);
2500 todo_wine
2501 ok(lstrcmpW(folderPath, sExample2Path)==0, "invalid path returned: %s\n", wine_dbgstr_w(folderPath));
2502
2503 /* set it back */
2504 hr = pSHSetKnownFolderPath(&newFolderId, 0, NULL, sExamplePath);
2505 todo_wine
2506 ok(hr==S_OK, "cannot set known folder path: hr=0x%0x\n", hr);
2507 }
2508
2509 IKnownFolder_Release(subFolder);
2510 }
2511
2512 hr = IKnownFolderManager_UnregisterFolder(mgr, &subFolderId);
2513 ok(hr == S_OK, "failed to unregister folder: 0x%08x\n", hr);
2514 }
2515
2516 FreeKnownFolderDefinitionFields(&kfSubDefinition);
2517
2518 hr = IKnownFolder_Release(folder);
2519 ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
2520
2521 /* update the folder */
2522 CoTaskMemFree(kfDefinition.pszName);
2523 kfDefinition.pszName = CoTaskMemAlloc(sizeof(sExample2));
2524 lstrcpyW(kfDefinition.pszName, sExample2);
2525 hr = IKnownFolderManager_RegisterFolder(mgr, &newFolderId, &kfDefinition);
2526 ok(hr == S_OK, "failed to re-register known folder: 0x%08x\n", hr);
2527
2528 hr = IKnownFolderManager_GetFolder(mgr, &newFolderId, &folder);
2529 ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
2530
2531 hr = IKnownFolder_GetFolderDefinition(folder, &kfSubDefinition);
2532 ok(hr == S_OK, "failed to get folder definition: 0x%08x\n", hr);
2533 ok(!memcmp(kfDefinition.pszName, kfSubDefinition.pszName, sizeof(sExample2)),
2534 "Got wrong updated name: %s\n", wine_dbgstr_w(kfSubDefinition.pszName));
2535
2536 FreeKnownFolderDefinitionFields(&kfSubDefinition);
2537
2538 hr = IKnownFolder_Release(folder);
2539 ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr);
2540 }
2541
2542 hr = IKnownFolderManager_UnregisterFolder(mgr, &newFolderId);
2543 ok(hr == S_OK, "failed to unregister folder: 0x%08x\n", hr);
2544 }
2545 }
2546 FreeKnownFolderDefinitionFields(&kfDefinition);
2547
2548 RemoveDirectoryW(sSubFolder2Path);
2549 RemoveDirectoryW(sSubFolderPath);
2550 RemoveDirectoryW(sExamplePath);
2551 RemoveDirectoryW(sExample2Path);
2552
2553 hr = IKnownFolderManager_Release(mgr);
2554 ok(hr == S_OK, "failed to release KnownFolderManager instance: 0x%08x\n", hr);
2555 }
2557}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define E_INVALIDARG
Definition: ddrawi.h:101
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2080
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId)
Definition: shellpath.c:1967
unsigned int UINT
Definition: ndis.h:50
pointer_default(unique)] interface IFileDialogCustomize enum tagKF_REDIRECTION_CAPABILITIES KF_REDIRECTION_CAPABILITIES
DWORD dwAttributes
Definition: vdmdbg.h:34
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
#define ZeroMemory
Definition: winbase.h:1670
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:2696
#define E_NOINTERFACE
Definition: winerror.h:2364
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by START_TEST().

◆ test_NonExistentPath()

static void test_NonExistentPath ( void  )
static

Definition at line 1773 of file shellpath.c.

1774{
1775 static const char userShellFolders[] =
1776 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
1777 char originalPath[MAX_PATH], modifiedPath[MAX_PATH];
1778 HKEY key;
1779
1780 if (!pSHGetFolderPathA) return;
1781 if (!pSHGetFolderLocation) return;
1782 if (!pSHGetSpecialFolderPathA) return;
1783 if (!pSHGetSpecialFolderLocation) return;
1784 if (!pSHFileOperationA) return;
1785 if (shellVersion.dwMajorVersion < 5) return;
1786
1787 if (!RegOpenKeyExA(HKEY_CURRENT_USER, userShellFolders, 0, KEY_ALL_ACCESS,
1788 &key))
1789 {
1790 DWORD len, type;
1791
1792 len = sizeof(originalPath);
1793 if (!RegQueryValueExA(key, "Favorites", NULL, &type,
1794 (LPBYTE)&originalPath, &len))
1795 {
1796 size_t len = strlen(originalPath);
1797
1798 memcpy(modifiedPath, originalPath, len);
1799 modifiedPath[len++] = '2';
1800 modifiedPath[len++] = '\0';
1801 trace("Changing CSIDL_FAVORITES to %s\n", modifiedPath);
1802 if (!RegSetValueExA(key, "Favorites", 0, type,
1803 (LPBYTE)modifiedPath, len))
1804 {
1805 char buffer[MAX_PATH+20];
1808
1809 sprintf(buffer, "%s tests/shellpath.c 1", selfname);
1810 memset(&startup, 0, sizeof(startup));
1811 startup.cb = sizeof(startup);
1812 startup.dwFlags = STARTF_USESHOWWINDOW;
1813 startup.wShowWindow = SW_SHOWNORMAL;
1815 &startup, &info);
1817
1818 /* restore original values: */
1819 trace("Restoring CSIDL_FAVORITES to %s\n", originalPath);
1820 RegSetValueExA(key, "Favorites", 0, type, (LPBYTE) originalPath,
1821 strlen(originalPath) + 1);
1823
1824 sprintf(buffer, "%s tests/shellpath.c 2", selfname);
1825 memset(&startup, 0, sizeof(startup));
1826 startup.cb = sizeof(startup);
1827 startup.dwFlags = STARTF_USESHOWWINDOW;
1828 startup.wShowWindow = SW_SHOWNORMAL;
1830 &startup, &info);
1831 ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0,
1832 "child process termination\n");
1833 }
1834 }
1835 else skip("RegQueryValueExA(key, Favorites, ...) failed\n");
1836 if (key)
1838 }
1839 else skip("RegOpenKeyExA(HKEY_CURRENT_USER, %s, ...) failed\n", userShellFolders);
1840}
static void startup(void)
#define skip(...)
Definition: atltest.h:64
#define RegCloseKey(hKey)
Definition: registry.h:47
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4817
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3321
LONG WINAPI RegFlushKey(HKEY hKey)
Definition: reg.c:2974
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4027
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4742
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint buffer
Definition: glext.h:5915
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define L(x)
Definition: ntvdm.h:50
void winetest_wait_child_process(HANDLE process)
Definition: copy.c:22
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
unsigned char * LPBYTE
Definition: typedefs.h:53
#define STARTF_USESHOWWINDOW
Definition: winbase.h:491
#define WAIT_OBJECT_0
Definition: winbase.h:406
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:764

Referenced by START_TEST().

◆ test_parameters()

static void test_parameters ( void  )
static

Definition at line 1313 of file shellpath.c.

1314{
1315 LPITEMIDLIST pidl = NULL;
1316 char path[MAX_PATH];
1317 HRESULT hr;
1318
1319 if (pSHGetFolderLocation)
1320 {
1321 /* check a bogus CSIDL: */
1322 pidl = NULL;
1323 hr = pSHGetFolderLocation(NULL, 0xeeee, NULL, 0, &pidl);
1324 ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr);
1325 if (hr == S_OK) IMalloc_Free(pMalloc, pidl);
1326
1327 /* check a bogus user token: */
1328 pidl = NULL;
1329 hr = pSHGetFolderLocation(NULL, CSIDL_FAVORITES, (HANDLE)2, 0, &pidl);
1330 ok(hr == E_FAIL || hr == E_HANDLE, "got 0x%08x, expected E_FAIL or E_HANDLE\n", hr);
1331 if (hr == S_OK) IMalloc_Free(pMalloc, pidl);
1332
1333 /* a NULL pidl pointer crashes, so don't test it */
1334 }
1335
1336 if (pSHGetSpecialFolderLocation)
1337 {
1338 if (0)
1339 /* crashes */
1341
1342 hr = pSHGetSpecialFolderLocation(NULL, 0xeeee, &pidl);
1343 ok(hr == E_INVALIDARG, "got returned 0x%08x\n", hr);
1344 }
1345
1346 if (pSHGetFolderPathA)
1347 {
1348 /* expect 2's a bogus handle, especially since we didn't open it */
1349 hr = pSHGetFolderPathA(NULL, CSIDL_DESKTOP, (HANDLE)2, SHGFP_TYPE_DEFAULT, path);
1350 ok(hr == E_FAIL || hr == E_HANDLE || /* Vista and 2k8 */
1351 broken(hr == S_OK), /* W2k and Me */ "got 0x%08x, expected E_FAIL\n", hr);
1352
1353 hr = pSHGetFolderPathA(NULL, 0xeeee, NULL, SHGFP_TYPE_DEFAULT, path);
1354 ok(hr == E_INVALIDARG, "got 0x%08x, expected E_INVALIDARG\n", hr);
1355 }
1356
1357 if (pSHGetSpecialFolderPathA)
1358 {
1359 BOOL ret;
1360
1361 if (0)
1362 pSHGetSpecialFolderPathA(NULL, NULL, CSIDL_BITBUCKET, FALSE);
1363
1364 /* odd but true: calling with a NULL path still succeeds if it's a real
1365 * dir (on some windows platform). on winME it generates exception.
1366 */
1367 ret = pSHGetSpecialFolderPathA(NULL, path, CSIDL_PROGRAMS, FALSE);
1368 ok(ret, "got %d\n", ret);
1369
1370 ret = pSHGetSpecialFolderPathA(NULL, path, 0xeeee, FALSE);
1371 ok(!ret, "got %d\n", ret);
1372 }
1373}
#define broken(x)
Definition: _sntprintf.h:21
@ SHGFP_TYPE_DEFAULT
Definition: shlobj.h:2002
#define E_HANDLE
Definition: winerror.h:2850

Referenced by START_TEST().

◆ test_PathYetAnotherMakeUniqueName()

static void test_PathYetAnotherMakeUniqueName ( void  )
static

Definition at line 2710 of file shellpath.c.

2711{
2712 static const WCHAR shortW[] = {'f','i','l','e','.','t','s','t',0};
2713 static const WCHAR short2W[] = {'f','i','l','e',' ','(','2',')','.','t','s','t',0};
2714 static const WCHAR tmpW[] = {'t','m','p',0};
2715 static const WCHAR longW[] = {'n','a','m','e',0};
2716 static const WCHAR long2W[] = {'n','a','m','e',' ','(','2',')',0};
2717 WCHAR nameW[MAX_PATH], buffW[MAX_PATH], pathW[MAX_PATH];
2718 HANDLE file;
2719 BOOL ret;
2720
2721 if (!pPathYetAnotherMakeUniqueName)
2722 {
2723 win_skip("PathYetAnotherMakeUniqueName() is not available.\n");
2724 return;
2725 }
2726
2727if (0)
2728{
2729 /* crashes on Windows */
2730 ret = pPathYetAnotherMakeUniqueName(NULL, NULL, NULL, NULL);
2731 ok(!ret, "got %d\n", ret);
2732
2733 ret = pPathYetAnotherMakeUniqueName(nameW, NULL, NULL, NULL);
2734 ok(!ret, "got %d\n", ret);
2735}
2736
2737 GetTempPathW(ARRAY_SIZE(pathW), pathW);
2738
2739 /* Using short name only first */
2740 nameW[0] = 0;
2741 ret = pPathYetAnotherMakeUniqueName(nameW, pathW, shortW, NULL);
2742 ok(ret, "got %d\n", ret);
2743 lstrcpyW(buffW, pathW);
2744 lstrcatW(buffW, shortW);
2745 ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
2746
2747 /* now create a file with this name and get next name */
2749 ok(file != NULL, "got %p\n", file);
2750
2751 nameW[0] = 0;
2752 ret = pPathYetAnotherMakeUniqueName(nameW, pathW, shortW, NULL);
2753 ok(ret, "got %d\n", ret);
2754 lstrcpyW(buffW, pathW);
2755 lstrcatW(buffW, short2W);
2756 ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
2757
2759
2760 /* Using short and long */
2761 nameW[0] = 0;
2762 ret = pPathYetAnotherMakeUniqueName(nameW, pathW, tmpW, longW);
2763 ok(ret, "got %d\n", ret);
2764 lstrcpyW(buffW, pathW);
2765 lstrcatW(buffW, longW);
2766 ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
2767
2769 ok(file != NULL, "got %p\n", file);
2770
2771 nameW[0] = 0;
2772 ret = pPathYetAnotherMakeUniqueName(nameW, pathW, tmpW, longW);
2773 ok(ret, "got %d\n", ret);
2774 lstrcpyW(buffW, pathW);
2775 lstrcatW(buffW, long2W);
2776 ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
2777
2779
2780 /* Using long only */
2781 nameW[0] = 0;
2782 ret = pPathYetAnotherMakeUniqueName(nameW, pathW, NULL, longW);
2783 ok(ret, "got %d\n", ret);
2784 lstrcpyW(buffW, pathW);
2785 lstrcatW(buffW, longW);
2786 ok(!lstrcmpW(nameW, buffW), "got %s, expected %s\n", wine_dbgstr_w(nameW), wine_dbgstr_w(buffW));
2787}
static const WCHAR nameW[]
Definition: main.c:46
#define CloseHandle
Definition: compat.h:739
#define CreateFileW
Definition: compat.h:741
#define CREATE_ALWAYS
Definition: disk.h:72
#define FILE_FLAG_DELETE_ON_CLOSE
Definition: disk.h:42
#define GENERIC_WRITE
Definition: nt_native.h:90
Definition: fci.c:127

Referenced by START_TEST().

◆ test_PidlTypes()

static void test_PidlTypes ( void  )
static

Definition at line 1563 of file shellpath.c.

1564{
1565 /* Desktop */
1568
1571}
static void test_SHGetSpecialFolderPath(BOOL optional, int folder)
Definition: shellpath.c:1443
static void test_SHGetFolderPath(BOOL optional, int folder)
Definition: shellpath.c:1431
static const struct shellExpectedValues optionalShellValues[]
Definition: shellpath.c:142
static void test_ShellValues(const struct shellExpectedValues testEntries[], int numEntries, BOOL optional)
Definition: shellpath.c:1458
static const struct shellExpectedValues requiredShellValues[]
Definition: shellpath.c:118

Referenced by START_TEST().

◆ test_ShellValues()

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

Definition at line 1458 of file shellpath.c.

1460{
1461 int i;
1462
1463 for (i = 0; i < numEntries; i++)
1464 {
1465 BYTE type;
1466 int j;
1467 BOOL foundTypeMatch = FALSE;
1468
1469 if (pSHGetFolderLocation)
1470 {
1471 type = testSHGetFolderLocation(testEntries[i].folder);
1472 for (j = 0; !foundTypeMatch && j < testEntries[i].numTypes; j++)
1473 if (testEntries[i].types[j] == type)
1474 foundTypeMatch = TRUE;
1475 ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */,
1476 "%s has unexpected type %d (0x%02x)\n",
1477 getFolderName(testEntries[i].folder), type, type);
1478 }
1480 for (j = 0, foundTypeMatch = FALSE; !foundTypeMatch &&
1481 j < testEntries[i].numTypes; j++)
1482 if (testEntries[i].types[j] == type)
1483 foundTypeMatch = TRUE;
1484 ok(foundTypeMatch || optional || broken(type == 0xff) /* Win9x */,
1485 "%s has unexpected type %d (0x%02x)\n",
1486 getFolderName(testEntries[i].folder), type, type);
1487 switch (type)
1488 {
1489 case PT_FOLDER:
1490 case PT_DRIVE:
1491 case PT_DRIVE2:
1492 case PT_IESPECIAL2:
1493 test_SHGetFolderPath(optional, testEntries[i].folder);
1495 break;
1496 }
1497 }
1498}
@ optional
Definition: msg.h:41
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define PT_FOLDER
Definition: shellpath.c:63
static BYTE testSHGetFolderLocation(int folder)
Definition: shellpath.c:1376
#define PT_DRIVE
Definition: shellpath.c:54
#define PT_DRIVE2
Definition: shellpath.c:57
static BYTE testSHGetSpecialFolderLocation(int folder)
Definition: shellpath.c:1404
#define PT_IESPECIAL2
Definition: shellpath.c:76
Definition: cmds.c:130
unsigned char BYTE
Definition: xxhash.c:193

Referenced by test_PidlTypes().

◆ test_SHGetFolderPath()

static void test_SHGetFolderPath ( BOOL  optional,
int  folder 
)
static

Definition at line 1431 of file shellpath.c.

1432{
1433 char path[MAX_PATH];
1434 HRESULT hr;
1435
1436 if (!pSHGetFolderPathA) return;
1437
1438 hr = pSHGetFolderPathA(NULL, folder, NULL, SHGFP_TYPE_CURRENT, path);
1439 ok(hr == S_OK || optional,
1440 "SHGetFolderPathA(NULL, %s, NULL, SHGFP_TYPE_CURRENT, path) failed: 0x%08x\n", getFolderName(folder), hr);
1441}

Referenced by test_PidlTypes(), and test_ShellValues().

◆ test_SHGetFolderPathEx()

static void test_SHGetFolderPathEx ( void  )
static

Definition at line 1842 of file shellpath.c.

1843{
1845 unsigned int i;
1846 HRESULT hr;
1847 DWORD len;
1848
1849 if (!pSHGetKnownFolderPath || !pSHGetFolderPathEx)
1850 {
1851 win_skip("SHGetKnownFolderPath or SHGetFolderPathEx not available\n");
1852 return;
1853 }
1854
1855if (0) { /* crashes */
1856 hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, NULL);
1857 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
1858}
1859 /* non-existent folder id */
1860 path = (void *)0xdeadbeef;
1861 hr = pSHGetKnownFolderPath(&IID_IOleObject, 0, NULL, &path);
1862 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
1863 ok(path == NULL, "got %p\n", path);
1864
1865 path = NULL;
1866 hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, KF_FLAG_DEFAULT_PATH, NULL, &path);
1867 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1868 ok(path != NULL, "expected path != NULL\n");
1870
1871 for (i = 0; i < ARRAY_SIZE(known_folders); ++i)
1872 {
1873 const KNOWNFOLDERID *folder_id = known_folders[i].folderId;
1874
1875 path = NULL;
1876 hr = pSHGetKnownFolderPath(folder_id, KF_FLAG_DEFAULT, NULL, &path);
1877 if (FAILED(hr))
1878 {
1879 ok(path == NULL, "expected path == NULL\n");
1880 continue;
1881 }
1882 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1883 ok(path != NULL, "expected path != NULL\n");
1884
1885 path2 = NULL;
1886 hr = pSHGetKnownFolderPath(folder_id, KF_FLAG_SIMPLE_IDLIST, NULL, &path2);
1887 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1888 ok(path2 != NULL, "expected path != NULL\n");
1889 ok(!lstrcmpiW(path, path2), "expected equal paths: %s, %s\n", wine_dbgstr_w(path), wine_dbgstr_w(path2));
1891
1892 path2 = NULL;
1893 hr = pSHGetKnownFolderPath(folder_id, KF_FLAG_DONT_UNEXPAND, NULL, &path2);
1894 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1895 ok(path2 != NULL, "expected path != NULL\n");
1896 ok(!lstrcmpiW(path, path2), "expected equal paths: %s, %s\n", wine_dbgstr_w(path), wine_dbgstr_w(path2));
1898
1899 path2 = NULL;
1900 hr = pSHGetKnownFolderPath(folder_id, KF_FLAG_SIMPLE_IDLIST | KF_FLAG_DONT_UNEXPAND, NULL, &path2);
1901 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1902 ok(path2 != NULL, "expected path != NULL\n");
1903 ok(!lstrcmpiW(path, path2), "expected equal paths: %s, %s\n", wine_dbgstr_w(path), wine_dbgstr_w(path2));
1905
1907 }
1908
1909 path = NULL;
1910 hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path);
1911 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1912 ok(path != NULL, "expected path != NULL\n");
1913
1914 hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, MAX_PATH);
1915 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1916 ok(!lstrcmpiW(path, buffer), "expected equal paths\n");
1917 len = lstrlenW(buffer);
1919
1920 hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, 0);
1921 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
1922
1923if (0) { /* crashes */
1924 hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, NULL, len + 1);
1925 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
1926
1927 hr = pSHGetFolderPathEx(NULL, 0, NULL, buffer, MAX_PATH);
1928 ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr);
1929}
1930 hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, len);
1931 ok(hr == E_NOT_SUFFICIENT_BUFFER, "expected E_NOT_SUFFICIENT_BUFFER, got 0x%08x\n", hr);
1932
1933 hr = pSHGetFolderPathEx(&FOLDERID_Desktop, 0, NULL, buffer, len + 1);
1934 ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr);
1935}
#define lstrlenW
Definition: compat.h:750
#define FAILED(hr)
Definition: intsafe.h:51
static const WCHAR path2[]
Definition: path.c:29
const GUID IID_IOleObject
@ KF_FLAG_SIMPLE_IDLIST
Definition: shlobj.h:99
@ KF_FLAG_DONT_UNEXPAND
Definition: shlobj.h:104
@ KF_FLAG_DEFAULT
Definition: shlobj.h:98
#define KF_FLAG_DEFAULT_PATH
Definition: shlobj.h:290
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345

Referenced by START_TEST().

◆ test_SHGetKnownFolderIDList()

static void test_SHGetKnownFolderIDList ( void  )
static

Definition at line 2789 of file shellpath.c.

2790{
2791 PIDLIST_ABSOLUTE pidl;
2792 HRESULT hr;
2793
2794 if (!pSHGetKnownFolderIDList)
2795 {
2796 win_skip("SHGetKnownFolderIDList is not available.\n");
2797 return;
2798 }
2799
2800 hr = pSHGetKnownFolderIDList(NULL, 0, NULL, NULL);
2801 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
2802
2803if (0) { /* crashes on native */
2804 pidl = (void*)0xdeadbeef;
2805 hr = pSHGetKnownFolderIDList(NULL, 0, NULL, &pidl);
2806}
2807 /* not a known folder */
2808 pidl = (void*)0xdeadbeef;
2809 hr = pSHGetKnownFolderIDList(&IID_IUnknown, 0, NULL, &pidl);
2810 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr);
2811 ok(pidl == NULL, "got %p\n", pidl);
2812
2813 hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, NULL);
2814 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
2815
2816 pidl = (void*)0xdeadbeef;
2817 hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, 0, NULL, &pidl);
2818 ok(hr == S_OK, "SHGetKnownFolderIDList failed: 0x%08x\n", hr);
2819 ok(ILIsEmpty(pidl), "pidl should be empty.\n");
2820 ok(pidl->mkid.cb == 0, "get wrong value: %d\n", pidl->mkid.cb);
2821 ILFree(pidl);
2822
2823 pidl = (void*)0xdeadbeef;
2824 hr = pSHGetKnownFolderIDList(&FOLDERID_Desktop, KF_FLAG_NO_ALIAS, NULL, &pidl);
2825 ok(hr == S_OK, "SHGetKnownFolderIDList failed: 0x%08x\n", hr);
2826 todo_wine ok(!ILIsEmpty(pidl), "pidl should not be empty.\n");
2827 todo_wine ok(pidl->mkid.cb == 20, "get wrong value: %d\n", pidl->mkid.cb);
2828 ILFree(pidl);
2829
2830 pidl = (void*)0xdeadbeef;
2831 hr = pSHGetKnownFolderIDList(&FOLDERID_Documents, 0, NULL, &pidl);
2832 ok(hr == S_OK, "SHGetKnownFolderIDList failed: 0x%08x\n", hr);
2833 ok(!ILIsEmpty(pidl), "pidl should not be empty.\n");
2834 ok(pidl->mkid.cb == 20, "get wrong value: %d\n", pidl->mkid.cb);
2835 ILFree(pidl);
2836
2837 pidl = (void*)0xdeadbeef;
2838 hr = pSHGetKnownFolderIDList(&FOLDERID_Documents, KF_FLAG_NO_ALIAS, NULL, &pidl);
2839 ok(hr == S_OK, "SHGetKnownFolderIDList failed: 0x%08x\n", hr);
2840 ok(!ILIsEmpty(pidl), "pidl should not be empty.\n");
2841 ok(pidl->mkid.cb == 20, "get wrong value: %d\n", pidl->mkid.cb);
2842 ILFree(pidl);
2843}
const GUID IID_IUnknown
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
@ KF_FLAG_NO_ALIAS
Definition: shlobj.h:103
static BOOL ILIsEmpty(_In_opt_ PCUIDLIST_RELATIVE pidl)
Definition: shlobj.h:2371
WORD cb
Definition: shtypes.idl:27
SHITEMID mkid
Definition: shtypes.idl:34

Referenced by START_TEST().

◆ test_SHGetSpecialFolderPath()

static void test_SHGetSpecialFolderPath ( BOOL  optional,
int  folder 
)
static

Definition at line 1443 of file shellpath.c.

1444{
1445 char path[MAX_PATH];
1446 BOOL ret;
1447
1448 if (!pSHGetSpecialFolderPathA) return;
1449
1450 ret = pSHGetSpecialFolderPathA(NULL, path, folder, FALSE);
1452 printf("%s: %s\n", getFolderName(folder), path);
1453 ok(ret || optional,
1454 "SHGetSpecialFolderPathA(NULL, path, %s, FALSE) failed\n",
1456}
#define printf
Definition: freeldr.h:94
int winetest_interactive

Referenced by test_PidlTypes(), and test_ShellValues().

◆ testSHGetFolderLocation()

static BYTE testSHGetFolderLocation ( int  folder)
static

Definition at line 1376 of file shellpath.c.

1377{
1378 LPITEMIDLIST pidl;
1379 HRESULT hr;
1380 BYTE ret = 0xff;
1381
1382 /* treat absence of function as success */
1383 if (!pSHGetFolderLocation) return TRUE;
1384
1385 pidl = NULL;
1386 hr = pSHGetFolderLocation(NULL, folder, NULL, 0, &pidl);
1387 if (hr == S_OK)
1388 {
1389 if (pidl)
1390 {
1391 LPITEMIDLIST pidlLast = pILFindLastID(pidl);
1392
1393 ok(pidlLast != NULL, "%s: ILFindLastID failed\n",
1395 if (pidlLast)
1396 ret = pidlLast->mkid.abID[0];
1397 IMalloc_Free(pMalloc, pidl);
1398 }
1399 }
1400 return ret;
1401}

Referenced by test_ShellValues().

◆ testSHGetSpecialFolderLocation()

static BYTE testSHGetSpecialFolderLocation ( int  folder)
static

Definition at line 1404 of file shellpath.c.

1405{
1406 LPITEMIDLIST pidl;
1407 HRESULT hr;
1408 BYTE ret = 0xff;
1409
1410 /* treat absence of function as success */
1411 if (!pSHGetSpecialFolderLocation) return TRUE;
1412
1413 pidl = NULL;
1414 hr = pSHGetSpecialFolderLocation(NULL, folder, &pidl);
1415 if (hr == S_OK)
1416 {
1417 if (pidl)
1418 {
1419 LPITEMIDLIST pidlLast = pILFindLastID(pidl);
1420
1421 ok(pidlLast != NULL,
1422 "%s: ILFindLastID failed\n", getFolderName(folder));
1423 if (pidlLast)
1424 ret = pidlLast->mkid.abID[0];
1425 IMalloc_Free(pMalloc, pidl);
1426 }
1427 }
1428 return ret;
1429}

Referenced by test_ShellValues().

◆ testSystemDir()

static void testSystemDir ( void  )
static

Definition at line 1651 of file shellpath.c.

1652{
1653 char systemShellPath[MAX_PATH], systemDir[MAX_PATH], systemDirx86[MAX_PATH];
1654
1655 if (!pSHGetSpecialFolderPathA) return;
1656
1657 GetSystemDirectoryA(systemDir, sizeof(systemDir));
1658 myPathRemoveBackslashA(systemDir);
1659 if (pSHGetSpecialFolderPathA(NULL, systemShellPath, CSIDL_SYSTEM, FALSE))
1660 {
1661 myPathRemoveBackslashA(systemShellPath);
1662 ok(!lstrcmpiA(systemDir, systemShellPath),
1663 "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n",
1664 systemDir, systemShellPath);
1665 }
1666
1667 if (!pGetSystemWow64DirectoryA || !pGetSystemWow64DirectoryA(systemDirx86, sizeof(systemDirx86)))
1668 GetSystemDirectoryA(systemDirx86, sizeof(systemDirx86));
1669 myPathRemoveBackslashA(systemDirx86);
1670 if (pSHGetSpecialFolderPathA(NULL, systemShellPath, CSIDL_SYSTEMX86, FALSE))
1671 {
1672 myPathRemoveBackslashA(systemShellPath);
1673 ok(!lstrcmpiA(systemDirx86, systemShellPath) || broken(!lstrcmpiA(systemDir, systemShellPath)),
1674 "GetSystemDirectory returns %s SHGetSpecialFolderPath returns %s\n",
1675 systemDir, systemShellPath);
1676 }
1677}
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2283
static LPSTR myPathRemoveBackslashA(LPSTR lpszPath)
Definition: shellpath.c:1613

Referenced by START_TEST().

◆ testWinDir()

static void testWinDir ( void  )
static

Definition at line 1630 of file shellpath.c.

1631{
1632 char windowsShellPath[MAX_PATH], windowsDir[MAX_PATH] = { 0 };
1633
1634 if (!pSHGetSpecialFolderPathA) return;
1635
1636 if (pSHGetSpecialFolderPathA(NULL, windowsShellPath, CSIDL_WINDOWS, FALSE))
1637 {
1638 myPathRemoveBackslashA(windowsShellPath);
1639 GetWindowsDirectoryA(windowsDir, sizeof(windowsDir));
1640 myPathRemoveBackslashA(windowsDir);
1641 ok(!lstrcmpiA(windowsDir, windowsShellPath),
1642 "GetWindowsDirectory returns %s SHGetSpecialFolderPath returns %s\n",
1643 windowsDir, windowsShellPath);
1644 }
1645}
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2337

Referenced by START_TEST().

◆ UINT()

static UINT ( WINAPI pGetSystemWow64DirectoryA)
static

Variable Documentation

◆ _FOLDERID_CredentialManager

const GUID _FOLDERID_CredentialManager = {0x915221FB, 0x9EFE, 0x4BDA, {0x8F, 0xD7, 0xF7, 0x8D, 0xCA, 0x77, 0x4F, 0x87} }
static

Definition at line 317 of file shellpath.c.

◆ _FOLDERID_CryptoKeys

const GUID _FOLDERID_CryptoKeys = {0xB88F4DAA, 0xE7BD, 0x49A9, {0xB7, 0x4D, 0x02, 0x88, 0x5A, 0x5D, 0xC7, 0x65} }
static

Definition at line 314 of file shellpath.c.

◆ _FOLDERID_DpapiKeys

const GUID _FOLDERID_DpapiKeys = {0x10C07CD0, 0xEF91, 0x4567, {0xB8, 0x50, 0x44, 0x8B, 0x77, 0xCB, 0x37, 0xF9} }
static

Definition at line 315 of file shellpath.c.

◆ _FOLDERID_SystemCertificates

const GUID _FOLDERID_SystemCertificates = {0x54EED2E0, 0xE7CA, 0x4FDB, {0x91, 0x48, 0x0F, 0x42, 0x47, 0x29, 0x1C, 0xFA} }
static

Definition at line 316 of file shellpath.c.

◆ base

char base[MAX_PATH]
static

Definition at line 1682 of file shellpath.c.

◆ BOOL

LPITEMIDLIST *static BOOL

Definition at line 91 of file shellpath.c.

◆ CLSID_CommonDocuments

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

Definition at line 79 of file shellpath.c.

Referenced by test_GUIDs().

◆ controlPanelType

const BYTE controlPanelType[] = { PT_SHELLEXT, PT_GUID, PT_CPL }
static

Definition at line 106 of file shellpath.c.

◆ DWORD

Definition at line 88 of file shellpath.c.

◆ favoritesType

const BYTE favoritesType[] = { PT_FOLDER, PT_FOLDERW, 0, PT_IESPECIAL2 }
static

Definition at line 108 of file shellpath.c.

◆ folderOrSpecialType

const BYTE folderOrSpecialType[] = { PT_FOLDER, PT_IESPECIAL2 }
static

Definition at line 109 of file shellpath.c.

◆ folderType

const BYTE folderType[] = { PT_FOLDER, PT_FOLDERW }
static

Definition at line 107 of file shellpath.c.

◆ guidType

const BYTE guidType[] = { PT_GUID }
static

Definition at line 105 of file shellpath.c.

◆ HANDLE

Definition at line 88 of file shellpath.c.

◆ ieSpecialType

const BYTE ieSpecialType[] = { PT_IESPECIAL2 }
static

Definition at line 114 of file shellpath.c.

◆ int

int

Definition at line 88 of file shellpath.c.

◆ known_folder_found

BOOL known_folder_found[ARRAY_SIZE(known_folders)]

Definition at line 1311 of file shellpath.c.

Referenced by check_known_folder(), and test_knownFolders().

◆ known_folders

const struct knownFolderDef known_folders[]
static

Definition at line 343 of file shellpath.c.

Referenced by check_known_folder(), test_knownFolders(), and test_SHGetFolderPathEx().

◆ LPSTR

Definition at line 88 of file shellpath.c.

◆ LPWSTR

Definition at line 99 of file shellpath.c.

◆ myARGC

int myARGC
static

Definition at line 1680 of file shellpath.c.

Referenced by init(), and START_TEST().

◆ myARGV

char** myARGV
static

Definition at line 1681 of file shellpath.c.

Referenced by init(), and START_TEST().

◆ optionalShellValues

const struct shellExpectedValues optionalShellValues[]
static

Definition at line 142 of file shellpath.c.

Referenced by test_PidlTypes().

◆ PCWSTR

Definition at line 100 of file shellpath.c.

◆ personalType

const BYTE personalType[]
static
Initial value:

Definition at line 110 of file shellpath.c.

◆ pMalloc

◆ printersType

const BYTE printersType[] = { PT_YAGUID, PT_SHELLEXT, 0x71 }
static

Definition at line 113 of file shellpath.c.

◆ PWSTR

PWSTR *static PWSTR

Definition at line 98 of file shellpath.c.

◆ requiredShellValues

const struct shellExpectedValues requiredShellValues[]
static

◆ selfname

char selfname[MAX_PATH]
static

Definition at line 1683 of file shellpath.c.

Referenced by init(), and test_NonExistentPath().

◆ shellExtType

const BYTE shellExtType[] = { PT_SHELLEXT }
static

Definition at line 115 of file shellpath.c.

◆ shellVersion

PIDLIST_ABSOLUTE* static DLLVERSIONINFO shellVersion = { 0 }
static

Definition at line 103 of file shellpath.c.

Referenced by loadShell32(), and test_NonExistentPath().

◆ UINT

Definition at line 96 of file shellpath.c.

◆ workgroupType

const BYTE workgroupType[] = { PT_WORKGRP }
static

Definition at line 116 of file shellpath.c.