ReactOS  0.4.15-dev-1152-g6c94e4f
ShellState.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS API tests
3  * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE: Test for SHELLSTATE
5  * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6  */
7 #include "shelltest.h"
8 
9 #define NDEBUG
10 #include <debug.h>
11 #include <stdio.h>
12 #include <shellutils.h>
13 #include <strsafe.h>
14 #include <shlwapi.h>
15 
16 /* [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer] */
17 /* The contents of RegValue ShellState. */
18 typedef struct REGSHELLSTATE
19 {
20  DWORD dwSize;
21  SHELLSTATE ss;
23 
24 static void dump(const char *name, const void *ptr, size_t siz)
25 {
26  char buf[256], sz[16];
27 
28  StringCbCopyA(buf, sizeof(buf), name);
29  StringCbCatA(buf, sizeof(buf), ": ");
30 
31  const BYTE *pb = reinterpret_cast<const BYTE *>(ptr);
32  while (siz--)
33  {
34  StringCbPrintfA(sz, sizeof(sz), "%02X ", *pb++);
35  StringCbCatA(buf, sizeof(buf), sz);
36  }
37 
38  trace("%s\n", buf);
39 }
40 
41 static int read_key(REGSHELLSTATE *prss)
42 {
43  HKEY hKey;
44  LONG result;
45  DWORD cb;
46  static const LPCWSTR s_pszExplorer =
47  L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
48 
49  memset(prss, 0, sizeof(*prss));
50 
51  result = RegOpenKeyExW(HKEY_CURRENT_USER, s_pszExplorer, 0, KEY_READ, &hKey);
52  ok(result == ERROR_SUCCESS, "result was %ld\n", result);
53  ok(hKey != NULL, "hKey was NULL\n");
54 
55  if (result != ERROR_SUCCESS || !hKey)
56  {
57  skip("RegOpenKeyEx failed: %ld\n", result);
58  return 1;
59  }
60 
61  cb = sizeof(*prss);
62  result = RegQueryValueExW(hKey, L"ShellState", NULL, NULL, reinterpret_cast<LPBYTE>(prss), &cb);
63  RegCloseKey(hKey);
64 
65  ok(result == ERROR_SUCCESS, "result was %ld\n", result);
66  if (result != ERROR_SUCCESS)
67  {
68  skip("RegQueryValueEx failed: %ld\n", result);
69  return 2;
70  }
71 
72  return 0;
73 }
74 
75 extern "C" HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create);
76 
77 static int read_advanced_key(SHELLSTATE* pss)
78 {
79  HKEY hKey;
80  DWORD dwValue, dwSize;
81 
82  hKey = SHGetShellKey(1, L"Advanced", FALSE);
83  if (hKey == NULL)
84  {
85  return 0;
86  }
87 
88  dwSize = sizeof(dwValue);
89  if (SHQueryValueExW(hKey, L"Hidden", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
90  {
91  pss->fShowAllObjects = (dwValue == 1);
92  pss->fShowSysFiles = (dwValue == 2);
93  }
94 
95  dwSize = sizeof(dwValue);
96  if (SHQueryValueExW(hKey, L"HideFileExt", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
97  {
98  pss->fShowExtensions = (dwValue == 0);
99  }
100 
101  dwSize = sizeof(dwValue);
102  if (SHQueryValueExW(hKey, L"DontPrettyPath", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
103  {
104  pss->fDontPrettyPath = (dwValue != 0);
105  }
106 
107  dwSize = sizeof(dwValue);
108  if (SHQueryValueExW(hKey, L"MapNetDrvBtn", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
109  {
110  pss->fMapNetDrvBtn = (dwValue != 0);
111  }
112 
113  dwSize = sizeof(dwValue);
114  if (SHQueryValueExW(hKey, L"ShowInfoTip", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
115  {
116  pss->fShowInfoTip = (dwValue != 0);
117  }
118 
119  dwSize = sizeof(dwValue);
120  if (SHQueryValueExW(hKey, L"HideIcons", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
121  {
122  pss->fHideIcons = (dwValue != 0);
123  }
124 
125  dwSize = sizeof(dwValue);
126  if (SHQueryValueExW(hKey, L"WebView", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
127  {
128  pss->fWebView = (dwValue != 0);
129  }
130 
131  dwSize = sizeof(dwValue);
132  if (SHQueryValueExW(hKey, L"Filter", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
133  {
134  pss->fFilter = (dwValue != 0);
135  }
136 
137  dwSize = sizeof(dwValue);
138  if (SHQueryValueExW(hKey, L"ShowSuperHidden", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
139  {
140  pss->fShowSuperHidden = (dwValue != 0);
141  }
142 
143  dwSize = sizeof(dwValue);
144  if (SHQueryValueExW(hKey, L"NoNetCrawling", NULL, NULL, &dwValue, &dwSize) == ERROR_SUCCESS)
145  {
146  pss->fNoNetCrawling = (dwValue != 0);
147  }
148 
149  RegCloseKey(hKey);
150  return 0;
151 }
152 
153 static int dump_pss(SHELLSTATE *pss)
154 {
155  dump("SHELLSTATE", pss, sizeof(*pss));
156  return 0;
157 }
158 
159 START_TEST(ShellState)
160 {
161  OSVERSIONINFO osinfo;
162  REGSHELLSTATE rss;
163  SHELLSTATE ss, *pss;
164  SHELLFLAGSTATE FlagState;
165  LPBYTE pb;
166  int ret;
167 
168  trace("GetVersion(): 0x%08lX", GetVersion());
169 
170  osinfo.dwOSVersionInfoSize = sizeof(osinfo);
171  GetVersionEx(&osinfo);
172  trace("osinfo.dwMajorVersion: 0x%08lX\n", osinfo.dwMajorVersion);
173  trace("osinfo.dwMinorVersion: 0x%08lX\n", osinfo.dwMinorVersion);
174  trace("osinfo.dwBuildNumber: 0x%08lX\n", osinfo.dwBuildNumber);
175  trace("osinfo.dwPlatformId: 0x%08lX\n", osinfo.dwPlatformId);
176 
177  trace("WINVER: 0x%04X\n", WINVER);
178  trace("_WIN32_WINNT: 0x%04X\n", _WIN32_WINNT);
179  trace("_WIN32_IE: 0x%04X\n", _WIN32_IE);
180  trace("NTDDI_VERSION: 0x%08X\n", NTDDI_VERSION);
181 
182 #ifdef _MSC_VER
183  trace("_MSC_VER: 0x%08X\n", int(_MSC_VER));
184 #elif defined(__MINGW32__)
185  trace("__MINGW32__: 0x%08X\n", int(__MINGW32__));
186 #elif defined(__clang__)
187  trace("__clang__: 0x%08X\n", int(__clang__));
188 #else
189  #error Unknown compiler.
190 #endif
191 
192  ok(sizeof(REGSHELLSTATE) >= 0x24, "sizeof(REGSHELLSTATE) was %d\n", (int)sizeof(REGSHELLSTATE));
193  trace("sizeof(SHELLSTATE): %d\n", (int)sizeof(SHELLSTATE));
194  trace("__alignof(SHELLSTATE): %d\n", (int)__alignof(SHELLSTATE));
195  trace("sizeof(SHELLFLAGSTATE): %d\n", (int)sizeof(SHELLFLAGSTATE));
196  trace("sizeof(CABINETSTATE): %d\n", (int)sizeof(CABINETSTATE));
197 
198  pss = &rss.ss;
199  pb = reinterpret_cast<LPBYTE>(pss);
200 
201  ret = read_key(&rss);
202  if (ret)
203  {
204  return;
205  }
206 
207  dump_pss(pss);
208  ok(rss.dwSize >= 0x24, "rss.dwSize was %ld (0x%lX).\n", rss.dwSize, rss.dwSize);
209 
210  read_advanced_key(&rss.ss);
211 
212 #define DUMP_LONG(x) trace(#x ": 0x%08X\n", int(x));
213 #define DUMP_BOOL(x) trace(#x ": %d\n", !!int(x));
217  DUMP_BOOL(pss->fShowSysFiles);
220  DUMP_BOOL(pss->fDesktopHTML);
221  DUMP_BOOL(pss->fWin95Classic);
224  DUMP_BOOL(pss->fMapNetDrvBtn);
225  DUMP_BOOL(pss->fShowInfoTip);
226  DUMP_BOOL(pss->fHideIcons);
227  DUMP_BOOL(pss->fWebView);
228  DUMP_BOOL(pss->fFilter);
231  DUMP_LONG(pss->lParamSort);
233  DUMP_LONG(pss->version);
234  DUMP_LONG(pss->lParamSort);
236  DUMP_LONG(pss->version);
237  DUMP_BOOL(pss->fSepProcess);
238  DUMP_BOOL(pss->fStartPanelOn);
240 #if NTDDI_VERSION >= 0x06000000 // for future use
241  DUMP_BOOL(pss->fIconsOnly);
242  DUMP_BOOL(pss->fShowTypeOverlay);
243  DUMP_BOOL(pss->fShowStatusBar);
244 #endif
245 
246 #define SSF_MASK \
247  (SSF_SHOWALLOBJECTS | SSF_SHOWEXTENSIONS | SSF_NOCONFIRMRECYCLE | \
248  SSF_SHOWCOMPCOLOR | SSF_DOUBLECLICKINWEBVIEW | SSF_DESKTOPHTML | \
249  SSF_WIN95CLASSIC | SSF_DONTPRETTYPATH | SSF_SHOWATTRIBCOL | \
250  SSF_MAPNETDRVBUTTON | SSF_SHOWINFOTIP | SSF_HIDEICONS)
251  // For future:
252  // SSF_AUTOCHECKSELECT, SSF_ICONSONLY, SSF_SHOWTYPEOVERLAY, SSF_SHOWSTATUSBAR
253 
254  /* Get the settings */
255  memset(&ss, 0, sizeof(ss));
257 #define CHECK_REG_FLAG(x) ok(pss->x == ss.x, "ss.%s expected %d, was %d\n", #x, (int)pss->x, (int)ss.x)
258  CHECK_REG_FLAG(fShowAllObjects);
259  CHECK_REG_FLAG(fShowExtensions);
260  CHECK_REG_FLAG(fNoConfirmRecycle);
261  CHECK_REG_FLAG(fShowSysFiles); // No use
262  CHECK_REG_FLAG(fShowCompColor);
263  CHECK_REG_FLAG(fDoubleClickInWebView);
264  CHECK_REG_FLAG(fDesktopHTML);
265  CHECK_REG_FLAG(fWin95Classic);
266  CHECK_REG_FLAG(fDontPrettyPath);
267  CHECK_REG_FLAG(fShowAttribCol);
268  CHECK_REG_FLAG(fMapNetDrvBtn);
269  CHECK_REG_FLAG(fShowInfoTip);
270  CHECK_REG_FLAG(fHideIcons);
271 #if NTDDI_VERSION >= 0x06000000 // for future use
272  CHECK_REG_FLAG(fAutoCheckSelect);
273  CHECK_REG_FLAG(fIconsOnly);
274 #endif
275 
276  /* Get the flag settings */
277  memset(&FlagState, 0, sizeof(FlagState));
278  SHGetSettings(&FlagState, SSF_MASK);
279 #define CHECK_FLAG(x) ok(ss.x == FlagState.x, "FlagState.%s expected %d, was %d\n", #x, (int)ss.x, (int)FlagState.x)
280  CHECK_FLAG(fShowAllObjects);
281  CHECK_FLAG(fShowExtensions);
282  CHECK_FLAG(fNoConfirmRecycle);
283  CHECK_FLAG(fShowSysFiles); // No use
284  CHECK_FLAG(fShowCompColor);
285  CHECK_FLAG(fDoubleClickInWebView);
286  CHECK_FLAG(fDesktopHTML);
287  CHECK_FLAG(fWin95Classic);
288  CHECK_FLAG(fDontPrettyPath);
289  CHECK_FLAG(fShowAttribCol);
290  CHECK_FLAG(fMapNetDrvBtn);
291  CHECK_FLAG(fShowInfoTip);
292  CHECK_FLAG(fHideIcons);
293 #if NTDDI_VERSION >= 0x06000000 // for future use
294  CHECK_FLAG(fAutoCheckSelect);
295  CHECK_FLAG(fIconsOnly);
296 #endif
297 
298 #if 1
299  #define DO_IT(x) x
300 #else
301  #define DO_IT(x) do { trace(#x ";\n"); x; } while (0)
302 #endif
303 
304  DO_IT(memset(pss, 0, sizeof(*pss)));
305  DO_IT(pss->dwWin95Unused = 1);
306  ok(pb[4] == 0x01 || dump_pss(pss), "Unexpected pss ^\n");
307 
308  DO_IT(memset(pss, 0, sizeof(*pss)));
309  DO_IT(pss->lParamSort = 1);
310  ok(pb[12] == 0x01 || dump_pss(pss), "Unexpected pss ^\n");
311 
312  DO_IT(memset(pss, 0, sizeof(*pss)));
313  DO_IT(pss->iSortDirection = 0xDEADBEEF);
314  ok(*(UNALIGNED DWORD *)(pb + 16) == 0xDEADBEEF || dump_pss(pss), "Unexpected pss ^\n");
315 
316  DO_IT(memset(pss, 0, sizeof(*pss)));
317  DO_IT(pss->version = 0xDEADBEEF);
318  ok(*(UNALIGNED DWORD *)(pb + 20) == 0xDEADBEEF || dump_pss(pss), "Unexpected pss ^\n");
319 
320  DO_IT(memset(pss, 0, sizeof(*pss)));
321  DO_IT(pss->fSepProcess = TRUE);
322  ok(pb[28] == 0x01 || dump_pss(pss), "Unexpected pss ^\n");
323 }
struct REGSHELLSTATE REGSHELLSTATE
#define _WIN32_WINNT
Definition: precomp.h:14
UINT version
Definition: shlobj.h:1490
BOOL fNoNetCrawling
Definition: shlobj.h:1483
ULONG dwMajorVersion
Definition: rtltypes.h:238
BOOL fStartPanelOn
Definition: shlobj.h:1493
#define ERROR_SUCCESS
Definition: deptool.c:10
BOOL fDesktopHTML
Definition: shlobj.h:1473
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define KEY_READ
Definition: nt_native.h:1023
#define TRUE
Definition: types.h:120
static int read_advanced_key(SHELLSTATE *pss)
Definition: ShellState.cpp:77
#define HKEY_CURRENT_USER
Definition: winreg.h:11
BOOL fDontPrettyPath
Definition: shlobj.h:1475
BOOL fShowInfoTip
Definition: shlobj.h:1478
BOOL fWin95Classic
Definition: shlobj.h:1474
#define WINVER
Definition: targetver.h:11
BOOL fHideIcons
Definition: shlobj.h:1479
BOOL fShowStartPage
Definition: shlobj.h:1494
#define DUMP_LONG(x)
struct REGSHELLSTATE * PREGSHELLSTATE
BOOL fShowSuperHidden
Definition: shlobj.h:1482
DWORD WINAPI GetVersion(VOID)
Definition: version.c:22
BOOL fSepProcess
Definition: shlobj.h:1492
BOOL fFilter
Definition: shlobj.h:1481
SHELLSTATE ss
Definition: general.cpp:29
int iSortDirection
Definition: shlobj.h:1489
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:53
#define FALSE
Definition: types.h:117
BOOL fShowAllObjects
Definition: shlobj.h:1466
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
static PVOID ptr
Definition: dispmode.c:27
smooth NULL
Definition: ftsmooth.c:416
BOOL fShowCompColor
Definition: shlobj.h:1471
STRSAFEAPI StringCbCopyA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:161
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:201
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:237
BOOL fShowSysFiles
Definition: shlobj.h:1470
ULONG dwBuildNumber
Definition: rtltypes.h:240
#define NTDDI_VERSION
Definition: k32.h:33
#define UNALIGNED
Definition: crtdefs.h:132
#define trace
Definition: atltest.h:70
STRSAFEAPI StringCbPrintfA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszFormat,...)
Definition: strsafe.h:547
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
static void dump(const char *name, const void *ptr, size_t siz)
Definition: ShellState.cpp:24
#define WINAPI
Definition: msvc.h:6
HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create)
Definition: ordinal.c:4472
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SSF_MASK
GLbitfield flags
Definition: glext.h:7161
int ret
DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue, LPDWORD lpReserved, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1461
static const WCHAR L[]
Definition: oid.c:1250
ULONG dwMinorVersion
Definition: rtltypes.h:239
#define DUMP_BOOL(x)
BOOL fDoubleClickInWebView
Definition: shlobj.h:1472
#define _WIN32_IE
Definition: treeview.c:11
BOOL fShowAttribCol
Definition: shlobj.h:1476
unsigned char BYTE
Definition: xxhash.c:193
static int dump_pss(SHELLSTATE *pss)
Definition: ShellState.cpp:153
BOOL fWebView
Definition: shlobj.h:1480
STRSAFEAPI StringCbCatA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:337
BOOL fMapNetDrvBtn
Definition: shlobj.h:1477
DWORD dwSize
Definition: general.cpp:28
LONG lParamSort
Definition: shlobj.h:1488
ULONG dwPlatformId
Definition: rtltypes.h:241
#define ok(value,...)
Definition: atltest.h:57
static int read_key(REGSHELLSTATE *prss)
Definition: ShellState.cpp:41
#define GetVersionEx
Definition: winbase.h:3692
#define CHECK_FLAG(x)
#define DO_IT(x)
VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask)
Definition: shellord.c:221
DWORD dwWin95Unused
Definition: shlobj.h:1486
#define skip(...)
Definition: atltest.h:64
static HMODULE MODULEINFO DWORD cb
Definition: module.c:32
Definition: name.c:38
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
START_TEST(ShellState)
Definition: ShellState.cpp:159
BOOL fShowExtensions
Definition: shlobj.h:1467
#define ss
Definition: i386-dis.c:432
#define CHECK_REG_FLAG(x)
GLuint64EXT * result
Definition: glext.h:11304
static const struct access_res create[16]
Definition: package.c:7720
#define memset(x, y, z)
Definition: compat.h:39
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
BOOL fNoConfirmRecycle
Definition: shlobj.h:1468