ReactOS  0.4.14-dev-554-g2f8d847
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);
GLenum func
Definition: glext.h:6028
#define GetProcAddress(x, y)
Definition: compat.h:418
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 }
KF_DEFINITION_FLAGS kfdFlags
Definition: shobjidl.idl:3911
#define TRUE
Definition: types.h:120
Definition: fci.c:115
const char * sCsidl
Definition: shellpath.c:323
HRESULT hr
Definition: shlfolder.c:183
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
#define CP_ACP
Definition: compat.h:99
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
const DWORD attributes
Definition: shellpath.c:329
const char * wine_dbgstr_guid(const GUID *guid)
static BOOL is_in_strarray(const WCHAR *needle, const char *hay)
Definition: shellpath.c:1937
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
const int line
Definition: shellpath.c:331
unsigned int BOOL
Definition: ntddk_ex.h:94
struct CFFOLDER folder
Definition: fdi.c:102
const KF_DEFINITION_FLAGS definitionFlags
Definition: shellpath.c:330
const char * sName
Definition: shellpath.c:324
const char * sParsingName
Definition: shellpath.c:328
#define trace
Definition: atltest.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
const int csidl
Definition: shellpath.c:322
int ret
BOOL known_folder_found[ARRAY_SIZE(known_folders)]
Definition: shellpath.c:1311
#define todo_wine
Definition: test.h:163
#define NO_CSIDL
Definition: shellpath.c:308
const KF_CATEGORY category
Definition: shellpath.c:325
const KNOWNFOLDERID * fidParents[2]
Definition: shellpath.c:326
#define S_OK
Definition: intsafe.h:59
const char * sFolderId
Definition: shellpath.c:321
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define MultiByteToWideChar
Definition: compat.h:100
const KNOWNFOLDERID * folderId
Definition: shellpath.c:320
const char * sRelativePath
Definition: shellpath.c:327
#define WINE_ATTRIBUTES_OPTIONAL
Definition: shellpath.c:309
#define SUCCEEDED(hr)
Definition: intsafe.h:57
#define ok_(x1, x2)
Definition: atltest.h:61
static void FreeKnownFolderDefinitionFields(KNOWNFOLDER_DEFINITION *pKFD)") cpp_quote("
Definition: shobjidl.idl:4030
static const struct knownFolderDef known_folders[]
Definition: shellpath.c:343

Referenced by test_knownFolders().

◆ DEFINE_GUID() [1/3]

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

◆ 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 ( _CLSID_Documents  ,
0xA8CDFF1C  ,
0x4878  ,
0x43be  ,
0xB5  ,
0xFD  ,
0xF8  ,
0x09  ,
0x1C  ,
0x1C  ,
0x60  ,
0xD0   
)

◆ 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");
1743  DeleteFileA(path);
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 }
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT hr
Definition: shlfolder.c:183
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define E_FAIL
Definition: ddrawi.h:102
#define CSIDL_FAVORITES
Definition: shlobj.h:2009
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:926
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define trace
Definition: atltest.h:70
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
Definition: dir.c:714
#define CSIDL_FLAG_CREATE
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
GLfloat GLfloat p
Definition: glext.h:8902
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

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 }
#define CSIDL_COOKIES
Definition: shlobj.h:2035
Definition: fci.c:115
#define CSIDL_MYVIDEO
Definition: shlobj.h:2017
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2027
#define CSIDL_MYPICTURES
Definition: shlobj.h:2041
#define CSIDL_DESKTOP
Definition: shlobj.h:2003
#define CSIDL_COMMON_FAVORITES
Definition: shlobj.h:2033
#define CSIDL_COMMON_STARTUP
Definition: shlobj.h:2026
#define CSIDL_BITBUCKET
Definition: shlobj.h:2013
#define CSIDL_HISTORY
Definition: shlobj.h:2036
#define CSIDL_PROGRAM_FILES
Definition: shlobj.h:2040
#define CSIDL_COMMON_PICTURES
Definition: shlobj.h:2053
#define CSIDL_PROFILE
Definition: shlobj.h:2042
#define CSIDL_COMMON_OEM_LINKS
Definition: shlobj.h:2057
#define CSIDL_FONTS
Definition: shlobj.h:2022
#define CSIDL_INTERNET_CACHE
Definition: shlobj.h:2034
#define CSIDL_COMMON_TEMPLATES
Definition: shlobj.h:2047
#define CSIDL_CONTROLS
Definition: shlobj.h:2006
#define CSIDL_PROGRAM_FILESX86
Definition: shlobj.h:2044
#define CSIDL_COMMON_PROGRAMS
Definition: shlobj.h:2025
#define CSIDL_RECENT
Definition: shlobj.h:2011
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define CSIDL_CONNECTIONS
Definition: shlobj.h:2051
#define CSIDL_PRINTERS
Definition: shlobj.h:2007
#define CSIDL_DRIVES
Definition: shlobj.h:2019
#define CSIDL_FAVORITES
Definition: shlobj.h:2009
#define OLD_CSIDL_MYDOCUMENTS
Definition: shellpath.c:42
#define CSIDL_COMMON_STARTMENU
Definition: shlobj.h:2024
#define CSIDL_WINDOWS
Definition: shlobj.h:2038
#define CSIDL_CDBURN_AREA
Definition: shlobj.h:2058
#define CSIDL_PROFILES
Definition: shellpath.c:231
#define CSIDL_COMMON_ALTSTARTUP
Definition: shlobj.h:2032
#define CSIDL_COMMON_ADMINTOOLS
Definition: shlobj.h:2049
#define CSIDL_ADMINTOOLS
Definition: shlobj.h:2050
#define CSIDL_LOCAL_APPDATA
Definition: shlobj.h:2030
#define CSIDL_SENDTO
Definition: shlobj.h:2012
#define CSIDL_APPDATA
Definition: shlobj.h:2028
Definition: id3.c:18
#define CSIDL_COMMON_VIDEO
Definition: shlobj.h:2054
#define CSIDL_RESOURCES_LOCALIZED
Definition: shlobj.h:2056
#define CSIDL_COMMON_APPDATA
Definition: shlobj.h:2037
#define CSIDL_PROGRAM_FILES_COMMONX86
Definition: shlobj.h:2046
#define CSIDL_STARTUP
Definition: shlobj.h:2010
#define CSIDL_PROGRAM_FILES_COMMON
Definition: shlobj.h:2045
#define CSIDL_COMMON_MUSIC
Definition: shlobj.h:2052
#define CSIDL_TO_STR(x)
#define CSIDL_RESOURCES
Definition: shlobj.h:2055
#define CSIDL_PRINTHOOD
Definition: shlobj.h:2029
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2048
#define CSIDL_INTERNET
Definition: shlobj.h:2004
#define CSIDL_NETHOOD
Definition: shlobj.h:2021
#define CSIDL_PERSONAL
Definition: shlobj.h:2008
#define CSIDL_STARTMENU
Definition: shlobj.h:2014
#define CSIDL_ALTSTARTUP
Definition: shlobj.h:2031
#define CSIDL_COMPUTERSNEARME
Definition: shlobj.h:2059
#define CSIDL_SYSTEM
Definition: shlobj.h:2039
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2018
#define CSIDL_NETWORK
Definition: shlobj.h:2020
#define CSIDL_PROGRAMS
Definition: shlobj.h:2005
#define CSIDL_TEMPLATES
Definition: shlobj.h:2023
#define CSIDL_SYSTEMX86
Definition: shlobj.h:2043
#define CSIDL_MYMUSIC
Definition: shlobj.h:2016

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 }
static int myARGC
Definition: shellpath.c:1680
static char ** myARGV
Definition: shellpath.c:1681
#define TRUE
Definition: types.h:120
int winetest_get_mainargs(char ***pargv)
static char selfname[MAX_PATH]
Definition: shellpath.c:1683
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2145
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388

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 }
#define TRUE
Definition: types.h:120
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define CP_ACP
Definition: compat.h:99
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
#define MultiByteToWideChar
Definition: compat.h:100
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469

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 }
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal)
Definition: shellole.c:290
STDAPI DllGetVersion(DLLVERSIONINFO *info)
Definition: browseui.cpp:218
BOOL WINAPI SHGetSpecialFolderPathA(HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:2561
smooth NULL
Definition: ftsmooth.c:416
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
const char * LPCSTR
Definition: xmlstorage.h:183
#define trace
Definition: atltest.h:70
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:2695
LONG HRESULT
Definition: typedefs.h:77
#define GET_PROC(func)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:821
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define S_OK
Definition: intsafe.h:59
HRESULT WINAPI SHGetFolderPathA(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPSTR pszPath)
Definition: shellpath.c:2329
#define ok(value,...)
Definition: atltest.h:57
int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)
Definition: shlfileop.cpp:1000
static PIDLIST_ABSOLUTE *static DLLVERSIONINFO shellVersion
Definition: shellpath.c:103
#define GetProcAddress(x, y)
Definition: compat.h:418
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:2606
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:320
static HMODULE hShell32
Definition: string.c:34

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),
1551  wine_dbgstr_guid(shellGuid), wine_dbgstr_guid(guid));
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 }
Definition: fci.c:115
HRESULT hr
Definition: shlfolder.c:183
#define PT_SHELLEXT
Definition: shellpath.c:60
const char * wine_dbgstr_guid(const GUID *guid)
const GUID * guid
smooth NULL
Definition: ftsmooth.c:416
#define PT_GUID
Definition: shellpath.c:51
LONG HRESULT
Definition: typedefs.h:77
static const char * getFolderName(int folder)
Definition: shellpath.c:235
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#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 }
Definition: fci.c:115
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
smooth NULL
Definition: ftsmooth.c:416
#define MAX_PATH
Definition: compat.h:26
_Check_return_ char *__cdecl getenv(_In_z_ const char *_VarName)
#define ok(value,...)
Definition: atltest.h:57

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 }
#define TRUE
Definition: types.h:120

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 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * LPSTR
Definition: xmlstorage.h:182
smooth NULL
Definition: ftsmooth.c:416
LPSTR WINAPI CharPrevA(_In_ LPCSTR, _In_ LPCSTR)
static BOOL myPathIsRootA(LPCSTR lpszPath)
Definition: shellpath.c:1606

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: */
2861  test_parameters();
2862 
2863  /* check known values: */
2864  test_PidlTypes();
2865  test_GUIDs();
2866  test_EnvVars();
2867  testWinDir();
2868  testSystemDir();
2875  }
2876 }
static void test_PidlTypes(void)
Definition: shellpath.c:1563
static int myARGC
Definition: shellpath.c:1680
static char ** myARGV
Definition: shellpath.c:1681
static void test_SHGetKnownFolderIDList(void)
Definition: shellpath.c:2789
static void doChild(const char *arg)
Definition: shellpath.c:1693
static void test_GUIDs(void)
Definition: shellpath.c:1578
static void test_knownFolders(void)
Definition: shellpath.c:2072
static void test_DoEnvironmentSubst(void)
Definition: shellpath.c:2560
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
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:821
static void testWinDir(void)
Definition: shellpath.c:1630
static BOOL init(void)
Definition: shellpath.c:1685
static void test_SHGetFolderPathEx(void)
Definition: shellpath.c:1842
static void test_NonExistentPath(void)
Definition: shellpath.c:1773
#define GetProcAddress(x, y)
Definition: compat.h:418
static void testSystemDir(void)
Definition: shellpath.c:1651
#define win_skip
Definition: test.h:150
static void test_EnvVars(void)
Definition: shellpath.c:1593

◆ 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 }
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
#define CP_ACP
Definition: compat.h:99
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
char CHAR
Definition: xmlstorage.h:175
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
int32_t INT
Definition: typedefs.h:56
GLuint GLuint * names
Definition: glext.h:11545
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
smooth NULL
Definition: ftsmooth.c:416
DWORD WINAPI ExpandEnvironmentStringsA(IN LPCSTR lpSrc, IN LPSTR lpDst, IN DWORD nSize)
Definition: environ.c:399
DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString)
Definition: shellord.c:1465
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString)
Definition: shellord.c:1420
GLenum GLsizei len
Definition: glext.h:6722
static WCHAR does_not_existW[]
Definition: localmon.c:90
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define lstrcpyW
Definition: compat.h:414
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#define MultiByteToWideChar
Definition: compat.h:100
GLuint res
Definition: glext.h:9613
#define HIWORD(l)
Definition: typedefs.h:246
#define memset(x, y, z)
Definition: compat.h:39
#define win_skip
Definition: test.h:150
#define LOWORD(l)
Definition: pedump.c:82

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 }
#define CSIDL_PROGRAM_FILES
Definition: shlobj.h:2040
#define CSIDL_PROFILE
Definition: shlobj.h:2042
#define CSIDL_WINDOWS
Definition: shlobj.h:2038
#define CSIDL_APPDATA
Definition: shlobj.h:2028
#define CSIDL_PROGRAM_FILES_COMMON
Definition: shlobj.h:2045
#define CSIDL_SYSTEM
Definition: shlobj.h:2039
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 }
#define CSIDL_BITBUCKET
Definition: shlobj.h:2013
#define CSIDL_CONTROLS
Definition: shlobj.h:2006
#define CSIDL_PRINTERS
Definition: shlobj.h:2007
#define CSIDL_DRIVES
Definition: shlobj.h:2019
static GUID CLSID_CommonDocuments
Definition: shellpath.c:79
smooth NULL
Definition: ftsmooth.c:416
static void matchGUID(int folder, const GUID *guid, const GUID *guid_alt)
Definition: shellpath.c:1529
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2048
#define CSIDL_INTERNET
Definition: shlobj.h:2004
#define CSIDL_PERSONAL
Definition: shlobj.h:2008
#define CSIDL_NETWORK
Definition: shlobj.h:2020

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;
2084  IKnownFolderManager *mgr = NULL;
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 
2113  CoInitialize(NULL);
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  }
2556  CoUninitialize();
2557 }
static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId)
Definition: shellpath.c:1967
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
#define TRUE
Definition: types.h:120
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
Definition: fci.c:115
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
HRESULT hr
Definition: shlfolder.c:183
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define ZeroMemory
Definition: winbase.h:1642
DWORD dwAttributes
Definition: vdmdbg.h:34
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2351
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
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
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:802
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define CSIDL_WINDOWS
Definition: shlobj.h:2038
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
#define trace
Definition: atltest.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
const int csidl
Definition: shellpath.c:322
BOOL known_folder_found[ARRAY_SIZE(known_folders)]
Definition: shellpath.c:1311
#define todo_wine
Definition: test.h:163
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define S_OK
Definition: intsafe.h:59
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:2696
#define lstrcpyW
Definition: compat.h:414
const char * sFolderId
Definition: shellpath.c:321
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
pointer_default(unique)] interface IFileDialogCustomize enum tagKF_REDIRECTION_CAPABILITIES KF_REDIRECTION_CAPABILITIES
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const KNOWNFOLDERID * folderId
Definition: shellpath.c:320
#define win_skip
Definition: test.h:150
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:404
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static void FreeKnownFolderDefinitionFields(KNOWNFOLDER_DEFINITION *pKFD)") cpp_quote("
Definition: shobjidl.idl:4030
static const struct knownFolderDef known_folders[]
Definition: shellpath.c:343

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);
1816  winetest_wait_child_process( info.hProcess );
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);
1822  RegFlushKey(key);
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)
1837  RegCloseKey(key);
1838  }
1839  else skip("RegOpenKeyExA(HKEY_CURRENT_USER, %s, ...) failed\n", userShellFolders);
1840 }
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:4023
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define HKEY_CURRENT_USER
Definition: winreg.h:11
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3331
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint buffer
Definition: glext.h:5915
int startup(int argc, const char *argv[])
Definition: startup.c:430
LONG WINAPI RegFlushKey(HKEY hKey)
Definition: reg.c:2974
struct _test_info info[]
Definition: SetCursorPos.c:19
#define sprintf(buf, format,...)
Definition: sprintf.c:55
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
smooth NULL
Definition: ftsmooth.c:416
#define STARTF_USESHOWWINDOW
Definition: winbase.h:472
#define WAIT_OBJECT_0
Definition: winbase.h:387
#define trace
Definition: atltest.h:70
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
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
HKEY key
Definition: reg.c:42
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
void winetest_wait_child_process(HANDLE process)
#define SW_SHOWNORMAL
Definition: winuser.h:764
static char selfname[MAX_PATH]
Definition: shellpath.c:1683
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
static PIDLIST_ABSOLUTE *static DLLVERSIONINFO shellVersion
Definition: shellpath.c:103
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4812
#define memset(x, y, z)
Definition: compat.h:39
Definition: path.c:42

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 E_HANDLE
Definition: winerror.h:2850
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_DESKTOP
Definition: shlobj.h:2003
#define CSIDL_BITBUCKET
Definition: shlobj.h:2013
#define E_FAIL
Definition: ddrawi.h:102
#define CSIDL_FAVORITES
Definition: shlobj.h:2009
unsigned int BOOL
Definition: ntddk_ex.h:94
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:2695
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
int ret
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define broken(x)
Definition: _sntprintf.h:21
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
#define CSIDL_PROGRAMS
Definition: shlobj.h:2005
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

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 
2727 if (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 
2758  CloseHandle(file);
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 
2778  CloseHandle(file);
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 }
#define CloseHandle
Definition: compat.h:406
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:416
static const WCHAR nameW[]
Definition: main.c:46
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
#define FILE_FLAG_DELETE_ON_CLOSE
Definition: disk.h:42
int ret
static const WCHAR shortW[]
Definition: tokenize.c:73
#define CREATE_ALWAYS
Definition: disk.h:72
#define lstrcpyW
Definition: compat.h:414
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
#define CreateFileW
Definition: compat.h:408
static const WCHAR longW[]
Definition: tokenize.c:63
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define win_skip
Definition: test.h:150
Definition: fci.c:126

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 }
#define TRUE
Definition: types.h:120
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
#define CSIDL_DESKTOP
Definition: shlobj.h:2003
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 requiredShellValues[]
Definition: shellpath.c:118
#define ARRAY_SIZE(a)
Definition: main.h:24

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  }
1479  type = testSHGetSpecialFolderLocation(testEntries[i].folder);
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 }
#define PT_DRIVE
Definition: shellpath.c:54
static BYTE testSHGetFolderLocation(int folder)
Definition: shellpath.c:1376
#define PT_FOLDER
Definition: shellpath.c:63
#define TRUE
Definition: types.h:120
Definition: fci.c:115
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static void test_SHGetSpecialFolderPath(BOOL optional, int folder)
Definition: shellpath.c:1443
static void test_SHGetFolderPath(BOOL optional, int folder)
Definition: shellpath.c:1431
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
unsigned int BOOL
Definition: ntddk_ex.h:94
static BYTE testSHGetSpecialFolderLocation(int folder)
Definition: shellpath.c:1404
#define PT_DRIVE2
Definition: shellpath.c:57
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
Definition: cmds.c:130
#define PT_IESPECIAL2
Definition: shellpath.c:76
static const char * getFolderName(int folder)
Definition: shellpath.c:235
unsigned char BYTE
Definition: mem.h:68
#define broken(x)
Definition: _sntprintf.h:21
#define ok(value,...)
Definition: atltest.h:57

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 }
Definition: fci.c:115
HRESULT hr
Definition: shlfolder.c:183
smooth NULL
Definition: ftsmooth.c:416
Definition: msg.h:41
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
static const char * getFolderName(int folder)
Definition: shellpath.c:235
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57

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 
1855 if (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 
1923 if (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 }
static const WCHAR path2[]
Definition: path.c:29
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
HRESULT hr
Definition: shlfolder.c:183
GLsizei const GLchar ** path
Definition: glext.h:7234
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
GLuint buffer
Definition: glext.h:5915
#define lstrlenW
Definition: compat.h:415
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
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 E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
const GUID IID_IOleObject
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define S_OK
Definition: intsafe.h:59
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
#define win_skip
Definition: test.h:150
static const struct knownFolderDef known_folders[]
Definition: shellpath.c:343

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 
2803 if (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 }
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT hr
Definition: shlfolder.c:183
WORD cb
Definition: shtypes.idl:27
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define todo_wine
Definition: test.h:163
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static BOOL ILIsEmpty(_In_opt_ LPCITEMIDLIST pidl)
Definition: shlobj.h:2310
SHITEMID mkid
Definition: shtypes.idl:34
#define win_skip
Definition: test.h:150

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);
1451  if (ret && winetest_interactive)
1452  printf("%s: %s\n", getFolderName(folder), path);
1453  ok(ret || optional,
1454  "SHGetSpecialFolderPathA(NULL, path, %s, FALSE) failed\n",
1456 }
Definition: fci.c:115
int winetest_interactive
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
Definition: msg.h:41
#define MAX_PATH
Definition: compat.h:26
int ret
static const char * getFolderName(int folder)
Definition: shellpath.c:235
#define ok(value,...)
Definition: atltest.h:57
#define printf
Definition: config.h:203

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 }
#define TRUE
Definition: types.h:120
Definition: fci.c:115
HRESULT hr
Definition: shlfolder.c:183
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:77
int ret
static const char * getFolderName(int folder)
Definition: shellpath.c:235
unsigned char BYTE
Definition: mem.h:68
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

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 }
#define TRUE
Definition: types.h:120
Definition: fci.c:115
HRESULT hr
Definition: shlfolder.c:183
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:77
int ret
static const char * getFolderName(int folder)
Definition: shellpath.c:235
unsigned char BYTE
Definition: mem.h:68
static LPMALLOC pMalloc
Definition: shellpath.c:104
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

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 }
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2282
smooth NULL
Definition: ftsmooth.c:416
#define MAX_PATH
Definition: compat.h:26
#define broken(x)
Definition: _sntprintf.h:21
#define ok(value,...)
Definition: atltest.h:57
#define CSIDL_SYSTEM
Definition: shlobj.h:2039
#define CSIDL_SYSTEMX86
Definition: shlobj.h:2043
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 }
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
smooth NULL
Definition: ftsmooth.c:416
#define CSIDL_WINDOWS
Definition: shlobj.h:2038
#define MAX_PATH
Definition: compat.h:26
#define ok(value,...)
Definition: atltest.h:57
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2336
static LPSTR myPathRemoveBackslashA(LPSTR lpszPath)
Definition: shellpath.c:1613

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.

Referenced by _SHRegisterUserShellFolders().

◆ 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.

Referenced by PathCleanupSpec().

◆ 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:
= { PT_FOLDER, PT_GUID, PT_DRIVE, 0xff ,
#define PT_DRIVE
Definition: shellpath.c:54
#define PT_FOLDER
Definition: shellpath.c:63
#define PT_SHELLEXT
Definition: shellpath.c:60
#define PT_GUID
Definition: shellpath.c:51
#define PT_IESPECIAL2
Definition: shellpath.c:76

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
Initial value:
= {
}
#define CSIDL_COOKIES
Definition: shlobj.h:2035
static const BYTE folderOrSpecialType[]
Definition: shellpath.c:109
static const BYTE favoritesType[]
Definition: shellpath.c:108
#define CSIDL_BITBUCKET
Definition: shlobj.h:2013
#define CSIDL_FONTS
Definition: shlobj.h:2022
#define CSIDL_CONTROLS
Definition: shlobj.h:2006
#define CSIDL_RECENT
Definition: shlobj.h:2011
#define CSIDL_PRINTERS
Definition: shlobj.h:2007
#define CSIDL_DRIVES
Definition: shlobj.h:2019
#define DECLARE_TYPE(x, y)
Definition: shellpath.c:117
#define CSIDL_FAVORITES
Definition: shlobj.h:2009
static const BYTE guidType[]
Definition: shellpath.c:105
static const BYTE personalType[]
Definition: shellpath.c:110
#define CSIDL_SENDTO
Definition: shlobj.h:2012
static const BYTE folderType[]
Definition: shellpath.c:107
static const BYTE printersType[]
Definition: shellpath.c:113
#define CSIDL_STARTUP
Definition: shlobj.h:2010
#define CSIDL_PRINTHOOD
Definition: shlobj.h:2029
#define CSIDL_INTERNET
Definition: shlobj.h:2004
#define CSIDL_NETHOOD
Definition: shlobj.h:2021
#define CSIDL_PERSONAL
Definition: shlobj.h:2008
#define CSIDL_STARTMENU
Definition: shlobj.h:2014
static const BYTE controlPanelType[]
Definition: shellpath.c:106
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2018
#define CSIDL_NETWORK
Definition: shlobj.h:2020
#define CSIDL_PROGRAMS
Definition: shlobj.h:2005
#define CSIDL_TEMPLATES
Definition: shlobj.h:2023

Definition at line 118 of file shellpath.c.

Referenced by test_PidlTypes().

◆ 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.