ReactOS 0.4.17-dev-357-ga8f14ff
shellord.c
Go to the documentation of this file.
1/*
2 * The parameters of many functions changes between different OS versions
3 * (NT uses Unicode strings, 95 uses ASCII strings)
4 *
5 * Copyright 1997 Marcus Meissner
6 * 1998 Jürgen Schmied
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include <wine/config.h>
24
25#define WIN32_NO_STATUS
26#define _INC_WINDOWS
27#define COBJMACROS
28
29#include <windef.h>
30#include <winbase.h>
31#include <wine/winternl.h>
32#include <shlobj.h>
33#include <undocshell.h>
34#include <shlwapi.h>
35#include <commdlg.h>
36#include <commoncontrols.h>
37#include "../shellrecyclebin/recyclebin.h"
38
39#include <wine/debug.h>
40#include <wine/unicode.h>
41
42#include "pidl.h"
43#include "shell32_main.h"
44
47
48#ifdef __REACTOS__
49#include <comctl32_undoc.h>
50#include <shlwapi_undoc.h>
51#else
52/* FIXME: !!! move CREATEMRULIST and flags to header file !!! */
53/* !!! it is in both here and comctl32undoc.c !!! */
54typedef struct tagCREATEMRULIST
55{
56 DWORD cbSize; /* size of struct */
57 DWORD nMaxItems; /* max no. of items in list */
58 DWORD dwFlags; /* see below */
59 HKEY hKey; /* root reg. key under which list is saved */
60 LPCSTR lpszSubKey; /* reg. subkey */
61 int (CALLBACK *lpfnCompare)(LPCVOID, LPCVOID, DWORD); /* item compare proc */
63
64/* dwFlags */
65#define MRUF_STRING_LIST 0 /* list will contain strings */
66#define MRUF_BINARY_LIST 1 /* list will contain binary data */
67#define MRUF_DELAYED_SAVE 2 /* only save list order to reg. is FreeMRUList */
68
70extern VOID WINAPI FreeMRUList(HANDLE hMRUList);
72extern INT WINAPI FindMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum);
73extern INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize);
74#endif
75
76/*************************************************************************
77 * ParseFieldA [internal]
78 *
79 * copies a field from a ',' delimited string
80 *
81 * first field is nField = 1
82 */
84 LPCSTR src,
85 DWORD nField,
86 LPSTR dst,
87 DWORD len)
88{
89 WARN("(%s,0x%08x,%p,%d) semi-stub.\n",debugstr_a(src),nField,dst,len);
90
91 if (!src || !src[0] || !dst || !len)
92 return 0;
93
94 /* skip n fields delimited by ',' */
95 while (nField > 1)
96 {
97 if (*src=='\0') return FALSE;
98 if (*(src++)==',') nField--;
99 }
100
101 /* copy part till the next ',' to dst */
102 while ( *src!='\0' && *src!=',' && (len--)>0 ) *(dst++)=*(src++);
103
104 /* finalize the string */
105 *dst=0x0;
106
107 return TRUE;
108}
109
110/*************************************************************************
111 * ParseFieldW [internal]
112 *
113 * copies a field from a ',' delimited string
114 *
115 * first field is nField = 1
116 */
118{
119 WARN("(%s,0x%08x,%p,%d) semi-stub.\n", debugstr_w(src), nField, dst, len);
120
121 if (!src || !src[0] || !dst || !len)
122 return 0;
123
124 /* skip n fields delimited by ',' */
125 while (nField > 1)
126 {
127 if (*src == 0x0) return FALSE;
128 if (*src++ == ',') nField--;
129 }
130
131 /* copy part till the next ',' to dst */
132 while ( *src != 0x0 && *src != ',' && (len--)>0 ) *(dst++) = *(src++);
133
134 /* finalize the string */
135 *dst = 0x0;
136
137 return TRUE;
138}
139
140/*************************************************************************
141 * ParseField [SHELL32.58]
142 */
144{
145 if (SHELL_OsIsUnicode())
146 return ParseFieldW(src, nField, dst, len);
147 return ParseFieldA(src, nField, dst, len);
148}
149
150/*************************************************************************
151 * GetFileNameFromBrowse [SHELL32.63]
152 *
153 */
155 HWND hwndOwner,
156 LPWSTR lpstrFile,
157 UINT nMaxFile,
158 LPCWSTR lpstrInitialDir,
159 LPCWSTR lpstrDefExt,
160 LPCWSTR lpstrFilter,
161 LPCWSTR lpstrTitle)
162{
163typedef BOOL (WINAPI *GetOpenFileNameProc)(OPENFILENAMEW *ofn);
165 GetOpenFileNameProc pGetOpenFileNameW;
167 BOOL ret;
168
169 TRACE("%p, %s, %d, %s, %s, %s, %s)\n",
170 hwndOwner, debugstr_w(lpstrFile), nMaxFile, lpstrInitialDir, lpstrDefExt,
171 lpstrFilter, lpstrTitle);
172
173 hmodule = LoadLibraryW(L"comdlg32.dll");
174 if(!hmodule) return FALSE;
175 pGetOpenFileNameW = (GetOpenFileNameProc)GetProcAddress(hmodule, "GetOpenFileNameW");
176 if(!pGetOpenFileNameW)
177 {
179 return FALSE;
180 }
181
182 memset(&ofn, 0, sizeof(ofn));
183
184 ofn.lStructSize = sizeof(ofn);
185 ofn.hwndOwner = hwndOwner;
186 ofn.lpstrFilter = lpstrFilter;
187 ofn.lpstrFile = lpstrFile;
188 ofn.nMaxFile = nMaxFile;
189 ofn.lpstrInitialDir = lpstrInitialDir;
190 ofn.lpstrTitle = lpstrTitle;
191 ofn.lpstrDefExt = lpstrDefExt;
193 ret = pGetOpenFileNameW(&ofn);
194
196 return ret;
197}
198
199#ifdef __REACTOS__
200BOOL SHELL_GlobalCounterChanged(LONG *pCounter, SHELL_GCOUNTER_DECLAREPARAMETERS(handle, id))
201{
203 if (*pCounter == count)
204 return FALSE;
205 *pCounter = count;
206 return TRUE;
207}
208
212SHELL_GCOUNTER_DEFINE_GUID(SHGCGUID_ShellState, 0x7cb834f0, 0x527b, 0x11d2, 0x9d, 0x1f, 0x00, 0x00, 0xf8, 0x05, 0xca, 0x57);
213SHELL_GCOUNTER_DEFINE_HANDLE(g_hShellState);
214#define SHELL_GCOUNTER_SHELLSTATE SHELL_GCOUNTER_PARAMETERS(g_hShellState, GLOBALCOUNTER_SHELLSETTINGSCHANGED)
215static LONG g_ShellStateCounter = 0;
216static UINT g_CachedSSF = 0;
217static REGSHELLSTATE g_ShellState;
218enum { ssf_autocheckselect = 0x00800000, ssf_iconsonly = 0x01000000,
219 ssf_showtypeoverlay = 0x02000000, ssf_showstatusbar = 0x04000000 };
220#endif //__REACTOS__
221
222/*************************************************************************
223 * SHGetSetSettings [SHELL32.68]
224 */
226{
227#ifdef __REACTOS__
228 const DWORD inverted = SSF_SHOWEXTENSIONS;
229 LPSHELLSTATE gpss = &g_ShellState.ss;
230 HKEY hKeyAdv;
231
232 if (!SHELL_GlobalCounterIsInitialized(g_hShellState))
233 {
234 SHELL_GlobalCounterCreate(&SHGCGUID_ShellState, g_hShellState);
235 }
236
237 if (!lpss)
238 {
239 SHELL_GlobalCounterIncrement(SHELL_GCOUNTER_SHELLSTATE);
240 return;
241 }
242
243 hKeyAdv = SHGetShellKey(SHKEY_Root_HKCU | SHKEY_Key_Explorer, L"Advanced", bSet);
244 if (!hKeyAdv && bSet)
245 return;
246
247#define SSF_STRUCTONLY (SSF_NOCONFIRMRECYCLE | SSF_DOUBLECLICKINWEBVIEW | SSF_DESKTOPHTML | \
248 SSF_WIN95CLASSIC | SSF_SORTCOLUMNS | SSF_STARTPANELON)
249#define SHGSS_GetSetStruct(getsetmacro) \
250 do { \
251 getsetmacro(fNoConfirmRecycle, SSF_NOCONFIRMRECYCLE); \
252 getsetmacro(fDoubleClickInWebView, SSF_DOUBLECLICKINWEBVIEW); \
253 getsetmacro(fDesktopHTML, SSF_DESKTOPHTML); \
254 getsetmacro(fWin95Classic, SSF_WIN95CLASSIC); \
255 getsetmacro(lParamSort, SSF_SORTCOLUMNS); \
256 getsetmacro(iSortDirection, SSF_SORTCOLUMNS); \
257 getsetmacro(fStartPanelOn, SSF_STARTPANELON); \
258 } while (0)
259#define SHGSS_GetSetAdv(getsetmacro) \
260 do { \
261 getsetmacro(L"HideFileExt", fShowExtensions, SSF_SHOWEXTENSIONS); \
262 getsetmacro(L"ShowCompColor", fShowCompColor, SSF_SHOWCOMPCOLOR); \
263 getsetmacro(L"DontPrettyPath", fDontPrettyPath, SSF_DONTPRETTYPATH); \
264 getsetmacro(L"ShowAttribCol", fShowAttribCol, SSF_SHOWATTRIBCOL); \
265 getsetmacro(L"MapNetDrvBtn", fMapNetDrvBtn, SSF_MAPNETDRVBUTTON); \
266 getsetmacro(L"ShowInfoTip", fShowInfoTip, SSF_SHOWINFOTIP); \
267 getsetmacro(L"HideIcons", fHideIcons, SSF_HIDEICONS); \
268 getsetmacro(L"WebView", fWebView, SSF_WEBVIEW); \
269 getsetmacro(L"Filter", fFilter, SSF_FILTER); \
270 getsetmacro(L"ShowSuperHidden", fShowSuperHidden, SSF_SHOWSUPERHIDDEN); \
271 getsetmacro(L"NoNetCrawling", fNoNetCrawling, SSF_NONETCRAWLING); \
272 getsetmacro(L"SeparateProcess", fSepProcess, SSF_SEPPROCESS); \
273 getsetmacro(L"AutoCheckSelect", fAutoCheckSelect, ssf_autocheckselect); \
274 getsetmacro(L"IconsOnly", fIconsOnly, ssf_iconsonly); \
275 getsetmacro(L"ShowTypeOverlay", fShowTypeOverlay, ssf_showtypeoverlay); \
276 getsetmacro(L"ShowStatusBar", fShowStatusBar, ssf_showstatusbar); \
277 } while (0)
278
279 if (bSet)
280 {
281 DWORD changed = 0;
282 if (dwMask & ~g_CachedSSF)
283 {
284 SHELLSTATE tempstate;
285 SHGetSetSettings(&tempstate, dwMask, FALSE); // Read entries that are not in g_CachedSSF
286 }
287
288#define SHGSS_WriteAdv(name, value, SSF) \
289 do { \
290 DWORD val = (value), cb = sizeof(DWORD); \
291 if (SHSetValueW(hKeyAdv, NULL, (name), REG_DWORD, &val, cb) == ERROR_SUCCESS) \
292 { \
293 ++changed; \
294 } \
295 } while (0)
296#define SHGSS_SetAdv(name, field, SSF) \
297 do { \
298 if ((dwMask & (SSF)) && gpss->field != lpss->field) \
299 { \
300 const DWORD bitval = (gpss->field = lpss->field); \
301 SHGSS_WriteAdv((name), ((SSF) & inverted) ? !bitval : !!bitval, (SSF)); \
302 } \
303 } while (0)
304#define SHGSS_SetStruct(field, SSF) \
305 do { \
306 if ((dwMask & (SSF)) && gpss->field != lpss->field) \
307 { \
308 gpss->field = lpss->field; \
309 ++changed; \
310 } \
311 } while (0)
312
313 if ((dwMask & SSF_SHOWALLOBJECTS) && gpss->fShowAllObjects != lpss->fShowAllObjects)
314 {
315 gpss->fShowAllObjects = lpss->fShowAllObjects;
316 SHGSS_WriteAdv(L"Hidden", lpss->fShowAllObjects ? 1 : 2, SSF_SHOWALLOBJECTS);
317 }
318 SHGSS_SetStruct(fShowSysFiles, SSF_SHOWSYSFILES);
319 SHGSS_GetSetAdv(SHGSS_SetAdv);
320 SHGSS_GetSetStruct(SHGSS_SetStruct);
321 if (changed)
322 {
323 if ((dwMask & SSF_SHOWSUPERHIDDEN) && (DLL_EXPORT_VERSION) < _WIN32_WINNT_VISTA)
324 {
325 // This is probably a Windows bug but write this alternative name just in case someone reads it
326 DWORD val = gpss->fShowSuperHidden != FALSE;
327 SHSetValueW(hKeyAdv, NULL, L"SuperHidden", REG_DWORD, &val, sizeof(val));
328 }
329 SHELL32_WriteRegShellState(&g_ShellState); // Write the new SHELLSTATE
330 SHGetSetSettings(NULL, 0, TRUE); // Invalidate counter
331 SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)L"ShellState"); // Notify everyone
332 }
333 }
334 else
335 {
336 DWORD read = 0, data, cb, dummy = 0;
338 if (SHELL_GlobalCounterChanged(&g_ShellStateCounter, SHELL_GCOUNTER_SHELLSTATE))
339 g_CachedSSF = 0;
340
341#define SHGSS_ReadAdv(name, SSF) ( \
342 (g_CachedSSF & (SSF)) != (SSF) && (cb = sizeof(DWORD)) != 0 && \
343 SHQueryValueEx(hKeyAdv, (name), NULL, NULL, &data, &cb) == ERROR_SUCCESS && \
344 cb == sizeof(DWORD) && (read |= (SSF)) != 0 )
345#define SHGSS_GetFieldHelper(field, SSF, src, dst, cachevar) \
346 do { \
347 if (dwMask & (SSF)) \
348 { \
349 (dst)->field = (src)->field; \
350 cachevar |= (SSF); \
351 } \
352 } while (0)
353#define SHGSS_CacheField(field, SSF) SHGSS_GetFieldHelper(field, (SSF), &rss.ss, gpss, read)
354#define SHGSS_GetField(field, SSF) SHGSS_GetFieldHelper(field, (SSF), gpss, lpss, dummy)
355#define SHGSS_GetAdv(name, field, SSF) \
356 do { \
357 if (SHGSS_ReadAdv((name), (SSF))) \
358 gpss->field = ((SSF) & inverted) ? data == FALSE : data != FALSE; \
359 SHGSS_GetFieldHelper(field, (SSF), gpss, lpss, read); \
360 } while (0)
361
362 if (SHGSS_ReadAdv(L"Hidden", SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES))
363 {
364 gpss->fShowAllObjects = data == 1;
365 gpss->fShowSysFiles = data > 1;
366 }
367 SHGSS_GetField(fShowAllObjects, SSF_SHOWALLOBJECTS);
368 SHGSS_GetField(fShowSysFiles, SSF_SHOWSYSFILES);
369 SHGSS_GetSetAdv(SHGSS_GetAdv);
370 if (dwMask & ~(read | g_CachedSSF))
371 {
372 REGSHELLSTATE rss;
374 {
375 SHGSS_GetSetStruct(SHGSS_CacheField); // Copy the requested items to gpss
376 }
377 else
378 {
380 read = 0; // The advanced items we read are no longer valid in gpss
381 g_CachedSSF = SSF_STRUCTONLY;
382 /* HACKFIX: This should not be needed. Defaults should be used
383 * until an override option is selected. See CORE-20585. */
384 rss.ss = *gpss;
386 }
387 }
388 SHGSS_GetSetStruct(SHGSS_GetField); // Copy requested items from gpss to output
389 g_CachedSSF |= read;
390 }
391 if (hKeyAdv)
392 RegCloseKey(hKeyAdv);
393#else
394 if(bSet)
395 {
396 FIXME("%p 0x%08x TRUE\n", lpss, dwMask);
397 }
398 else
399 {
400 SHGetSettings((LPSHELLFLAGSTATE)lpss,dwMask);
401 }
402#endif //__REACTOS__
403}
404
405/*************************************************************************
406 * SHGetSettings [SHELL32.@]
407 *
408 * NOTES
409 * the registry path are for win98 (tested)
410 * and possibly are the same in nt40
411 *
412 */
414{
415#ifdef __REACTOS__
418 *lpsfs = *(LPSHELLFLAGSTATE)&ss;
419 if (dwMask & SSF_HIDEICONS)
420 lpsfs->fHideIcons = ss.fHideIcons;
421 if (dwMask & ssf_autocheckselect)
422 lpsfs->fAutoCheckSelect = ss.fAutoCheckSelect;
423 if (dwMask & ssf_iconsonly)
424 lpsfs->fIconsOnly = ss.fIconsOnly;
425#else
426 HKEY hKey;
428 DWORD dwDataSize = sizeof (DWORD);
429
430 TRACE("(%p 0x%08x)\n",lpsfs,dwMask);
431
432 if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
433 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0))
434 return;
435
436 if ( (SSF_SHOWEXTENSIONS & dwMask) && !RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &dwDataSize))
437 lpsfs->fShowExtensions = ((dwData == 0) ? 0 : 1);
438
439 if ( (SSF_SHOWINFOTIP & dwMask) && !RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &dwDataSize))
440 lpsfs->fShowInfoTip = ((dwData == 0) ? 0 : 1);
441
442 if ( (SSF_DONTPRETTYPATH & dwMask) && !RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &dwDataSize))
443 lpsfs->fDontPrettyPath = ((dwData == 0) ? 0 : 1);
444
445 if ( (SSF_HIDEICONS & dwMask) && !RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &dwDataSize))
446 lpsfs->fHideIcons = ((dwData == 0) ? 0 : 1);
447
448 if ( (SSF_MAPNETDRVBUTTON & dwMask) && !RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &dwDataSize))
449 lpsfs->fMapNetDrvBtn = ((dwData == 0) ? 0 : 1);
450
451 if ( (SSF_SHOWATTRIBCOL & dwMask) && !RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &dwDataSize))
452 lpsfs->fShowAttribCol = ((dwData == 0) ? 0 : 1);
453
454 if (((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) && !RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &dwDataSize))
455 { if (dwData == 0)
456 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
457 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
458 }
459 else if (dwData == 1)
460 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 1;
461 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
462 }
463 else if (dwData == 2)
464 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
465 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 1;
466 }
467 }
469#endif //__REACTOS__
470 TRACE("-- 0x%04x\n", *(WORD*)lpsfs);
471}
472
473/*************************************************************************
474 * SHShellFolderView_Message [SHELL32.73]
475 *
476 * Send a message to an explorer cabinet window.
477 *
478 * PARAMS
479 * hwndCabinet [I] The window containing the shellview to communicate with
480 * dwMessage [I] The SFVM message to send
481 * dwParam [I] Message parameter
482 *
483 * RETURNS
484 * fixme.
485 *
486 * NOTES
487 * Message SFVM_REARRANGE = 1
488 *
489 * This message gets sent when a column gets clicked to instruct the
490 * shell view to re-sort the item list. dwParam identifies the column
491 * that was clicked.
492 */
494 HWND hwndCabinet,
495 UINT uMessage,
497{
498 FIXME("%p %08x %08lx stub\n",hwndCabinet, uMessage, lParam);
499 return 0;
500}
501
502/*************************************************************************
503 * RegisterShellHook [SHELL32.181]
504 *
505 * Register a shell hook.
506 *
507 * PARAMS
508 * hwnd [I] Window handle
509 * dwType [I] Type of hook.
510 *
511 * NOTES
512 * Exported by ordinal
513 */
515 HWND hWnd,
516 DWORD dwType)
517{
518 if (dwType == 3)
519 {
522 }
523 else if (dwType == 0)
524 {
526 }
527
528 ERR("Unsupported argument");
529 return FALSE;
530}
531
532/*************************************************************************
533 * ShellMessageBoxW [SHELL32.182]
534 *
535 * See ShellMessageBoxA.
536 *
537 */
538#ifdef __REACTOS__
539/*
540 * shell32.ShellMessageBoxW directly redirects to shlwapi.ShellMessageBoxWrapW,
541 * while shell32.ShellMessageBoxA is a copy-paste ANSI adaptation of the
542 * shlwapi.ShellMessageBoxWrapW function.
543 *
544 * From Vista+ onwards, all the implementation of ShellMessageBoxA/W that
545 * were existing in shell32 has been completely moved to shlwapi, so that
546 * shell32.ShellMessageBoxA and shell32.ShellMessageBoxW are redirections
547 * to the corresponding shlwapi functions.
548 *
549 */
550#else // !__REACTOS__
551/*
552 * NOTE:
553 * shlwapi.ShellMessageBoxWrapW is a duplicate of shell32.ShellMessageBoxW
554 * because we can't forward to it in the .spec file since it's exported by
555 * ordinal. If you change the implementation here please update the code in
556 * shlwapi as well.
557 */
558// Wine version, broken.
561 HWND hWnd,
562 LPCWSTR lpText,
563 LPCWSTR lpCaption,
564 UINT uType,
565 ...)
566{
567 WCHAR szText[100],szTitle[100];
568 LPCWSTR pszText = szText, pszTitle = szTitle;
569 LPWSTR pszTemp;
571 int ret;
572
573 __ms_va_start(args, uType);
574 /* wvsprintfA(buf,fmt, args); */
575
576 TRACE("(%p,%p,%p,%p,%08x)\n",
577 hInstance,hWnd,lpText,lpCaption,uType);
578
579 if (IS_INTRESOURCE(lpCaption))
581 else
582 pszTitle = lpCaption;
583
584 if (IS_INTRESOURCE(lpText))
585 LoadStringW(hInstance, LOWORD(lpText), szText, ARRAY_SIZE(szText));
586 else
587 pszText = lpText;
588
590 pszText, 0, 0, (LPWSTR)&pszTemp, 0, &args);
591
593
594 ret = MessageBoxW(hWnd,pszTemp,pszTitle,uType);
595 LocalFree(pszTemp);
596 return ret;
597}
598#endif
599
600/*************************************************************************
601 * ShellMessageBoxA [SHELL32.183]
602 *
603 * Format and output an error message.
604 *
605 * PARAMS
606 * hInstance [I] Instance handle of message creator
607 * hWnd [I] Window handle of message creator
608 * lpText [I] Resource Id of title or LPSTR
609 * lpCaption [I] Resource Id of title or LPSTR
610 * uType [I] Type of error message
611 *
612 * RETURNS
613 * A return value from MessageBoxA().
614 *
615 * NOTES
616 * Exported by ordinal
617 */
618#ifdef __REACTOS__
619/*
620 * Note that we cannot straightforwardly implement ShellMessageBoxA around
621 * ShellMessageBoxW, by converting some parameters from ANSI to UNICODE,
622 * because there may be some variadic ANSI strings, associated with '%s'
623 * printf-like formatters inside the format string, that would also need
624 * to be converted; however there is no way for us to find these and perform
625 * the conversion ourselves.
626 * Therefore, we re-implement ShellMessageBoxA by doing a copy-paste ANSI
627 * adaptation of the shlwapi.ShellMessageBoxWrapW function.
628 */
629#endif
632 HWND hWnd,
633 LPCSTR lpText,
634 LPCSTR lpCaption,
635 UINT uType,
636 ...)
637{
638#ifdef __REACTOS__
639 CHAR *szText = NULL, szTitle[100];
640 LPCSTR pszText, pszTitle = szTitle;
641 LPSTR pszTemp;
643 int ret;
644
645 __ms_va_start(args, uType);
646
647 TRACE("(%p,%p,%p,%p,%08x)\n", hInstance, hWnd, lpText, lpCaption, uType);
648
649 if (IS_INTRESOURCE(lpCaption))
651 else
652 pszTitle = lpCaption;
653
654 if (IS_INTRESOURCE(lpText))
655 {
656 /* Retrieve the length of the Unicode string and obtain the maximum
657 * possible length for the corresponding ANSI string (not counting
658 * any possible NULL-terminator). */
659 const WCHAR *ptr;
660 UINT len = LoadStringW(hInstance, LOWORD(lpText), (LPWSTR)&ptr, 0);
661
663 NULL, 0, NULL, NULL);
664
665 if (len)
666 {
667 szText = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(CHAR));
668 if (szText) LoadStringA(hInstance, LOWORD(lpText), szText, len + 1);
669 }
670 pszText = szText;
671 if (!pszText) {
672 WARN("Failed to load id %d\n", LOWORD(lpText));
674 return 0;
675 }
676 }
677 else
678 pszText = lpText;
679
681 pszText, 0, 0, (LPSTR)&pszTemp, 0, &args);
682
684
685 ret = MessageBoxA(hWnd, pszTemp, pszTitle, uType | MB_SETFOREGROUND);
686
687 HeapFree(GetProcessHeap(), 0, szText);
688 LocalFree(pszTemp);
689 return ret;
690
691#else // __REACTOS__
692
693// Wine version, broken.
694 char szText[100],szTitle[100];
695 LPCSTR pszText = szText, pszTitle = szTitle;
696 LPSTR pszTemp;
698 int ret;
699
700 __ms_va_start(args, uType);
701 /* wvsprintfA(buf,fmt, args); */
702
703 TRACE("(%p,%p,%p,%p,%08x)\n",
704 hInstance,hWnd,lpText,lpCaption,uType);
705
706 if (IS_INTRESOURCE(lpCaption))
707 LoadStringA(hInstance, LOWORD(lpCaption), szTitle, sizeof(szTitle));
708 else
709 pszTitle = lpCaption;
710
711 if (IS_INTRESOURCE(lpText))
712 LoadStringA(hInstance, LOWORD(lpText), szText, sizeof(szText));
713 else
714 pszText = lpText;
715
717 pszText, 0, 0, (LPSTR)&pszTemp, 0, &args);
718
720
721 ret = MessageBoxA(hWnd,pszTemp,pszTitle,uType);
722 LocalFree(pszTemp);
723 return ret;
724#endif
725}
726
727/*************************************************************************
728 * SHRegisterDragDrop [SHELL32.86]
729 *
730 * Probably equivalent to RegisterDragDrop but under Windows 95 it could use the
731 * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE
732 * for details. Under Windows 98 this function initializes the true OLE when called
733 * the first time, on XP always returns E_OUTOFMEMORY and it got removed from Vista.
734 *
735 * We follow Windows 98 behaviour.
736 *
737 * NOTES
738 * exported by ordinal
739 *
740 * SEE ALSO
741 * RegisterDragDrop, SHLoadOLE
742 */
744 HWND hWnd,
745 LPDROPTARGET pDropTarget)
746{
747 static BOOL ole_initialized = FALSE;
748 HRESULT hr;
749
750 TRACE("(%p,%p)\n", hWnd, pDropTarget);
751
752 if (!ole_initialized)
753 {
755 if (FAILED(hr))
756 return hr;
757 ole_initialized = TRUE;
758 }
759 return RegisterDragDrop(hWnd, pDropTarget);
760}
761
762/*************************************************************************
763 * SHRevokeDragDrop [SHELL32.87]
764 *
765 * Probably equivalent to RevokeDragDrop but under Windows 95 it could use the
766 * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE
767 * for details. Function removed from Windows Vista.
768 *
769 * We call ole32 RevokeDragDrop which seems to work even if OleInitialize was
770 * not called.
771 *
772 * NOTES
773 * exported by ordinal
774 *
775 * SEE ALSO
776 * RevokeDragDrop, SHLoadOLE
777 */
779{
780 TRACE("(%p)\n", hWnd);
781 return RevokeDragDrop(hWnd);
782}
783
784/*************************************************************************
785 * SHDoDragDrop [SHELL32.88]
786 *
787 * Probably equivalent to DoDragDrop but under Windows 9x it could use the
788 * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE
789 * for details
790 *
791 * NOTES
792 * exported by ordinal
793 *
794 * SEE ALSO
795 * DoDragDrop, SHLoadOLE
796 */
798 HWND hWnd,
799 LPDATAOBJECT lpDataObject,
800 LPDROPSOURCE lpDropSource,
801 DWORD dwOKEffect,
802 LPDWORD pdwEffect)
803{
804 FIXME("(%p %p %p 0x%08x %p):stub.\n",
805 hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
806 return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect);
807}
808
809/*************************************************************************
810 * ArrangeWindows [SHELL32.184]
811 *
812 */
814 WORD cKids, const HWND *lpKids)
815{
816 /* Unimplemented in WinXP SP3 */
817 TRACE("(%p 0x%08x %p 0x%04x %p):stub.\n",
818 hwndParent, dwReserved, lpRect, cKids, lpKids);
819 return 0;
820}
821
822/*************************************************************************
823 * SignalFileOpen [SHELL32.103]
824 *
825 * NOTES
826 * exported by ordinal
827 */
830{
831 FIXME("(%p):stub.\n", pidl);
832
833 return FALSE;
834}
835
836#ifndef __REACTOS__
837
838/*************************************************************************
839 * SHADD_get_policy - helper function for SHAddToRecentDocs
840 *
841 * PARAMETERS
842 * policy [IN] policy name (null termed string) to find
843 * type [OUT] ptr to DWORD to receive type
844 * buffer [OUT] ptr to area to hold data retrieved
845 * len [IN/OUT] ptr to DWORD holding size of buffer and getting
846 * length filled
847 *
848 * RETURNS
849 * result of the SHQueryValueEx call
850 */
852{
853 HKEY Policy_basekey;
854 INT ret;
855
856 /* Get the key for the policies location in the registry
857 */
859 "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
860 0, KEY_READ, &Policy_basekey)) {
861
863 "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
864 0, KEY_READ, &Policy_basekey)) {
865 TRACE("No Explorer Policies location exists. Policy wanted=%s\n",
866 policy);
867 *len = 0;
869 }
870 }
871
872 /* Retrieve the data if it exists
873 */
874 ret = SHQueryValueExA(Policy_basekey, policy, 0, type, buffer, len);
875 RegCloseKey(Policy_basekey);
876 return ret;
877}
878
879#endif // __REACTOS__
880
881/*************************************************************************
882 * SHADD_compare_mru - helper function for SHAddToRecentDocs
883 *
884 * PARAMETERS
885 * data1 [IN] data being looked for
886 * data2 [IN] data in MRU
887 * cbdata [IN] length from FindMRUData call (not used)
888 *
889 * RETURNS
890 * position within MRU list that data was added.
891 */
893{
894#ifdef __REACTOS__
895 LPCWSTR psz1, psz2;
896 INT iCmp = lstrcmpiW(data1, data2);
897 if (iCmp != 0)
898 return iCmp;
899 psz1 = data1;
900 psz2 = data2;
901 psz1 += lstrlenW(psz1) + 1;
902 psz2 += lstrlenW(psz2) + 1;
903 return lstrcmpiW(psz1, psz2);
904#else
905 return lstrcmpiA(data1, data2);
906#endif
907}
908
909#ifdef __REACTOS__
910static BOOL
911DoStoreMRUData(LPBYTE pbBuffer, LPDWORD pcbBuffer,
912 LPCWSTR pszTargetTitle, LPCWSTR pszTargetPath, LPCWSTR pszLinkTitle)
913{
914 DWORD ib = 0, cb;
915 INT cchTargetTitle = lstrlenW(pszTargetTitle);
916 INT cchTargetPath = lstrlenW(pszTargetPath);
917 INT cchLinkTitle = lstrlenW(pszLinkTitle);
918
919 cb = (cchTargetTitle + 1 + cchTargetPath + 1 + cchLinkTitle + 2) * sizeof(WCHAR);
920 if (cb > *pcbBuffer)
921 return FALSE;
922
923 ZeroMemory(pbBuffer, *pcbBuffer);
924
925 cb = (cchTargetTitle + 1) * sizeof(WCHAR);
926 if (ib + cb > *pcbBuffer)
927 return FALSE;
928 CopyMemory(&pbBuffer[ib], pszTargetTitle, cb);
929 ib += cb;
930
931 cb = (cchTargetPath + 1) * sizeof(WCHAR);
932 if (ib + cb > *pcbBuffer)
933 return FALSE;
934 CopyMemory(&pbBuffer[ib], pszTargetPath, cb);
935 ib += cb;
936
937 cb = (cchLinkTitle + 1) * sizeof(WCHAR);
938 if (ib + cb > *pcbBuffer)
939 return FALSE;
940 CopyMemory(&pbBuffer[ib], pszLinkTitle, cb);
941 ib += cb;
942
943 *pcbBuffer = ib;
944 return TRUE;
945}
946#else
947/*************************************************************************
948 * SHADD_create_add_mru_data - helper function for SHAddToRecentDocs
949 *
950 * PARAMETERS
951 * mruhandle [IN] handle for created MRU list
952 * doc_name [IN] null termed pure doc name
953 * new_lnk_name [IN] null termed path and file name for .lnk file
954 * buffer [IN/OUT] 2048 byte area to construct MRU data
955 * len [OUT] ptr to int to receive space used in buffer
956 *
957 * RETURNS
958 * position within MRU list that data was added.
959 */
960static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPCSTR doc_name, LPCSTR new_lnk_name,
962{
963 LPSTR ptr;
964 INT wlen;
965
966 /*FIXME: Document:
967 * RecentDocs MRU data structure seems to be:
968 * +0h document file name w/ terminating 0h
969 * +nh short int w/ size of remaining
970 * +n+2h 02h 30h, or 01h 30h, or 00h 30h - unknown
971 * +n+4h 10 bytes zeros - unknown
972 * +n+eh shortcut file name w/ terminating 0h
973 * +n+e+nh 3 zero bytes - unknown
974 */
975
976 /* Create the MRU data structure for "RecentDocs"
977 */
978 ptr = buffer;
979 lstrcpyA(ptr, doc_name);
980 ptr += (lstrlenA(buffer) + 1);
981 wlen= lstrlenA(new_lnk_name) + 1 + 12;
982 *((short int*)ptr) = wlen;
983 ptr += 2; /* step past the length */
984 *(ptr++) = 0x30; /* unknown reason */
985 *(ptr++) = 0; /* unknown, but can be 0x00, 0x01, 0x02 */
986 memset(ptr, 0, 10);
987 ptr += 10;
988 lstrcpyA(ptr, new_lnk_name);
989 ptr += (lstrlenA(new_lnk_name) + 1);
990 memset(ptr, 0, 3);
991 ptr += 3;
992 *len = ptr - buffer;
993
994 /* Add the new entry into the MRU list
995 */
996 return AddMRUData(mruhandle, buffer, *len);
997}
998#endif
999
1000/*************************************************************************
1001 * SHAddToRecentDocs [SHELL32.@]
1002 *
1003 * Modify (add/clear) Shell's list of recently used documents.
1004 *
1005 * PARAMETERS
1006 * uFlags [IN] SHARD_PATHA, SHARD_PATHW or SHARD_PIDL
1007 * pv [IN] string or pidl, NULL clears the list
1008 *
1009 * NOTES
1010 * exported by name
1011 *
1012 * FIXME
1013 * convert to unicode
1014 */
1016{
1017#ifdef __REACTOS__
1018 INT ret;
1019 WCHAR szTargetPath[MAX_PATH], szLinkDir[MAX_PATH], szLinkFile[MAX_PATH], szDescription[80];
1021 DWORD cbBuffer;
1022 HANDLE hFind;
1024 HKEY hExplorerKey;
1025 LONG error;
1026 LPWSTR pchDotExt, pchTargetTitle, pchLinkTitle;
1027 MRUINFOW mru;
1028 HANDLE hMRUList = NULL;
1029 IShellLinkW *psl = NULL;
1030 IPersistFile *pPf = NULL;
1031 HRESULT hr;
1032 BYTE Buffer[(MAX_PATH + 64) * sizeof(WCHAR)];
1033
1034 TRACE("%04x %p\n", uFlags, pv);
1035
1036 /* check policy */
1038 TRACE("policy value for NoRecentDocsHistory = %08x\n", ret);
1039 if (ret != 0)
1040 return;
1041
1042 /* store to szTargetPath */
1043 szTargetPath[0] = 0;
1044 if (pv)
1045 {
1046 switch (uFlags)
1047 {
1048 case SHARD_PATHA:
1049 MultiByteToWideChar(CP_ACP, 0, pv, -1, szLinkDir, ARRAYSIZE(szLinkDir));
1050 GetFullPathNameW(szLinkDir, ARRAYSIZE(szTargetPath), szTargetPath, NULL);
1051 break;
1052
1053 case SHARD_PATHW:
1054 GetFullPathNameW(pv, ARRAYSIZE(szTargetPath), szTargetPath, NULL);
1055 break;
1056
1057 case SHARD_PIDL:
1058 SHGetPathFromIDListW(pv, szLinkDir);
1059 GetFullPathNameW(szLinkDir, ARRAYSIZE(szTargetPath), szTargetPath, NULL);
1060 break;
1061
1062 default:
1063 FIXME("Unsupported flags: %u\n", uFlags);
1064 return;
1065 }
1066 }
1067
1068 /* get recent folder */
1070 {
1071 ERR("serious issues 1\n");
1072 return;
1073 }
1074 TRACE("Users Recent dir %S\n", szLinkDir);
1075
1076 /* open Explorer key */
1077 error = RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1078 0, NULL, 0,
1079 KEY_READ | KEY_WRITE, NULL, &hExplorerKey, NULL);
1080 if (error)
1081 {
1082 ERR("Failed to RegCreateKeyExW: 0x%08X\n", error);
1083 return;
1084 }
1085
1086 if (!pv)
1087 {
1088 TRACE("pv is NULL, so delete all shortcut files in %S\n", szLinkDir);
1089
1090 lstrcpynW(szLinkFile, szLinkDir, ARRAYSIZE(szLinkFile));
1091 PathAppendW(szLinkFile, L"*.lnk");
1092
1093 hFind = FindFirstFileW(szLinkFile, &find);
1094 if (hFind != INVALID_HANDLE_VALUE)
1095 {
1096 do
1097 {
1098 lstrcpynW(szLinkFile, szLinkDir, ARRAYSIZE(szLinkFile));
1099 PathAppendW(szLinkFile, find.cFileName);
1100 DeleteFileW(szLinkFile);
1101 } while (FindNextFile(hFind, &find));
1102 FindClose(hFind);
1103 }
1104
1105 SHDeleteKeyW(hExplorerKey, L"RecentDocs");
1106 RegCloseKey(hExplorerKey);
1107 return;
1108 }
1109
1110 if (szTargetPath[0] == 0 || !PathFileExistsW(szTargetPath) ||
1111 PathIsDirectoryW(szTargetPath))
1112 {
1113 /* path is not normal file */
1114 RegCloseKey(hExplorerKey);
1115 return;
1116 }
1117
1118 hr = CoInitialize(NULL);
1119 if (FAILED(hr))
1120 {
1121 ERR("CoInitialize: %08X\n", hr);
1122 RegCloseKey(hExplorerKey);
1123 return;
1124 }
1125
1126 /* check if file is a shortcut */
1127 ret = 0;
1128 pchDotExt = PathFindExtensionW(szTargetPath);
1129 while (lstrcmpiW(pchDotExt, L".lnk") == 0)
1130 {
1131 hr = IShellLink_ConstructFromPath(szTargetPath, &IID_IShellLinkW, (LPVOID*)&psl);
1132 if (FAILED(hr))
1133 {
1134 ERR("IShellLink_ConstructFromPath: 0x%08X\n", hr);
1135 goto Quit;
1136 }
1137
1138 IShellLinkW_GetPath(psl, szPath, ARRAYSIZE(szPath), NULL, 0);
1139 IShellLinkW_Release(psl);
1140 psl = NULL;
1141
1142 lstrcpynW(szTargetPath, szPath, ARRAYSIZE(szTargetPath));
1143 pchDotExt = PathFindExtensionW(szTargetPath);
1144
1145 if (++ret >= 8)
1146 {
1147 ERR("Link loop?\n");
1148 goto Quit;
1149 }
1150 }
1151 if (!lstrcmpiW(pchDotExt, L".exe"))
1152 {
1153 /* executables are not added */
1154 goto Quit;
1155 }
1156
1157 /* *** JOB 0: Build strings *** */
1158
1159 pchTargetTitle = PathFindFileNameW(szTargetPath);
1160
1161 lstrcpyW(szDescription, L"Shortcut to ");
1163
1164 lstrcpynW(szLinkFile, szLinkDir, ARRAYSIZE(szLinkFile));
1165 PathAppendW(szLinkFile, pchTargetTitle);
1166 StrCatBuffW(szLinkFile, L".lnk", ARRAYSIZE(szLinkFile));
1167 pchLinkTitle = PathFindFileNameW(szLinkFile);
1168
1169 /* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */
1170
1171 /* store MRU data */
1172 cbBuffer = sizeof(Buffer);
1173 ret = DoStoreMRUData(Buffer, &cbBuffer, pchTargetTitle, szTargetPath, pchLinkTitle);
1174 if (!ret)
1175 {
1176 ERR("DoStoreMRUData failed: %d\n", ret);
1177 goto Quit;
1178 }
1179
1180 /* create MRU list */
1181 mru.cbSize = sizeof(mru);
1182 mru.uMax = 16;
1184 mru.hKey = hExplorerKey;
1185 mru.lpszSubKey = L"RecentDocs";
1186 mru.lpfnCompare = (MRUCMPPROCW)SHADD_compare_mru;
1187 hMRUList = CreateMRUListW(&mru);
1188 if (!hMRUList)
1189 {
1190 ERR("CreateMRUListW failed\n");
1191 goto Quit;
1192 }
1193
1194 /* already exists? */
1195 ret = FindMRUData(hMRUList, Buffer, cbBuffer, NULL);
1196 if (ret >= 0)
1197 {
1198 /* Just touch for speed */
1199 HANDLE hFile;
1203 {
1204 TRACE("Just touch file '%S'.\n", szLinkFile);
1206 goto Quit;
1207 }
1208 }
1209
1210 /* add MRU data */
1211 ret = AddMRUData(hMRUList, Buffer, cbBuffer);
1212 if (ret < 0)
1213 {
1214 ERR("AddMRUData failed: %d\n", ret);
1215 goto Quit;
1216 }
1217
1218 /* *** JOB 2: Create shortcut in user's "Recent" directory *** */
1219
1220 hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
1221 &IID_IShellLinkW, (LPVOID *)&psl);
1222 if (FAILED(hr))
1223 {
1224 ERR("CoInitialize for IID_IShellLinkW: %08X\n", hr);
1225 goto Quit;
1226 }
1227
1228 hr = IShellLinkW_QueryInterface(psl, &IID_IPersistFile, (LPVOID *)&pPf);
1229 if (FAILED(hr))
1230 {
1231 ERR("IShellLinkW_QueryInterface: %08X\n", hr);
1232 goto Quit;
1233 }
1234
1235 if (uFlags == SHARD_PIDL)
1236 hr = IShellLinkW_SetIDList(psl, pv);
1237 else
1238 hr = IShellLinkW_SetPath(psl, pv);
1239
1240 IShellLinkW_SetDescription(psl, szDescription);
1241
1242 hr = IPersistFile_Save(pPf, szLinkFile, TRUE);
1243 if (FAILED(hr))
1244 {
1245 ERR("IPersistFile_Save: 0x%08X\n", hr);
1246 }
1247
1248 hr = IPersistFile_SaveCompleted(pPf, szLinkFile);
1249 if (FAILED(hr))
1250 {
1251 ERR("IPersistFile_SaveCompleted: 0x%08X\n", hr);
1252 }
1253
1254Quit:
1255 if (hMRUList)
1256 FreeMRUList(hMRUList);
1257 if (pPf)
1258 IPersistFile_Release(pPf);
1259 if (psl)
1260 IShellLinkW_Release(psl);
1262 RegCloseKey(hExplorerKey);
1263#else
1264/* If list is a string list lpfnCompare has the following prototype
1265 * int CALLBACK MRUCompareString(LPCSTR s1, LPCSTR s2)
1266 * for binary lists the prototype is
1267 * int CALLBACK MRUCompareBinary(LPCVOID data1, LPCVOID data2, DWORD cbData)
1268 * where cbData is the no. of bytes to compare.
1269 * Need to check what return value means identical - 0?
1270 */
1271
1272
1273 UINT olderrormode;
1274 HKEY HCUbasekey;
1275 CHAR doc_name[MAX_PATH];
1276 CHAR link_dir[MAX_PATH];
1277 CHAR new_lnk_filepath[MAX_PATH];
1278 CHAR new_lnk_name[MAX_PATH];
1279 CHAR * ext;
1280 IMalloc *ppM;
1281 LPITEMIDLIST pidl;
1282 HWND hwnd = 0; /* FIXME: get real window handle */
1283 INT ret;
1284 DWORD data[64], datalen, type;
1285
1286 TRACE("%04x %p\n", uFlags, pv);
1287
1288 /*FIXME: Document:
1289 * RecentDocs MRU data structure seems to be:
1290 * +0h document file name w/ terminating 0h
1291 * +nh short int w/ size of remaining
1292 * +n+2h 02h 30h, or 01h 30h, or 00h 30h - unknown
1293 * +n+4h 10 bytes zeros - unknown
1294 * +n+eh shortcut file name w/ terminating 0h
1295 * +n+e+nh 3 zero bytes - unknown
1296 */
1297
1298 /* See if we need to do anything.
1299 */
1300 datalen = 64;
1301 ret=SHADD_get_policy( "NoRecentDocsHistory", &type, data, &datalen);
1302 if ((ret > 0) && (ret != ERROR_FILE_NOT_FOUND)) {
1303 ERR("Error %d getting policy \"NoRecentDocsHistory\"\n", ret);
1304 return;
1305 }
1306 if (ret == ERROR_SUCCESS) {
1307 if (!( (type == REG_DWORD) ||
1308 ((type == REG_BINARY) && (datalen == 4)) )) {
1309 ERR("Error policy data for \"NoRecentDocsHistory\" not formatted correctly, type=%d, len=%d\n",
1310 type, datalen);
1311 return;
1312 }
1313
1314 TRACE("policy value for NoRecentDocsHistory = %08x\n", data[0]);
1315 /* now test the actual policy value */
1316 if ( data[0] != 0)
1317 return;
1318 }
1319
1320 /* Open key to where the necessary info is
1321 */
1322 /* FIXME: This should be done during DLL PROCESS_ATTACH (or THREAD_ATTACH)
1323 * and the close should be done during the _DETACH. The resulting
1324 * key is stored in the DLL global data.
1325 */
1327 "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1328 0, 0, 0, KEY_READ, 0, &HCUbasekey, 0)) {
1329 ERR("Failed to create 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer'\n");
1330 return;
1331 }
1332
1333 /* Get path to user's "Recent" directory
1334 */
1335 if(SUCCEEDED(SHGetMalloc(&ppM))) {
1337 &pidl))) {
1338 SHGetPathFromIDListA(pidl, link_dir);
1339 IMalloc_Free(ppM, pidl);
1340 }
1341 else {
1342 /* serious issues */
1343 link_dir[0] = 0;
1344 ERR("serious issues 1\n");
1345 }
1346 IMalloc_Release(ppM);
1347 }
1348 else {
1349 /* serious issues */
1350 link_dir[0] = 0;
1351 ERR("serious issues 2\n");
1352 }
1353 TRACE("Users Recent dir %s\n", link_dir);
1354
1355 /* If no input, then go clear the lists */
1356 if (!pv) {
1357 /* clear user's Recent dir
1358 */
1359
1360 /* FIXME: delete all files in "link_dir"
1361 *
1362 * while( more files ) {
1363 * lstrcpyA(old_lnk_name, link_dir);
1364 * PathAppendA(old_lnk_name, filenam);
1365 * DeleteFileA(old_lnk_name);
1366 * }
1367 */
1368 FIXME("should delete all files in %s\\\n", link_dir);
1369
1370 /* clear MRU list
1371 */
1372 /* MS Bug ?? v4.72.3612.1700 of shell32 does the delete against
1373 * HKEY_LOCAL_MACHINE version of ...CurrentVersion\Explorer
1374 * and naturally it fails w/ rc=2. It should do it against
1375 * HKEY_CURRENT_USER which is where it is stored, and where
1376 * the MRU routines expect it!!!!
1377 */
1378 RegDeleteKeyA(HCUbasekey, "RecentDocs");
1379 RegCloseKey(HCUbasekey);
1380 return;
1381 }
1382
1383 /* Have data to add, the jobs to be done:
1384 * 1. Add document to MRU list in registry "HKCU\Software\
1385 * Microsoft\Windows\CurrentVersion\Explorer\RecentDocs".
1386 * 2. Add shortcut to document in the user's Recent directory
1387 * (CSIDL_RECENT).
1388 * 3. Add shortcut to Start menu's Documents submenu.
1389 */
1390
1391 /* Get the pure document name from the input
1392 */
1393 switch (uFlags)
1394 {
1395 case SHARD_PIDL:
1396 if (!SHGetPathFromIDListA(pv, doc_name))
1397 {
1398 WARN("can't get path from PIDL\n");
1399 return;
1400 }
1401 break;
1402
1403 case SHARD_PATHA:
1404 lstrcpynA(doc_name, pv, MAX_PATH);
1405 break;
1406
1407 case SHARD_PATHW:
1408 WideCharToMultiByte(CP_ACP, 0, pv, -1, doc_name, MAX_PATH, NULL, NULL);
1409 break;
1410
1411 default:
1412 FIXME("Unsupported flags: %u\n", uFlags);
1413 return;
1414 }
1415
1416 TRACE("full document name %s\n", debugstr_a(doc_name));
1417
1418 PathStripPathA(doc_name);
1419 TRACE("stripped document name %s\n", debugstr_a(doc_name));
1420
1421
1422 /* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */
1423
1424 { /* on input needs:
1425 * doc_name - pure file-spec, no path
1426 * link_dir - path to the user's Recent directory
1427 * HCUbasekey - key of ...Windows\CurrentVersion\Explorer" node
1428 * creates:
1429 * new_lnk_name- pure file-spec, no path for new .lnk file
1430 * new_lnk_filepath
1431 * - path and file name of new .lnk file
1432 */
1433 CREATEMRULISTA mymru;
1434 HANDLE mruhandle;
1435 INT len, pos, bufused, err;
1436 INT i;
1437 DWORD attr;
1438 CHAR buffer[2048];
1439 CHAR *ptr;
1440 CHAR old_lnk_name[MAX_PATH];
1441 short int slen;
1442
1443 mymru.cbSize = sizeof(CREATEMRULISTA);
1444 mymru.nMaxItems = 15;
1446 mymru.hKey = HCUbasekey;
1447 mymru.lpszSubKey = "RecentDocs";
1448 mymru.lpfnCompare = SHADD_compare_mru;
1449 mruhandle = CreateMRUListA(&mymru);
1450 if (!mruhandle) {
1451 /* MRU failed */
1452 ERR("MRU processing failed, handle zero\n");
1453 RegCloseKey(HCUbasekey);
1454 return;
1455 }
1456 len = lstrlenA(doc_name);
1457 pos = FindMRUData(mruhandle, doc_name, len, 0);
1458
1459 /* Now get the MRU entry that will be replaced
1460 * and delete the .lnk file for it
1461 */
1462 if ((bufused = EnumMRUListA(mruhandle, (pos == -1) ? 14 : pos,
1463 buffer, 2048)) != -1) {
1464 ptr = buffer;
1465 ptr += (lstrlenA(buffer) + 1);
1466 slen = *((short int*)ptr);
1467 ptr += 2; /* skip the length area */
1468 if (bufused >= slen + (ptr-buffer)) {
1469 /* buffer size looks good */
1470 ptr += 12; /* get to string */
1471 len = bufused - (ptr-buffer); /* get length of buf remaining */
1472 if (ptr[0] && (lstrlenA(ptr) <= len-1)) {
1473 /* appears to be good string */
1474 lstrcpyA(old_lnk_name, link_dir);
1475 PathAppendA(old_lnk_name, ptr);
1476 if (!DeleteFileA(old_lnk_name)) {
1477 if ((attr = GetFileAttributesA(old_lnk_name)) == INVALID_FILE_ATTRIBUTES) {
1478 if ((err = GetLastError()) != ERROR_FILE_NOT_FOUND) {
1479 ERR("Delete for %s failed, err=%d, attr=%08x\n",
1480 old_lnk_name, err, attr);
1481 }
1482 else {
1483 TRACE("old .lnk file %s did not exist\n",
1484 old_lnk_name);
1485 }
1486 }
1487 else {
1488 ERR("Delete for %s failed, attr=%08x\n",
1489 old_lnk_name, attr);
1490 }
1491 }
1492 else {
1493 TRACE("deleted old .lnk file %s\n", old_lnk_name);
1494 }
1495 }
1496 }
1497 }
1498
1499 /* Create usable .lnk file name for the "Recent" directory
1500 */
1501 wsprintfA(new_lnk_name, "%s.lnk", doc_name);
1502 lstrcpyA(new_lnk_filepath, link_dir);
1503 PathAppendA(new_lnk_filepath, new_lnk_name);
1504 i = 1;
1505 olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS);
1506 while (GetFileAttributesA(new_lnk_filepath) != INVALID_FILE_ATTRIBUTES) {
1507 i++;
1508 wsprintfA(new_lnk_name, "%s (%u).lnk", doc_name, i);
1509 lstrcpyA(new_lnk_filepath, link_dir);
1510 PathAppendA(new_lnk_filepath, new_lnk_name);
1511 }
1512 SetErrorMode(olderrormode);
1513 TRACE("new shortcut will be %s\n", new_lnk_filepath);
1514
1515 /* Now add the new MRU entry and data
1516 */
1517 pos = SHADD_create_add_mru_data(mruhandle, doc_name, new_lnk_name,
1518 buffer, &len);
1519 FreeMRUList(mruhandle);
1520 TRACE("Updated MRU list, new doc is position %d\n", pos);
1521 }
1522
1523 /* *** JOB 2: Create shortcut in user's "Recent" directory *** */
1524
1525 { /* on input needs:
1526 * doc_name - pure file-spec, no path
1527 * new_lnk_filepath
1528 * - path and file name of new .lnk file
1529 * uFlags[in] - flags on call to SHAddToRecentDocs
1530 * pv[in] - document path/pidl on call to SHAddToRecentDocs
1531 */
1532 IShellLinkA *psl = NULL;
1533 IPersistFile *pPf = NULL;
1534 HRESULT hres;
1536 WCHAR widelink[MAX_PATH];
1537
1538 CoInitialize(0);
1539
1540 hres = CoCreateInstance( &CLSID_ShellLink,
1541 NULL,
1542 CLSCTX_INPROC_SERVER,
1543 &IID_IShellLinkA,
1544 (LPVOID )&psl);
1545 if(SUCCEEDED(hres)) {
1546
1547 hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile,
1548 (LPVOID *)&pPf);
1549 if(FAILED(hres)) {
1550 /* bombed */
1551 ERR("failed QueryInterface for IPersistFile %08x\n", hres);
1552 goto fail;
1553 }
1554
1555 /* Set the document path or pidl */
1556 if (uFlags == SHARD_PIDL) {
1557 hres = IShellLinkA_SetIDList(psl, pv);
1558 } else {
1559 hres = IShellLinkA_SetPath(psl, pv);
1560 }
1561 if(FAILED(hres)) {
1562 /* bombed */
1563 ERR("failed Set{IDList|Path} %08x\n", hres);
1564 goto fail;
1565 }
1566
1567 lstrcpyA(desc, "Shortcut to ");
1568 lstrcatA(desc, doc_name);
1569 hres = IShellLinkA_SetDescription(psl, desc);
1570 if(FAILED(hres)) {
1571 /* bombed */
1572 ERR("failed SetDescription %08x\n", hres);
1573 goto fail;
1574 }
1575
1576 MultiByteToWideChar(CP_ACP, 0, new_lnk_filepath, -1,
1577 widelink, MAX_PATH);
1578 /* create the short cut */
1579 hres = IPersistFile_Save(pPf, widelink, TRUE);
1580 if(FAILED(hres)) {
1581 /* bombed */
1582 ERR("failed IPersistFile::Save %08x\n", hres);
1583 IPersistFile_Release(pPf);
1584 IShellLinkA_Release(psl);
1585 goto fail;
1586 }
1587 hres = IPersistFile_SaveCompleted(pPf, widelink);
1588 IPersistFile_Release(pPf);
1589 IShellLinkA_Release(psl);
1590 TRACE("shortcut %s has been created, result=%08x\n",
1591 new_lnk_filepath, hres);
1592 }
1593 else {
1594 ERR("CoCreateInstance failed, hres=%08x\n", hres);
1595 }
1596 }
1597
1598 fail:
1600
1601 /* all done */
1602 RegCloseKey(HCUbasekey);
1603 return;
1604#endif
1605}
1606
1607/*************************************************************************
1608 * SHCreateShellFolderViewEx [SHELL32.174]
1609 *
1610 * Create a new instance of the default Shell folder view object.
1611 *
1612 * RETURNS
1613 * Success: S_OK
1614 * Failure: error value
1615 *
1616 * NOTES
1617 * see IShellFolder::CreateViewObject
1618 */
1619 #ifndef __REACTOS__
1620
1622 LPCSFV psvcbi, /* [in] shelltemplate struct */
1623 IShellView **ppv) /* [out] IShellView pointer */
1624{
1625 IShellView * psf;
1626 HRESULT hRes;
1627
1628 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
1629 psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback,
1630 psvcbi->fvm, psvcbi->psvOuter);
1631
1632 *ppv = NULL;
1633 hRes = IShellView_Constructor(psvcbi->pshf, &psf);
1634
1635 if (FAILED(hRes))
1636 return hRes;
1637
1638 hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv);
1639 IShellView_Release(psf);
1640
1641 return hRes;
1642}
1643#endif
1644
1645/*************************************************************************
1646 * SHWinHelp [SHELL32.127]
1647 *
1648 */
1650{
1651 TRACE("(%p, %s, 0x%08x, %p)\n", hwnd, debugstr_w(pszHelp), uCommand, dwData);
1652 if (!WinHelpW(hwnd, pszHelp, uCommand, dwData))
1653 {
1654#if 0
1657#endif
1658 return FALSE;
1659 }
1660 return TRUE;
1661}
1662/*************************************************************************
1663 * SHRunControlPanel [SHELL32.161]
1664 *
1665 */
1666#ifdef __REACTOS__
1669{
1670 /*
1671 * TODO: Run in-process when possible, using
1672 * HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\InProcCPLs
1673 * and possibly some extra rules.
1674 * See also https://docs.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-shruncontrolpanel
1675 * "If the specified Control Panel item is already running, SHRunControlPanel
1676 * attempts to switch to that instance rather than opening a new instance."
1677 * This function is not supported as of Windows Vista, where it always returns FALSE.
1678 * However we need to keep it "alive" even when ReactOS is compliled as NT6+
1679 * in order to keep control panel elements launch commands.
1680 */
1681 WCHAR parameters[MAX_PATH] = L"shell32.dll,Control_RunDLL ";
1682 if (!commandLine)
1683 return FALSE;
1684 wcscat(parameters, commandLine);
1685 return ((INT_PTR)ShellExecuteW(parent, L"open", L"rundll32.exe", parameters, NULL, SW_SHOWNORMAL) > 32);
1686}
1687#endif
1688
1690{
1691#ifdef __REACTOS__
1692 TRACE("(%s, %p)n", debugstr_w(commandLine), parent);
1693 /* MSDN indicates that ROS should have a version check here but Vista+ just forwards to SHUNIMPL
1694 if (LOBYTE(GetVersion()) >= 6)
1695 return FALSE;
1696 */
1697 return SHELL32_RunControlPanel(commandLine, parent);
1698#else
1699 FIXME("(%s, %p): stub\n", debugstr_w(commandLine), parent);
1700 return FALSE;
1701#endif
1702}
1703
1705/*************************************************************************
1706 * SHSetInstanceExplorer [SHELL32.176]
1707 *
1708 * NOTES
1709 * Sets the interface
1710 */
1712{ TRACE("%p\n", lpUnknown);
1713 SHELL32_IExplorerInterface = lpUnknown;
1714}
1715/*************************************************************************
1716 * SHGetInstanceExplorer [SHELL32.@]
1717 *
1718 * NOTES
1719 * gets the interface pointer of the explorer and a reference
1720 */
1722{ TRACE("%p\n", lpUnknown);
1723
1724 *lpUnknown = SHELL32_IExplorerInterface;
1725
1727 return E_FAIL;
1728
1729 IUnknown_AddRef(SHELL32_IExplorerInterface);
1730 return S_OK;
1731}
1732/*************************************************************************
1733 * SHFreeUnusedLibraries [SHELL32.123]
1734 *
1735 * Probably equivalent to CoFreeUnusedLibraries but under Windows 9x it could use
1736 * the shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE
1737 * for details
1738 *
1739 * NOTES
1740 * exported by ordinal
1741 *
1742 * SEE ALSO
1743 * CoFreeUnusedLibraries, SHLoadOLE
1744 */
1746{
1747 FIXME("stub\n");
1749}
1750/*************************************************************************
1751 * DAD_AutoScroll [SHELL32.129]
1752 *
1753 */
1755{
1756 FIXME("hwnd = %p %p %p\n",hwnd,samples,pt);
1757 return FALSE;
1758}
1759/*************************************************************************
1760 * DAD_DragEnter [SHELL32.130]
1761 *
1762 */
1764{
1765 FIXME("hwnd = %p\n",hwnd);
1766 return FALSE;
1767}
1768/*************************************************************************
1769 * DAD_DragEnterEx [SHELL32.131]
1770 *
1771 */
1773{
1774 FIXME("hwnd = %p (%d,%d)\n",hwnd,p.x,p.y);
1775 return FALSE;
1776}
1777/*************************************************************************
1778 * DAD_DragMove [SHELL32.134]
1779 *
1780 */
1782{
1783 FIXME("(%d,%d)\n",p.x,p.y);
1784 return FALSE;
1785}
1786/*************************************************************************
1787 * DAD_DragLeave [SHELL32.132]
1788 *
1789 */
1791{
1792 FIXME("\n");
1793 return FALSE;
1794}
1795/*************************************************************************
1796 * DAD_SetDragImage [SHELL32.136]
1797 *
1798 * NOTES
1799 * exported by name
1800 */
1802 HIMAGELIST himlTrack,
1803 LPPOINT lppt)
1804{
1805 FIXME("%p %p stub\n",himlTrack, lppt);
1806 return FALSE;
1807}
1808/*************************************************************************
1809 * DAD_ShowDragImage [SHELL32.137]
1810 *
1811 * NOTES
1812 * exported by name
1813 */
1815{
1816 FIXME("0x%08x stub\n",bShow);
1817 return FALSE;
1818}
1819
1820/*************************************************************************
1821 * ReadCabinetState [SHELL32.651] NT 4.0
1822 *
1823 */
1825{
1826 HKEY hkey = 0;
1827 DWORD type, r;
1828 C_ASSERT(sizeof(*cs) == FIELD_OFFSET(CABINETSTATE, fMenuEnumFilter) + sizeof(UINT));
1829
1830 TRACE("%p %d\n", cs, length);
1831
1832 if( (cs == NULL) || (length < (int)sizeof(*cs)) )
1833 return FALSE;
1834
1835 r = RegOpenKeyW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CabinetState", &hkey );
1836 if( r == ERROR_SUCCESS )
1837 {
1838 type = REG_BINARY;
1839 r = RegQueryValueExW( hkey, L"Settings",
1840 NULL, &type, (LPBYTE)cs, (LPDWORD)&length );
1841 RegCloseKey( hkey );
1842
1843 }
1844
1845 /* if we can't read from the registry, create default values */
1846 if ( (r != ERROR_SUCCESS) || (cs->cLength < sizeof(*cs)) ||
1847 (cs->cLength != length) )
1848 {
1849 SHELLSTATE shellstate;
1850 shellstate.fWin95Classic = FALSE;
1852
1853 TRACE("Initializing shell cabinet settings\n");
1854 memset(cs, 0, sizeof(*cs));
1855 cs->cLength = sizeof(*cs);
1856 cs->nVersion = 2;
1857 cs->fFullPathTitle = FALSE;
1858 cs->fSaveLocalView = TRUE;
1859 cs->fNotShell = FALSE;
1860 cs->fSimpleDefault = TRUE;
1861 cs->fDontShowDescBar = FALSE;
1862 cs->fNewWindowMode = shellstate.fWin95Classic;
1863 cs->fShowCompColor = FALSE;
1864 cs->fDontPrettyNames = FALSE;
1865 cs->fAdminsCreateCommonGroups = TRUE;
1866 cs->fMenuEnumFilter = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
1867 }
1868
1869 return TRUE;
1870}
1871
1872/*************************************************************************
1873 * WriteCabinetState [SHELL32.652] NT 4.0
1874 *
1875 */
1877{
1878 DWORD r;
1879 HKEY hkey = 0;
1880
1881 TRACE("%p\n",cs);
1882
1883 if( cs == NULL )
1884 return FALSE;
1885
1886 r = RegCreateKeyExW( HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CabinetState", 0,
1887 NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL);
1888 if( r == ERROR_SUCCESS )
1889 {
1890 r = RegSetValueExW( hkey, L"Settings", 0,
1891 REG_BINARY, (LPBYTE) cs, cs->cLength);
1892
1893 RegCloseKey( hkey );
1894 }
1895
1896#ifdef __REACTOS__
1897 /* TODO: if (r==ERROR_SUCCESS) Increment GLOBALCOUNTER_FOLDERSETTINGSCHANGE */
1898#endif
1899 return (r==ERROR_SUCCESS);
1900}
1901
1902/*************************************************************************
1903 * FileIconInit [SHELL32.660]
1904 *
1905 */
1907{
1908 return SIC_Initialize();
1909}
1910
1911/*************************************************************************
1912 * SetAppStartingCursor [SHELL32.99]
1913 */
1915{ FIXME("hwnd=%p 0x%04x stub\n",u,v );
1916 return 0;
1917}
1918
1919/*************************************************************************
1920 * SHLoadOLE [SHELL32.151]
1921 *
1922 * To reduce the memory usage of Windows 95, its shell32 contained an
1923 * internal implementation of a part of COM (see e.g. SHGetMalloc, SHCoCreateInstance,
1924 * SHRegisterDragDrop etc.) that allowed to use in-process STA objects without
1925 * the need to load OLE32.DLL. If OLE32.DLL was already loaded, the SH* function
1926 * would just call the Co* functions.
1927 *
1928 * The SHLoadOLE was called when OLE32.DLL was being loaded to transfer all the
1929 * information from the shell32 "mini-COM" to ole32.dll.
1930 *
1931 * See https://devblogs.microsoft.com/oldnewthing/20040705-00/?p=38573 for a
1932 * detailed description.
1933 *
1934 * Under wine ole32.dll is always loaded as it is imported by shlwapi.dll which is
1935 * imported by shell32 and no "mini-COM" is used (except for the "LoadWithoutCOM"
1936 * hack in SHCoCreateInstance)
1937 */
1939{ FIXME("0x%08lx stub\n",lParam);
1940 return S_OK;
1941}
1942/*************************************************************************
1943 * DriveType [SHELL32.64]
1944 *
1945 */
1947{
1948 WCHAR root[] = L"A:\\";
1949 root[0] = L'A' + DriveType;
1950 return GetDriveTypeW(root);
1951}
1952/*************************************************************************
1953 * InvalidateDriveType [SHELL32.65]
1954 * Unimplemented in XP SP3
1955 */
1957{
1958 TRACE("0x%08x stub\n",u);
1959 return 0;
1960}
1961/*************************************************************************
1962 * SHAbortInvokeCommand [SHELL32.198]
1963 *
1964 */
1966{ FIXME("stub\n");
1967 return 1;
1968}
1969/*************************************************************************
1970 * SHOutOfMemoryMessageBox [SHELL32.126]
1971 *
1972 */
1974 HWND hwndOwner,
1975 LPCSTR lpCaption,
1976 UINT uType)
1977{
1978 FIXME("%p %s 0x%08x stub\n",hwndOwner, lpCaption, uType);
1979 return 0;
1980}
1981/*************************************************************************
1982 * SHFlushClipboard [SHELL32.121]
1983 *
1984 */
1986{
1987 return OleFlushClipboard();
1988}
1989
1990/*************************************************************************
1991 * SHWaitForFileToOpen [SHELL32.97]
1992 *
1993 */
1995 LPCITEMIDLIST pidl,
1996 DWORD dwFlags,
1997 DWORD dwTimeout)
1998{
1999 FIXME("%p 0x%08x 0x%08x stub\n", pidl, dwFlags, dwTimeout);
2000 return FALSE;
2001}
2002
2003/************************************************************************
2004 * RLBuildListOfPaths [SHELL32.146]
2005 *
2006 * NOTES
2007 * builds a DPA
2008 */
2010{ FIXME("stub\n");
2011 return 0;
2012}
2013/************************************************************************
2014 * SHValidateUNC [SHELL32.173]
2015 *
2016 */
2017BOOL WINAPI SHValidateUNC (HWND hwndOwner, PWSTR pszFile, UINT fConnect)
2018{
2019 FIXME("(%p, %s, 0x%08x): stub\n", hwndOwner, debugstr_w(pszFile), fConnect);
2020 return FALSE;
2021}
2022
2023/************************************************************************
2024 * DoEnvironmentSubstA [SHELL32.@]
2025 *
2026 * See DoEnvironmentSubstW.
2027 */
2029{
2030 LPSTR dst;
2031 BOOL res = FALSE;
2032 DWORD len = cchString;
2033
2034 TRACE("(%s, %d)\n", debugstr_a(pszString), cchString);
2035 if (pszString == NULL) /* Really return 0? */
2036 return 0;
2037 if ((dst = (LPSTR)HeapAlloc(GetProcessHeap(), 0, cchString * sizeof(CHAR))))
2038 {
2039 len = ExpandEnvironmentStringsA(pszString, dst, cchString);
2040 /* len includes the terminating 0 */
2041 if (len && len < cchString)
2042 {
2043 res = TRUE;
2044 memcpy(pszString, dst, len);
2045 }
2046 else
2047 len = cchString;
2048
2050 }
2051 return MAKELONG(len, res);
2052}
2053
2054/************************************************************************
2055 * DoEnvironmentSubstW [SHELL32.@]
2056 *
2057 * Replace all %KEYWORD% in the string with the value of the named
2058 * environment variable. If the buffer is too small, the string is not modified.
2059 *
2060 * PARAMS
2061 * pszString [I] '\0' terminated string with %keyword%.
2062 * [O] '\0' terminated string with %keyword% substituted.
2063 * cchString [I] size of str.
2064 *
2065 * RETURNS
2066 * Success: The string in the buffer is updated
2067 * HIWORD: TRUE
2068 * LOWORD: characters used in the buffer, including space for the terminating 0
2069 * Failure: buffer too small. The string is not modified.
2070 * HIWORD: FALSE
2071 * LOWORD: provided size of the buffer in characters
2072 */
2074{
2075 LPWSTR dst;
2076 BOOL res = FALSE;
2077 DWORD len = cchString;
2078
2079 TRACE("(%s, %d)\n", debugstr_w(pszString), cchString);
2080
2081 if ((cchString < MAXLONG) && (dst = HeapAlloc(GetProcessHeap(), 0, cchString * sizeof(WCHAR))))
2082 {
2083 len = ExpandEnvironmentStringsW(pszString, dst, cchString);
2084 /* len includes the terminating 0 */
2085 if (len && len <= cchString)
2086 {
2087 res = TRUE;
2088 memcpy(pszString, dst, len * sizeof(WCHAR));
2089 }
2090 else
2091 len = cchString;
2092
2094 }
2095 return MAKELONG(len, res);
2096}
2097
2098/************************************************************************
2099 * DoEnvironmentSubst [SHELL32.53]
2100 *
2101 * See DoEnvironmentSubstA.
2102 */
2104{
2105 if (SHELL_OsIsUnicode())
2106 return DoEnvironmentSubstW(x, y);
2107 return DoEnvironmentSubstA(x, y);
2108}
2109
2110/*************************************************************************
2111 * GUIDFromStringA [SHELL32.703]
2112 */
2114{
2115 ANSI_STRING ansi_str;
2116 WCHAR szWide[40];
2117 UNICODE_STRING guid_str = { 0, sizeof(szWide), szWide };
2118 if (*str != '{')
2119 return FALSE;
2120 RtlInitAnsiString(&ansi_str, str);
2121 return !RtlAnsiStringToUnicodeString(&guid_str, &ansi_str, FALSE) &&
2122 !RtlGUIDFromString(&guid_str, guid);
2123}
2124
2125/*************************************************************************
2126 * GUIDFromStringW [SHELL32.704]
2127 */
2129{
2130 UNICODE_STRING guid_str;
2131 if (!str || *str != L'{')
2132 return FALSE;
2133 RtlInitUnicodeString(&guid_str, str);
2134 return !RtlGUIDFromString(&guid_str, guid);
2135}
2136
2137/*************************************************************************
2138 * PathIsTemporaryA [SHELL32.713]
2139 */
2140#ifdef __REACTOS__
2143#else
2145#endif
2146{
2147#ifdef __REACTOS__
2148 WCHAR szWide[MAX_PATH];
2149
2150 TRACE("(%s)\n", debugstr_a(Str));
2151
2152 SHAnsiToUnicode(Str, szWide, _countof(szWide));
2153 return PathIsTemporaryW(szWide);
2154#else
2155 FIXME("(%s)stub\n", debugstr_a(Str));
2156 return FALSE;
2157#endif
2158}
2159
2160/*************************************************************************
2161 * PathIsTemporaryW [SHELL32.714]
2162 */
2163#ifdef __REACTOS__
2166#else
2168#endif
2169{
2170#ifdef __REACTOS__
2171 WCHAR szLongPath[MAX_PATH], szTempPath[MAX_PATH];
2172 DWORD attrs;
2173 LPCWSTR pszTarget = Str;
2174
2175 TRACE("(%s)\n", debugstr_w(Str));
2176
2177 attrs = GetFileAttributesW(Str);
2178 if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_TEMPORARY))
2179 return TRUE;
2180
2183 {
2184 return FALSE;
2185 }
2186
2187 if (GetLongPathNameW(Str, szLongPath, _countof(szLongPath)))
2188 pszTarget = szLongPath;
2189
2190 return (PathIsEqualOrSubFolder(szTempPath, pszTarget) ||
2193#else
2194 FIXME("(%s)stub\n", debugstr_w(Str));
2195 return FALSE;
2196#endif
2197}
2198
2199typedef struct _PSXA
2200{
2205
2206typedef struct _PSXA_CALL
2207{
2214
2216{
2218
2219 if (Call != NULL)
2220 {
2221 if ((Call->bMultiple || !Call->bCalled) &&
2222 Call->lpfnAddReplaceWith(hpage, Call->lParam))
2223 {
2224 Call->bCalled = TRUE;
2225 Call->uiCount++;
2226 return TRUE;
2227 }
2228 }
2229
2230 return FALSE;
2231}
2232
2233/*************************************************************************
2234 * SHAddFromPropSheetExtArray [SHELL32.167]
2235 */
2237{
2238 PSXA_CALL Call;
2239 UINT i;
2240 PPSXA psxa = (PPSXA)hpsxa;
2241
2242 TRACE("(%p,%p,%08lx)\n", hpsxa, lpfnAddPage, lParam);
2243
2244 if (psxa)
2245 {
2246 ZeroMemory(&Call, sizeof(Call));
2247 Call.lpfnAddReplaceWith = lpfnAddPage;
2248 Call.lParam = lParam;
2249 Call.bMultiple = TRUE;
2250
2251 /* Call the AddPage method of all registered IShellPropSheetExt interfaces */
2252 for (i = 0; i != psxa->uiCount; i++)
2253 {
2254 psxa->pspsx[i]->lpVtbl->AddPages(psxa->pspsx[i], PsxaCall, (LPARAM)&Call);
2255 }
2256
2257 return Call.uiCount;
2258 }
2259
2260 return 0;
2261}
2262
2263/*************************************************************************
2264 * SHCreatePropSheetExtArray [SHELL32.168]
2265 */
2267{
2268 return SHCreatePropSheetExtArrayEx(hKey, pszSubKey, max_iface, NULL);
2269}
2270
2271/*************************************************************************
2272 * SHCreatePropSheetExtArrayEx [SHELL32.194]
2273 */
2275{
2276 WCHAR szHandler[64];
2277 DWORD dwHandlerLen;
2278 WCHAR szClsidHandler[39];
2279 DWORD dwClsidSize;
2280 CLSID clsid;
2281 LONG lRet;
2282 DWORD dwIndex;
2283 IShellExtInit *psxi;
2284 IShellPropSheetExt *pspsx;
2285 HKEY hkBase, hkPropSheetHandlers;
2286 PPSXA psxa = NULL;
2287
2288 TRACE("(%p,%s,%u)\n", hKey, debugstr_w(pszSubKey), max_iface);
2289
2290 if (max_iface == 0)
2291 return NULL;
2292
2293 /* Open the registry key */
2294 lRet = RegOpenKeyW(hKey, pszSubKey, &hkBase);
2295 if (lRet != ERROR_SUCCESS)
2296 return NULL;
2297
2298 lRet = RegOpenKeyExW(hkBase, L"shellex\\PropertySheetHandlers", 0, KEY_ENUMERATE_SUB_KEYS, &hkPropSheetHandlers);
2299 RegCloseKey(hkBase);
2300 if (lRet == ERROR_SUCCESS)
2301 {
2302 /* Create and initialize the Property Sheet Extensions Array */
2303 psxa = LocalAlloc(LMEM_FIXED, FIELD_OFFSET(PSXA, pspsx[max_iface]));
2304 if (psxa)
2305 {
2306 ZeroMemory(psxa, FIELD_OFFSET(PSXA, pspsx[max_iface]));
2307 psxa->uiAllocated = max_iface;
2308
2309 /* Enumerate all subkeys and attempt to load the shell extensions */
2310 dwIndex = 0;
2311 do
2312 {
2313 dwHandlerLen = sizeof(szHandler) / sizeof(szHandler[0]);
2314 lRet = RegEnumKeyExW(hkPropSheetHandlers, dwIndex++, szHandler, &dwHandlerLen, NULL, NULL, NULL, NULL);
2315 if (lRet != ERROR_SUCCESS)
2316 {
2317 if (lRet == ERROR_MORE_DATA)
2318 continue;
2319
2320 if (lRet == ERROR_NO_MORE_ITEMS)
2321 lRet = ERROR_SUCCESS;
2322 break;
2323 }
2324
2325 /* The CLSID is stored either in the key itself or in its default value. */
2326 if (FAILED(lRet = SHCLSIDFromStringW(szHandler, &clsid)))
2327 {
2328 dwClsidSize = sizeof(szClsidHandler);
2329 if (SHGetValueW(hkPropSheetHandlers, szHandler, NULL, NULL, szClsidHandler, &dwClsidSize) == ERROR_SUCCESS)
2330 {
2331 /* Force a NULL-termination and convert the string */
2332 szClsidHandler[(sizeof(szClsidHandler) / sizeof(szClsidHandler[0])) - 1] = 0;
2333 lRet = SHCLSIDFromStringW(szClsidHandler, &clsid);
2334 }
2335 }
2336
2337 if (SUCCEEDED(lRet))
2338 {
2339 /* Attempt to get an IShellPropSheetExt and an IShellExtInit instance.
2340 Only if both interfaces are supported it's a real shell extension.
2341 Then call IShellExtInit's Initialize method. */
2342 if (SUCCEEDED(CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID *)&pspsx)))
2343 {
2344 if (SUCCEEDED(pspsx->lpVtbl->QueryInterface(pspsx, &IID_IShellExtInit, (PVOID *)&psxi)))
2345 {
2346 if (SUCCEEDED(psxi->lpVtbl->Initialize(psxi, NULL, pDataObj, hKey)))
2347 {
2348 /* Add the IShellPropSheetExt instance to the array */
2349 psxa->pspsx[psxa->uiCount++] = pspsx;
2350 }
2351 else
2352 {
2353 psxi->lpVtbl->Release(psxi);
2354 pspsx->lpVtbl->Release(pspsx);
2355 }
2356 }
2357 else
2358 pspsx->lpVtbl->Release(pspsx);
2359 }
2360 }
2361
2362 } while (psxa->uiCount != psxa->uiAllocated);
2363 }
2364 else
2366
2367 RegCloseKey(hkPropSheetHandlers);
2368 }
2369
2370 if (lRet != ERROR_SUCCESS && psxa)
2371 {
2372 SHDestroyPropSheetExtArray((HPSXA)psxa);
2373 psxa = NULL;
2374 }
2375
2376 return (HPSXA)psxa;
2377}
2378
2379/*************************************************************************
2380 * SHReplaceFromPropSheetExtArray [SHELL32.170]
2381 */
2383{
2384 PSXA_CALL Call;
2385 UINT i;
2386 PPSXA psxa = (PPSXA)hpsxa;
2387
2388 TRACE("(%p,%u,%p,%08lx)\n", hpsxa, uPageID, lpfnReplaceWith, lParam);
2389
2390 if (psxa)
2391 {
2392 ZeroMemory(&Call, sizeof(Call));
2393 Call.lpfnAddReplaceWith = lpfnReplaceWith;
2394 Call.lParam = lParam;
2395
2396 /* Call the ReplacePage method of all registered IShellPropSheetExt interfaces.
2397 Each shell extension is only allowed to call the callback once during the callback. */
2398 for (i = 0; i != psxa->uiCount; i++)
2399 {
2400 Call.bCalled = FALSE;
2401 psxa->pspsx[i]->lpVtbl->ReplacePage(psxa->pspsx[i], uPageID, PsxaCall, (LPARAM)&Call);
2402 }
2403
2404 return Call.uiCount;
2405 }
2406
2407 return 0;
2408}
2409
2410/*************************************************************************
2411 * SHDestroyPropSheetExtArray [SHELL32.169]
2412 */
2414{
2415 UINT i;
2416 PPSXA psxa = (PPSXA)hpsxa;
2417
2418 TRACE("(%p)\n", hpsxa);
2419
2420 if (psxa)
2421 {
2422 for (i = 0; i != psxa->uiCount; i++)
2423 {
2424 psxa->pspsx[i]->lpVtbl->Release(psxa->pspsx[i]);
2425 }
2426
2427 LocalFree(psxa);
2428 }
2429}
2430
2431/*************************************************************************
2432 * CIDLData_CreateFromIDArray [SHELL32.83]
2433 *
2434 * Create IDataObject from PIDLs??
2435 */
2437 PCIDLIST_ABSOLUTE pidlFolder,
2438 UINT cpidlFiles,
2439 PCUIDLIST_RELATIVE_ARRAY lppidlFiles,
2440 LPDATAOBJECT *ppdataObject)
2441{
2442 UINT i;
2443 HWND hwnd = 0; /*FIXME: who should be hwnd of owner? set to desktop */
2444 HRESULT hResult;
2445
2446 TRACE("(%p, %d, %p, %p)\n", pidlFolder, cpidlFiles, lppidlFiles, ppdataObject);
2447 if (TRACE_ON(pidl))
2448 {
2449 pdump (pidlFolder);
2450 for (i=0; i<cpidlFiles; i++) pdump (lppidlFiles[i]);
2451 }
2452 hResult = IDataObject_Constructor(hwnd, pidlFolder, lppidlFiles, cpidlFiles, FALSE, ppdataObject);
2453 return hResult;
2454}
2455
2456/*************************************************************************
2457 * SHCreateStdEnumFmtEtc [SHELL32.74]
2458 *
2459 * NOTES
2460 *
2461 */
2463 UINT cFormats,
2464 const FORMATETC *lpFormats,
2465 LPENUMFORMATETC *ppenumFormatetc)
2466{
2467 IEnumFORMATETC *pef;
2468 HRESULT hRes;
2469 TRACE("cf=%d fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc);
2470
2471 hRes = IEnumFORMATETC_Constructor(cFormats, lpFormats, &pef);
2472 if (FAILED(hRes))
2473 return hRes;
2474
2475 IEnumFORMATETC_AddRef(pef);
2476 hRes = IEnumFORMATETC_QueryInterface(pef, &IID_IEnumFORMATETC, (LPVOID*)ppenumFormatetc);
2477 IEnumFORMATETC_Release(pef);
2478
2479 return hRes;
2480}
2481
2482/*************************************************************************
2483 * SHFindFiles (SHELL32.90)
2484 */
2486{
2487 FIXME("params ignored: %p %p\n", pidlFolder, pidlSaveFile);
2489 {
2490 return FALSE;
2491 }
2492 /* Open the search results folder */
2493 /* FIXME: CSearchBar should be opened as well */
2494 return ShellExecuteW(NULL, NULL, L"explorer.exe", L"::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}", NULL, SW_SHOWNORMAL) > (HINSTANCE)32;
2495}
2496
2497/*************************************************************************
2498 * SHUpdateImageW (SHELL32.192)
2499 *
2500 * Notifies the shell that an icon in the system image list has been changed.
2501 *
2502 * PARAMS
2503 * pszHashItem [I] Path to file that contains the icon.
2504 * iIndex [I] Zero-based index of the icon in the file.
2505 * uFlags [I] Flags determining the icon attributes. See notes.
2506 * iImageIndex [I] Index of the icon in the system image list.
2507 *
2508 * RETURNS
2509 * Nothing
2510 *
2511 * NOTES
2512 * uFlags can be one or more of the following flags:
2513 * GIL_NOTFILENAME - pszHashItem is not a file name.
2514 * GIL_SIMULATEDOC - Create a document icon using the specified icon.
2515#ifdef __REACTOS__
2516 * https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shupdateimagew
2517#endif
2518 */
2519void WINAPI SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex)
2520{
2521#ifdef __REACTOS__
2522 // If iImageIndex == -1 (undetermined), it will fall back to the default value of 1.
2523 INT iEffectiveImageIndex = (iImageIndex == -1) ? 1 : iImageIndex;
2524
2526 item1.cbSize = sizeof(item1);
2527 item1.iIndex = iIndex;
2528 item1.iEffective = iEffectiveImageIndex;
2529 item1.uFlags = uFlags;
2530 item1.iEffective2 = iEffectiveImageIndex;
2531 item1.terminator = 0;
2532
2534
2535 LPWSTR pEnd = StrCpyNXW(item2.szHashItem, pszHashItem, _countof(item2.szHashItem));
2536 *pEnd = UNICODE_NULL;
2537
2538 item2.cbOffset = (WORD)((PBYTE)pEnd - (PBYTE)&item2);
2539 item2.iIndex = iIndex;
2540 item2.iEffectiveImageIndex = iEffectiveImageIndex;
2541 item2.uFlags = uFlags;
2542 item2.dwProcessId = GetCurrentProcessId();
2543 item2.terminator = 0;
2544
2546#else
2547 FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_w(pszHashItem), iIndex, uFlags, iImageIndex);
2548#endif
2549}
2550
2551/*************************************************************************
2552 * SHUpdateImageA (SHELL32.191)
2553 *
2554 * See SHUpdateImageW.
2555#ifdef __REACTOS__
2556 * https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shupdateimagea
2557#endif
2558 */
2559VOID WINAPI SHUpdateImageA(LPCSTR pszHashItem, INT iIndex, UINT uFlags, INT iImageIndex)
2560{
2561#ifdef __REACTOS__
2562 WCHAR szHashItem[MAX_PATH];
2563 SHAnsiToUnicode(pszHashItem, szHashItem, _countof(szHashItem));
2564 SHUpdateImageW(szHashItem, iIndex, uFlags, iImageIndex);
2565#else
2566 FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_a(pszHashItem), iIndex, uFlags, iImageIndex);
2567#endif
2568}
2569
2570#ifdef __REACTOS__
2576#endif
2578{
2579#ifdef __REACTOS__
2580 if (!pidlExtra)
2581 return -1;
2582
2584 (UNALIGNED const SHCNF_UPDATEIMAGE_DATA_2*)pidlExtra;
2585 if (pData->dwProcessId == GetCurrentProcessId())
2586 return pData->iEffectiveImageIndex;
2587
2588 WCHAR szHashItem[MAX_PATH];
2589 StrCpyNW(szHashItem, pData->szHashItem, _countof(szHashItem));
2590
2591 return SHLookupIconIndexW(szHashItem, pData->iIndex, pData->uFlags);
2592#else
2593 FIXME("%p - stub\n", pidlExtra);
2594
2595 return -1;
2596#endif
2597}
2598
2600{
2601 LPITEMIDLIST pidl = NULL;
2602 switch (dwType)
2603 {
2604 case SHOP_FILEPATH:
2605 pidl = ILCreateFromPathW(szObject);
2606 break;
2607 }
2608 if (pidl)
2609 {
2610 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST, hwnd, L"properties",
2611 NULL, szPage, NULL, SW_SHOWNORMAL, NULL, pidl };
2612 BOOL result = ShellExecuteExW(&sei);
2613 ILFree(pidl);
2614 return result;
2615 }
2616
2617 FIXME("%p, 0x%08x, %s, %s - stub\n", hwnd, dwType, debugstr_w(szObject), debugstr_w(szPage));
2618
2619 return TRUE;
2620}
2621
2623 UINT uFlags)
2624{
2625 WCHAR wszLinkTo[MAX_PATH];
2626 WCHAR wszDir[MAX_PATH];
2627 WCHAR wszName[MAX_PATH];
2628 BOOL res;
2629
2630 MultiByteToWideChar(CP_ACP, 0, pszLinkTo, -1, wszLinkTo, MAX_PATH);
2631 MultiByteToWideChar(CP_ACP, 0, pszDir, -1, wszDir, MAX_PATH);
2632
2633 res = SHGetNewLinkInfoW(wszLinkTo, wszDir, wszName, pfMustCopy, uFlags);
2634
2635 if (res)
2636 WideCharToMultiByte(CP_ACP, 0, wszName, -1, pszName, MAX_PATH, NULL, NULL);
2637
2638 return res;
2639}
2640
2642 UINT uFlags)
2643{
2644 const WCHAR *basename;
2645 WCHAR *dst_basename;
2646 int i=2;
2647
2648 TRACE("(%s, %s, %p, %p, 0x%08x)\n", debugstr_w(pszLinkTo), debugstr_w(pszDir),
2649 pszName, pfMustCopy, uFlags);
2650
2651 *pfMustCopy = FALSE;
2652
2653 if (uFlags & SHGNLI_PIDL)
2654 {
2655 FIXME("SHGNLI_PIDL flag unsupported\n");
2656 return FALSE;
2657 }
2658
2659 if (uFlags)
2660 FIXME("ignoring flags: 0x%08x\n", uFlags);
2661
2662 /* FIXME: should test if the file is a shortcut or DOS program */
2664 return FALSE;
2665
2666 basename = strrchrW(pszLinkTo, '\\');
2667 if (basename)
2668 basename = basename+1;
2669 else
2670 basename = pszLinkTo;
2671
2672 lstrcpynW(pszName, pszDir, MAX_PATH);
2673 if (!PathAddBackslashW(pszName))
2674 return FALSE;
2675
2676 dst_basename = pszName + strlenW(pszName);
2677
2678 snprintfW(dst_basename, pszName + MAX_PATH - dst_basename, L"%s.lnk", basename);
2679
2681 {
2682 snprintfW(dst_basename, pszName + MAX_PATH - dst_basename, L"%s (%d).lnk", basename, i);
2683 i++;
2684 }
2685
2686 return TRUE;
2687}
2688
2690{
2691#ifdef __REACTOS__
2692 if (SHELL_OsIsUnicode())
2693 return SHStartNetConnectionDialogW(hwnd, (LPCWSTR)pszRemoteName, dwType);
2694 return SHStartNetConnectionDialogA(hwnd, pszRemoteName, dwType);
2695#else
2696 FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_a(pszRemoteName), dwType);
2697
2698 return S_OK;
2699#endif
2700}
2701
2702#ifndef __REACTOS__ /* See ../utils.cpp */
2703/*************************************************************************
2704 * SHSetLocalizedName (SHELL32.@)
2705 */
2706HRESULT WINAPI SHSetLocalizedName(LPCWSTR pszPath, LPCWSTR pszResModule, int idsRes)
2707{
2708 FIXME("%p, %s, %d - stub\n", pszPath, debugstr_w(pszResModule), idsRes);
2709
2710 return S_OK;
2711}
2712#endif
2713
2714#ifndef __REACTOS__ // See ../utils.cpp
2715/*************************************************************************
2716 * LinkWindow_RegisterClass (SHELL32.258)
2717 */
2719{
2720 FIXME("()\n");
2721 return TRUE;
2722}
2723
2724/*************************************************************************
2725 * LinkWindow_UnregisterClass (SHELL32.259)
2726 */
2728{
2729 FIXME("()\n");
2730 return TRUE;
2731}
2732#endif
2733
2734/*************************************************************************
2735 * SHFlushSFCache (SHELL32.526)
2736 *
2737 * Notifies the shell that a user-specified special folder location has changed.
2738 *
2739 * NOTES
2740 * In Wine, the shell folder registry values are not cached, so this function
2741 * has no effect.
2742 */
2744{
2745}
2746
2747/*************************************************************************
2748 * SHGetImageList (SHELL32.727)
2749 *
2750 * Returns a copy of a shell image list.
2751 *
2752 * NOTES
2753 * Windows XP features 4 sizes of image list, and Vista 5. Wine currently
2754 * only supports the traditional small and large image lists, so requests
2755 * for the others will currently fail.
2756 */
2757HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
2758{
2759 HIMAGELIST hLarge, hSmall;
2760 HIMAGELIST hNew;
2761 HRESULT ret = E_FAIL;
2762
2763 /* Wine currently only maintains large and small image lists */
2764 if ((iImageList != SHIL_LARGE) && (iImageList != SHIL_SMALL) && (iImageList != SHIL_SYSSMALL))
2765 {
2766 FIXME("Unsupported image list %i requested\n", iImageList);
2767 return E_FAIL;
2768 }
2769
2770 Shell_GetImageLists(&hLarge, &hSmall);
2771#ifndef __REACTOS__
2772 hNew = ImageList_Duplicate(iImageList == SHIL_LARGE ? hLarge : hSmall);
2773
2774 /* Get the interface for the new image list */
2775 if (hNew)
2776 {
2778 ImageList_Destroy(hNew);
2779 }
2780#else
2781 /* Duplicating the imagelist causes the start menu items not to draw on
2782 * the first show. Was the Duplicate necessary for some reason? I believe
2783 * Windows returns the raw pointer here. */
2784 hNew = (iImageList == SHIL_LARGE ? hLarge : hSmall);
2785 ret = IImageList2_QueryInterface((IImageList2 *) hNew, riid, ppv);
2786#endif
2787
2788 return ret;
2789}
2790
2791#ifndef __REACTOS__
2792
2793/*************************************************************************
2794 * SHCreateShellFolderView [SHELL32.256]
2795 *
2796 * Create a new instance of the default Shell folder view object.
2797 *
2798 * RETURNS
2799 * Success: S_OK
2800 * Failure: error value
2801 *
2802 * NOTES
2803 * see IShellFolder::CreateViewObject
2804 */
2806 IShellView **ppsv)
2807{
2808 IShellView * psf;
2809 HRESULT hRes;
2810
2811 *ppsv = NULL;
2812 if (!pcsfv || pcsfv->cbSize != sizeof(*pcsfv))
2813 return E_INVALIDARG;
2814
2815 TRACE("sf=%p outer=%p callback=%p\n",
2816 pcsfv->pshf, pcsfv->psvOuter, pcsfv->psfvcb);
2817
2818 hRes = IShellView_Constructor(pcsfv->pshf, &psf);
2819 if (FAILED(hRes))
2820 return hRes;
2821
2822 hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppsv);
2823 IShellView_Release(psf);
2824
2825 return hRes;
2826}
2827#endif
2828
2829
2830/*************************************************************************
2831 * SHTestTokenMembership [SHELL32.245]
2832 *
2833 * Checks whether a given token is a mamber of a local group with the
2834 * specified RID.
2835 *
2836 */
2838WINAPI
2840{
2842 DWORD nSubAuthority0, nSubAuthority1;
2843 DWORD nSubAuthorityCount;
2844 PSID SidToCheck;
2845 BOOL IsMember = FALSE;
2846
2847 if ((ulRID == SECURITY_SERVICE_RID) || ulRID == SECURITY_LOCAL_SYSTEM_RID)
2848 {
2849 nSubAuthority0 = ulRID;
2850 nSubAuthority1 = 0;
2851 nSubAuthorityCount= 1;
2852 }
2853 else
2854 {
2855 nSubAuthority0 = SECURITY_BUILTIN_DOMAIN_RID;
2856 nSubAuthority1 = ulRID;
2857 nSubAuthorityCount= 2;
2858 }
2859
2860 if (!AllocateAndInitializeSid(&ntAuth,
2861 nSubAuthorityCount,
2862 nSubAuthority0,
2863 nSubAuthority1,
2864 0, 0, 0, 0, 0, 0,
2865 &SidToCheck))
2866 {
2867 return FALSE;
2868 }
2869
2870 if (!CheckTokenMembership(TokenHandle, SidToCheck, &IsMember))
2871 {
2872 IsMember = FALSE;
2873 }
2874
2875 FreeSid(SidToCheck);
2876 return IsMember;
2877}
2878
2879/*************************************************************************
2880 * IsUserAnAdmin [SHELL32.680] NT 4.0
2881 *
2882 * Checks whether the current user is a member of the Administrators group.
2883 *
2884 * PARAMS
2885 * None
2886 *
2887 * RETURNS
2888 * Success: TRUE
2889 * Failure: FALSE
2890 */
2892{
2894}
2895
2896/*************************************************************************
2897 * SHLimitInputEdit(SHELL32.@)
2898 */
2899
2900/* TODO: Show baloon popup window with TTS_BALLOON */
2901
2902typedef struct UxSubclassInfo
2903{
2909
2910static void
2912{
2913 if (!pInfo)
2914 return;
2915
2916 RemovePropW(pInfo->hwnd, L"UxSubclassInfo");
2917
2920
2922
2923 HeapFree(GetProcessHeap(), 0, pInfo);
2924}
2925
2926static BOOL
2927DoSanitizeText(LPWSTR pszSanitized, LPCWSTR pszInvalidChars, LPCWSTR pszValidChars)
2928{
2929 LPWSTR pch1, pch2;
2930 BOOL bFound = FALSE;
2931
2932 for (pch1 = pch2 = pszSanitized; *pch1; ++pch1)
2933 {
2934 if (pszInvalidChars)
2935 {
2936 if (wcschr(pszInvalidChars, *pch1) != NULL)
2937 {
2938 bFound = TRUE;
2939 continue;
2940 }
2941 }
2942 else if (pszValidChars)
2943 {
2944 if (wcschr(pszValidChars, *pch1) == NULL)
2945 {
2946 bFound = TRUE;
2947 continue;
2948 }
2949 }
2950
2951 *pch2 = *pch1;
2952 ++pch2;
2953 }
2954 *pch2 = 0;
2955
2956 return bFound;
2957}
2958
2959static void
2961{
2962 HGLOBAL hData;
2963 LPWSTR pszText, pszSanitized;
2964 DWORD cbData;
2965
2967 return;
2968 if (!OpenClipboard(hwnd))
2969 return;
2970
2972 pszText = GlobalLock(hData);
2973 if (!pszText)
2974 {
2976 return;
2977 }
2978 SHStrDupW(pszText, &pszSanitized);
2979 GlobalUnlock(hData);
2980
2981 if (pszSanitized &&
2982 DoSanitizeText(pszSanitized, pInfo->pwszInvalidChars, pInfo->pwszValidChars))
2983 {
2984 MessageBeep(0xFFFFFFFF);
2985
2986 /* Update clipboard text */
2987 cbData = (lstrlenW(pszSanitized) + 1) * sizeof(WCHAR);
2989 pszText = GlobalLock(hData);
2990 if (pszText)
2991 {
2992 CopyMemory(pszText, pszSanitized, cbData);
2993 GlobalUnlock(hData);
2994
2996 }
2997 }
2998
2999 CoTaskMemFree(pszSanitized);
3001}
3002
3003static LRESULT CALLBACK
3005{
3006 WNDPROC fnWndProc;
3007 WCHAR wch;
3008 UxSubclassInfo *pInfo = GetPropW(hwnd, L"UxSubclassInfo");
3009 if (!pInfo)
3010 return DefWindowProcW(hwnd, uMsg, wParam, lParam);
3011
3012 fnWndProc = pInfo->fnWndProc;
3013
3014 switch (uMsg)
3015 {
3016 case WM_KEYDOWN:
3017 if (GetKeyState(VK_SHIFT) < 0 && wParam == VK_INSERT)
3018 DoSanitizeClipboard(hwnd, pInfo);
3019 else if (GetKeyState(VK_CONTROL) < 0 && wParam == L'V')
3020 DoSanitizeClipboard(hwnd, pInfo);
3021
3022 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3023
3024 case WM_PASTE:
3025 DoSanitizeClipboard(hwnd, pInfo);
3026 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3027
3028 case WM_CHAR:
3029 if (GetKeyState(VK_CONTROL) < 0 && wParam == L'V')
3030 break;
3031
3032 if (pInfo->pwszInvalidChars)
3033 {
3034 if (wcschr(pInfo->pwszInvalidChars, (WCHAR)wParam) != NULL)
3035 {
3036 MessageBeep(0xFFFFFFFF);
3037 break;
3038 }
3039 }
3040 else if (pInfo->pwszValidChars)
3041 {
3042 if (wcschr(pInfo->pwszValidChars, (WCHAR)wParam) == NULL)
3043 {
3044 MessageBeep(0xFFFFFFFF);
3045 break;
3046 }
3047 }
3048 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3049
3050 case WM_UNICHAR:
3051 if (wParam == UNICODE_NOCHAR)
3052 return TRUE;
3053
3054 /* FALL THROUGH */
3055
3056 case WM_IME_CHAR:
3057 wch = (WCHAR)wParam;
3058 if (GetKeyState(VK_CONTROL) < 0 && wch == L'V')
3059 break;
3060
3061 if (!IsWindowUnicode(hwnd) && HIBYTE(wch) != 0)
3062 {
3063 CHAR data[] = {HIBYTE(wch), LOBYTE(wch)};
3064 MultiByteToWideChar(CP_ACP, 0, data, 2, &wch, 1);
3065 }
3066
3067 if (pInfo->pwszInvalidChars)
3068 {
3069 if (wcschr(pInfo->pwszInvalidChars, wch) != NULL)
3070 {
3071 MessageBeep(0xFFFFFFFF);
3072 break;
3073 }
3074 }
3075 else if (pInfo->pwszValidChars)
3076 {
3077 if (wcschr(pInfo->pwszValidChars, wch) == NULL)
3078 {
3079 MessageBeep(0xFFFFFFFF);
3080 break;
3081 }
3082 }
3083 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3084
3085 case WM_NCDESTROY:
3087 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3088
3089 default:
3090 return CallWindowProcW(fnWndProc, hwnd, uMsg, wParam, lParam);
3091 }
3092
3093 return 0;
3094}
3095
3096static UxSubclassInfo *
3098{
3099 UxSubclassInfo *pInfo;
3101 if (!pInfo)
3102 {
3103 ERR("HeapAlloc failed.\n");
3105 CoTaskMemFree(invalid);
3106 return NULL;
3107 }
3108
3110 if (!pInfo->fnWndProc)
3111 {
3112 ERR("SetWindowLongPtrW failed\n");
3114 CoTaskMemFree(invalid);
3115 HeapFree(GetProcessHeap(), 0, pInfo);
3116 return NULL;
3117 }
3118
3119 pInfo->hwnd = hwnd;
3120 pInfo->pwszValidChars = valid;
3121 pInfo->pwszInvalidChars = invalid;
3122 if (!SetPropW(hwnd, L"UxSubclassInfo", pInfo))
3123 {
3125 pInfo = NULL;
3126 }
3127 return pInfo;
3128}
3129
3132{
3133 IItemNameLimits *pLimits;
3134 HRESULT hr;
3135 LPWSTR pwszValidChars, pwszInvalidChars;
3136 UxSubclassInfo *pInfo;
3137
3138 pInfo = GetPropW(hWnd, L"UxSubclassInfo");
3139 if (pInfo)
3140 {
3142 pInfo = NULL;
3143 }
3144
3145 hr = psf->lpVtbl->QueryInterface(psf, &IID_IItemNameLimits, (LPVOID *)&pLimits);
3146 if (FAILED(hr))
3147 {
3148 ERR("hr: %x\n", hr);
3149 return hr;
3150 }
3151
3152 pwszValidChars = pwszInvalidChars = NULL;
3153 hr = pLimits->lpVtbl->GetValidCharacters(pLimits, &pwszValidChars, &pwszInvalidChars);
3154 if (FAILED(hr))
3155 {
3156 ERR("hr: %x\n", hr);
3157 pLimits->lpVtbl->Release(pLimits);
3158 return hr;
3159 }
3160
3161 pInfo = UxSubclassInfo_Create(hWnd, pwszValidChars, pwszInvalidChars);
3162 if (!pInfo)
3163 hr = E_FAIL;
3164
3165 pLimits->lpVtbl->Release(pLimits);
3166
3167 return hr;
3168}
3169
3170#ifdef __REACTOS__
3171/*************************************************************************
3172 * SHLimitInputCombo [SHELL32.748]
3173 *
3174 * Sets limits on valid characters for a combobox control.
3175 * This function works like SHLimitInputEdit, but the target is a combobox
3176 * instead of a textbox.
3177 */
3180{
3181 HWND hwndEdit;
3182
3183 TRACE("%p %p\n", hWnd, psf);
3184
3186 if (!hwndEdit)
3187 return E_FAIL;
3188
3189 return SHLimitInputEdit(hwndEdit, psf);
3190}
3191#endif
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat)
UINT DriveType
#define shell32_hInstance
#define read
Definition: acwin.h:97
WINBASEAPI _Check_return_ _Out_ AppPolicyProcessTerminationMethod * policy
Definition: appmodel.h:73
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define CF_UNICODETEXT
Definition: constants.h:408
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
HINSTANCE hInstance
Definition: charmap.c:19
Definition: bufpool.h:45
WPARAM wParam
Definition: combotst.c:138
HWND hwndEdit
Definition: combotst.c:65
LPARAM lParam
Definition: combotst.c:139
INT(CALLBACK * MRUCMPPROCW)(LPCWSTR, LPCWSTR)
#define MRU_BINARY
HANDLE WINAPI CreateMRUListW(const MRUINFOW *infoW)
#define MRU_CACHEWRITE
#define OFN_EXPLORER
Definition: commdlg.h:104
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define OFN_FILEMUSTEXIST
Definition: commdlg.h:106
static HWND hwndParent
Definition: cryptui.c:299
static TAGID TAGID find
Definition: db.cpp:156
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
static LPVOID LPUNKNOWN
Definition: dinput.c:53
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR szDescription[]
Definition: provider.c:55
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
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:4009
LONG WINAPI RegCreateKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD Reserved, _In_ LPSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_ LPDWORD lpdwDisposition)
Definition: reg.c:1034
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
BOOL WINAPI CheckTokenMembership(IN HANDLE ExistingTokenHandle, IN PSID SidToCheck, OUT PBOOL IsMember)
Definition: token.c:21
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:674
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:698
UINT uFlags
Definition: api.c:59
void WINAPI DECLSPEC_HOTPATCH CoFreeUnusedLibraries(void)
Definition: combase.c:1936
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT WINAPI HIMAGELIST_QueryInterface(HIMAGELIST himl, REFIID riid, void **ppv)
Definition: imagelist.c:4132
HIMAGELIST WINAPI ImageList_Duplicate(HIMAGELIST himlSrc)
Definition: imagelist.c:1819
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
#define CloseHandle
Definition: compat.h:739
#define wcschr
Definition: compat.h:17
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define lstrcpynA
Definition: compat.h:751
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define GENERIC_READ
Definition: compat.h:135
#define TRACE_ON(x)
Definition: compat.h:75
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define LoadLibraryW(x)
Definition: compat.h:747
#define FILE_SHARE_READ
Definition: compat.h:136
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
static const WCHAR *const ext[]
Definition: module.c:53
DWORD WINAPI ExpandEnvironmentStringsA(IN LPCSTR lpSrc, IN LPSTR lpDst, IN DWORD nSize)
Definition: environ.c:372
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:492
UINT WINAPI SetErrorMode(IN UINT uMode)
Definition: except.c:751
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:636
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:620
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:1999
DWORD WINAPI GetLongPathNameW(IN LPCWSTR lpszShortPath, OUT LPWSTR lpszLongPath, IN DWORD cchBuffer)
Definition: path.c:1456
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:483
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
#define IS_INTRESOURCE(x)
Definition: loader.c:613
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1677
void WINAPI PathStripPathA(char *path)
Definition: path.c:2292
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1250
BOOL WINAPI PathFileExistsW(const WCHAR *path)
Definition: path.c:2583
WCHAR *WINAPI StrCatBuffW(WCHAR *str, const WCHAR *cat, INT max_len)
Definition: string.c:1434
WCHAR *WINAPI StrCpyNXW(WCHAR *dst, const WCHAR *src, int len)
Definition: string.c:1072
INT WINAPI DECLSPEC_HOTPATCH LoadStringA(HINSTANCE instance, UINT resource_id, LPSTR buffer, INT buflen)
Definition: string.c:1307
WCHAR *WINAPI StrCpyNW(WCHAR *dst, const WCHAR *src, int count)
Definition: string.c:470
GUID guid
Definition: version.c:147
static void basename(LPCWSTR path, LPWSTR name)
Definition: profile.c:38
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
HRESULT WINAPI OleFlushClipboard(void)
Definition: clipboard.c:2290
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:162
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
Definition: ole2.c:547
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
Definition: ole2.c:737
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
Definition: ole2.c:629
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
Definition: main.c:2222
DWORD WINAPI SHQueryValueExA(HKEY hkey, const char *name, DWORD *reserved, DWORD *type, void *buff, DWORD *buff_len)
Definition: main.c:2149
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
Definition: main.c:1801
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
DWORD WINAPI SHDeleteKeyW(HKEY hkey, const WCHAR *subkey)
Definition: main.c:1886
#define ShellMessageBoxW
Definition: precomp.h:63
EXTERN_C BOOL WINAPI SHELL32_RunControlPanel(_In_ PCWSTR commandLine, _In_opt_ HWND parent)
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogW(_In_ HWND hwnd, _In_ LPCWSTR pszRemoteName, _In_ DWORD dwType)
Definition: stubs.cpp:457
EXTERN_C INT WINAPI SHLookupIconIndexW(LPCWSTR lpName, INT iIndex, UINT uFlags)
Definition: stubs.cpp:413
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1684
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1575
HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal)
Definition: shellole.c:329
DWORD WINAPI SHCLSIDFromStringW(LPCWSTR clsid, CLSID *id)
Definition: shellole.c:300
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3384
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3219
DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ordinal.c:3616
HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create)
Definition: ordinal.c:4049
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:669
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
r parent
Definition: btrfs.c:3010
#define UlongToPtr(u)
Definition: config.h:106
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
BOOLEAN valid
EXTERN_C BOOL SHELL32_ReadRegShellState(PREGSHELLSTATE prss)
Definition: general.cpp:79
EXTERN_C void SHELL32_GetDefaultShellState(LPSHELLSTATE pss)
Definition: general.cpp:34
EXTERN_C LSTATUS SHELL32_WriteRegShellState(PREGSHELLSTATE prss)
Definition: general.cpp:52
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizei samples
Definition: glext.h:7006
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint GLfloat * val
Definition: glext.h:7180
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
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
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 * u
Definition: glfuncs.h:240
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define ss
Definition: i386-dis.c:441
#define cs
Definition: i386-dis.c:442
BOOL SIC_Initialize(void)
Definition: iconcache.cpp:515
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
Definition: iconcache.cpp:689
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT ReplacePage([in] EXPPS uPageID, [in] LPFNSVADDPROPSHEETPAGE pfnReplaceWith, [in] LPARAM lParam)
HRESULT AddPages([in] LPFNSVADDPROPSHEETPAGE pfnAddPage, [in] LPARAM lParam)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
nsresult QueryInterface(nsIIDRef riid, void **result)
nsrefcnt Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define C_ASSERT(e)
Definition: intsafe.h:73
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
int const JOCTET unsigned int datalen
Definition: jpeglib.h:1033
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
HWND hList
Definition: livecd.c:10
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
#define LMEM_FIXED
Definition: minwinbase.h:81
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
int * LPINT
Definition: minwindef.h:151
CONST void * LPCVOID
Definition: minwindef.h:164
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
static PVOID ptr
Definition: dispmode.c:27
static char szTempPath[MAX_PATH]
Definition: data.c:16
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
HRESULT hres
Definition: protocol.c:465
static HMODULE hmodule
Definition: rasapi.c:29
@ SHKEY_Key_Explorer
Definition: ordinal.c:2807
@ SHKEY_Root_HKCU
Definition: ordinal.c:2805
static const struct metadata_item item1[]
Definition: metadata.c:3603
static const struct metadata_item item2[]
Definition: metadata.c:3608
static BYTE parameters[]
Definition: asn.c:558
const CLSID * clsid
Definition: msctf.cpp:50
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
_In_ HANDLE hFile
Definition: mswsock.h:90
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
unsigned int UINT
Definition: ndis.h:50
_In_ ACCESS_MASK _In_ ULONG _Out_ PHANDLE TokenHandle
Definition: psfuncs.h:727
#define SEM_FAILCRITICALERRORS
Definition: rtltypes.h:69
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
_Out_ LPWSTR lpBuffer
Definition: netsh.h:68
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define REG_BINARY
Definition: nt_native.h:1499
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
#define BOOL
Definition: nt_native.h:43
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
#define GENERIC_WRITE
Definition: nt_native.h:90
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define FILE_ATTRIBUTE_TEMPORARY
Definition: nt_native.h:708
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:331
#define UNICODE_NULL
static HANDLE ULONG_PTR dwData
Definition: pipe.c:111
interface IEnumFORMATETC * LPENUMFORMATETC
Definition: objfwd.h:24
interface IDataObject * LPDATAOBJECT
Definition: objfwd.h:21
const GUID IID_IEnumFORMATETC
const GUID IID_IPersistFile
#define PathAppendA
Definition: pathcch.h:309
#define PathAddBackslashW
Definition: pathcch.h:302
#define PathAppendW
Definition: pathcch.h:310
#define UNALIGNED
Definition: pecoff.h:347
#define LOWORD(l)
Definition: pedump.c:82
#define ES_READONLY
Definition: pedump.c:675
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
Definition: pidl.c:1434
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1108
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:327
#define REFIID
Definition: guiddef.h:118
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
_In_opt_ LPCSTR pszSubKey
Definition: shlwapi.h:783
#define err(...)
#define WM_UNICHAR
Definition: richedit.h:67
const WCHAR * str
#define REG_DWORD
Definition: sdbapi.c:615
wcscat
#define LoadStringW
Definition: utils.h:64
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
static __inline BOOL SHELL_OsIsUnicode(void)
Definition: shell32_main.h:193
#define SHIL_SYSSMALL
Definition: shellapi.h:187
#define SHIL_SMALL
Definition: shellapi.h:185
_In_ LPCSTR pszDir
Definition: shellapi.h:601
#define SHIL_LARGE
Definition: shellapi.h:184
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
_In_ LPCSTR _Out_ BOOL * pfMustCopy
Definition: shellapi.h:603
#define SHGNLI_PIDL
Definition: shellapi.h:416
BOOL WINAPI SignalFileOpen(PCIDLIST_ABSOLUTE pidl)
Definition: shellord.c:829
struct _PSXA_CALL * PPSXA_CALL
HRESULT WINAPI SHLoadOLE(LPARAM lParam)
Definition: shellord.c:1938
static INT CALLBACK SHADD_compare_mru(LPCVOID data1, LPCVOID data2, DWORD cbData)
Definition: shellord.c:892
DWORD WINAPI DoEnvironmentSubstAW(LPVOID x, UINT y)
Definition: shellord.c:2103
static BOOL DoSanitizeText(LPWSTR pszSanitized, LPCWSTR pszInvalidChars, LPCWSTR pszValidChars)
Definition: shellord.c:2927
HRESULT WINAPI SHRegisterDragDrop(HWND hWnd, LPDROPTARGET pDropTarget)
Definition: shellord.c:743
WORD WINAPI ArrangeWindows(HWND hwndParent, DWORD dwReserved, const RECT *lpRect, WORD cKids, const HWND *lpKids)
Definition: shellord.c:813
DWORD WINAPI DoEnvironmentSubstW(LPWSTR pszString, UINT cchString)
Definition: shellord.c:2073
HRESULT WINAPI SHAbortInvokeCommand(void)
Definition: shellord.c:1965
BOOL WINAPI DAD_AutoScroll(HWND hwnd, AUTO_SCROLL_DATA *samples, const POINT *pt)
Definition: shellord.c:1754
void WINAPI SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex)
Definition: shellord.c:2519
void WINAPI SHAddToRecentDocs(UINT uFlags, LPCVOID pv)
Definition: shellord.c:1015
HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType)
Definition: shellord.c:2689
int WINAPI InvalidateDriveType(int u)
Definition: shellord.c:1956
VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask)
Definition: shellord.c:413
BOOL WINAPI RegisterShellHook(HWND hWnd, DWORD dwType)
Definition: shellord.c:514
BOOL WINAPI SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR szObject, LPCWSTR szPage)
Definition: shellord.c:2599
#define MRUF_BINARY_LIST
Definition: shellord.c:66
void WINAPI SHFreeUnusedLibraries(void)
Definition: shellord.c:1745
static BOOL CALLBACK PsxaCall(HPROPSHEETPAGE hpage, LPARAM lParam)
Definition: shellord.c:2215
struct _PSXA PSXA
BOOL WINAPI DAD_DragEnter(HWND hwnd)
Definition: shellord.c:1763
#define MRUF_DELAYED_SAVE
Definition: shellord.c:67
INT WINAPI SHHandleUpdateImage(PCIDLIST_ABSOLUTE pidlExtra)
Definition: shellord.c:2577
void WINAPI SHDestroyPropSheetExtArray(HPSXA hpsxa)
Definition: shellord.c:2413
HRESULT WINAPI SHCreateStdEnumFmtEtc(UINT cFormats, const FORMATETC *lpFormats, LPENUMFORMATETC *ppenumFormatetc)
Definition: shellord.c:2462
EXTERN_C BOOL WINAPI SHTestTokenMembership(HANDLE TokenHandle, ULONG ulRID)
Definition: shellord.c:2839
BOOL WINAPI DAD_SetDragImage(HIMAGELIST himlTrack, LPPOINT lppt)
Definition: shellord.c:1801
INT WINAPI FindMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum)
struct _PSXA * PPSXA
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
Definition: shellord.c:2757
static void DoSanitizeClipboard(HWND hwnd, UxSubclassInfo *pInfo)
Definition: shellord.c:2960
HANDLE WINAPI CreateMRUListA(LPCREATEMRULISTA lpcml)
DWORD WINAPI ParseFieldAW(LPCVOID src, DWORD nField, LPVOID dst, DWORD len)
Definition: shellord.c:143
void WINAPI SHFlushSFCache(void)
Definition: shellord.c:2743
BOOL WINAPI LinkWindow_RegisterClass(void)
Definition: shellord.c:2718
BOOL WINAPI GUIDFromStringA(LPCSTR str, LPGUID guid)
Definition: shellord.c:2113
BOOL WINAPI PathIsTemporaryW(LPWSTR Str)
Definition: shellord.c:2167
struct tagCREATEMRULIST * LPCREATEMRULISTA
BOOL WINAPI GUIDFromStringW(LPCWSTR str, LPGUID guid)
Definition: shellord.c:2128
BOOL WINAPI LinkWindow_UnregisterClass(DWORD dwUnused)
Definition: shellord.c:2727
VOID WINAPI SHUpdateImageA(LPCSTR pszHashItem, INT iIndex, UINT uFlags, INT iImageIndex)
Definition: shellord.c:2559
HRESULT WINAPI SHWinHelp(HWND hwnd, LPCWSTR pszHelp, UINT uCommand, ULONG_PTR dwData)
Definition: shellord.c:1649
HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, LPDATAOBJECT pDataObj)
Definition: shellord.c:2274
DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len)
Definition: shellord.c:117
static LRESULT CALLBACK LimitEditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: shellord.c:3004
BOOL WINAPI ReadCabinetState(CABINETSTATE *cs, int length)
Definition: shellord.c:1824
BOOL WINAPI FileIconInit(BOOL bFullInit)
Definition: shellord.c:1906
int ShellMessageBoxA(HINSTANCE hInstance, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,...)
Definition: shellord.c:630
BOOL WINAPI DAD_ShowDragImage(BOOL bShow)
Definition: shellord.c:1814
BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p)
Definition: shellord.c:1772
DWORD WINAPI RLBuildListOfPaths(void)
Definition: shellord.c:2009
VOID WINAPI FreeMRUList(HANDLE hMRUList)
BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags)
Definition: shellord.c:2641
static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPCSTR doc_name, LPCSTR new_lnk_name, LPSTR buffer, INT *len)
Definition: shellord.c:960
DWORD WINAPI DoEnvironmentSubstA(LPSTR pszString, UINT cchString)
Definition: shellord.c:2028
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
static INT SHADD_get_policy(LPCSTR policy, LPDWORD type, LPVOID buffer, LPDWORD len)
Definition: shellord.c:851
HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v)
Definition: shellord.c:1914
HRESULT WINAPI SHRevokeDragDrop(HWND hWnd)
Definition: shellord.c:778
BOOL WINAPI SHRunControlPanel(_In_ LPCWSTR commandLine, _In_opt_ HWND parent)
Definition: shellord.c:1689
HRESULT WINAPI SHLimitInputEdit(HWND hWnd, IShellFolder *psf)
Definition: shellord.c:3131
struct _PSXA_CALL PSXA_CALL
BOOL WINAPI SHValidateUNC(HWND hwndOwner, PWSTR pszFile, UINT fConnect)
Definition: shellord.c:2017
BOOL WINAPI SHWaitForFileToOpen(LPCITEMIDLIST pidl, DWORD dwFlags, DWORD dwTimeout)
Definition: shellord.c:1994
HRESULT WINAPI SHGetInstanceExplorer(IUnknown **lpUnknown)
Definition: shellord.c:1721
static UxSubclassInfo * UxSubclassInfo_Create(HWND hwnd, LPWSTR valid, LPWSTR invalid)
Definition: shellord.c:3097
INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize)
UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam)
Definition: shellord.c:2382
BOOL WINAPI SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags)
Definition: shellord.c:2622
BOOL WINAPI DAD_DragMove(POINT p)
Definition: shellord.c:1781
struct tagCREATEMRULIST CREATEMRULISTA
HRESULT WINAPI SHSetLocalizedName(LPCWSTR pszPath, LPCWSTR pszResModule, int idsRes)
Definition: shellord.c:2706
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: shellord.c:2805
VOID WINAPI SHSetInstanceExplorer(LPUNKNOWN lpUnknown)
Definition: shellord.c:1711
HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV psvcbi, IShellView **ppv)
Definition: shellord.c:1621
BOOL WINAPI SHFindFiles(PCIDLIST_ABSOLUTE pidlFolder, PCIDLIST_ABSOLUTE pidlSaveFile)
Definition: shellord.c:2485
LRESULT WINAPI SHShellFolderView_Message(HWND hwndCabinet, UINT uMessage, LPARAM lParam)
Definition: shellord.c:493
static void UxSubclassInfo_Destroy(UxSubclassInfo *pInfo)
Definition: shellord.c:2911
BOOL WINAPI GetFileNameFromBrowse(HWND hwndOwner, LPWSTR lpstrFile, UINT nMaxFile, LPCWSTR lpstrInitialDir, LPCWSTR lpstrDefExt, LPCWSTR lpstrFilter, LPCWSTR lpstrTitle)
Definition: shellord.c:154
HRESULT WINAPI CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder, UINT cpidlFiles, PCUIDLIST_RELATIVE_ARRAY lppidlFiles, LPDATAOBJECT *ppdataObject)
Definition: shellord.c:2436
UINT WINAPI SHAddFromPropSheetExtArray(HPSXA hpsxa, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
Definition: shellord.c:2236
int WINAPI SHOutOfMemoryMessageBox(HWND hwndOwner, LPCSTR lpCaption, UINT uType)
Definition: shellord.c:1973
static LPUNKNOWN SHELL32_IExplorerInterface
Definition: shellord.c:1704
INT WINAPI AddMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData)
BOOL WINAPI PathIsTemporaryA(LPSTR Str)
Definition: shellord.c:2144
HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface)
Definition: shellord.c:2266
BOOL WINAPI WriteCabinetState(CABINETSTATE *cs)
Definition: shellord.c:1876
HRESULT WINAPI SHDoDragDrop(HWND hWnd, LPDATAOBJECT lpDataObject, LPDROPSOURCE lpDropSource, DWORD dwOKEffect, LPDWORD pdwEffect)
Definition: shellord.c:797
DWORD WINAPI ParseFieldA(LPCSTR src, DWORD nField, LPSTR dst, DWORD len)
Definition: shellord.c:83
HRESULT WINAPI SHFlushClipboard(void)
Definition: shellord.c:1985
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2778
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
static IMalloc * ppM
Definition: shlfolder.c:47
#define CSIDL_INTERNET_CACHE
Definition: shlobj.h:2212
#define SSF_FILTER
Definition: shlobj.h:1626
#define CSIDL_RECENT
Definition: shlobj.h:2189
#define SSF_DONTPRETTYPATH
Definition: shlobj.h:1621
#define SSF_SORTCOLUMNS
Definition: shlobj.h:1615
#define CSIDL_CDBURN_AREA
Definition: shlobj.h:2236
struct SHELLFLAGSTATE * LPSHELLFLAGSTATE
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1912
#define SSF_WIN95CLASSIC
Definition: shlobj.h:1620
#define SSF_SHOWATTRIBCOL
Definition: shlobj.h:1618
#define SSF_SHOWSYSFILES
Definition: shlobj.h:1616
BOOL WINAPI IsUserAnAdmin(void)
Definition: shellord.c:2891
#define SHARD_PATHW
Definition: shlobj.h:1183
#define SHARD_PIDL
Definition: shlobj.h:1181
#define SSF_MAPNETDRVBUTTON
Definition: shlobj.h:1622
#define SSF_SHOWEXTENSIONS
Definition: shlobj.h:1613
#define SSF_SHOWSUPERHIDDEN
Definition: shlobj.h:1628
#define SSF_SHOWALLOBJECTS
Definition: shlobj.h:1612
#define SHARD_PATHA
Definition: shlobj.h:1182
@ REST_NORECENTDOCSHISTORY
Definition: shlobj.h:1681
@ REST_NOFIND
Definition: shlobj.h:1657
BOOL WINAPI DAD_DragLeave(void)
Definition: shellord.c:1790
#define SSF_SHOWINFOTIP
Definition: shlobj.h:1623
#define SHCNF_IDLIST
Definition: shlobj.h:1929
#define SSF_HIDEICONS
Definition: shlobj.h:1624
#define SHELL_GlobalCounterIncrement(handle)
Definition: shlwapi_undoc.h:50
#define SHELL_GlobalCounterIsInitialized(handle)
Definition: shlwapi_undoc.h:48
#define SHELL_GCOUNTER_DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k)
Definition: shlwapi_undoc.h:40
#define SHELL_GCOUNTER_PARAMETERS(handle, id)
Definition: shlwapi_undoc.h:42
#define SHELL_GCOUNTER_DECLAREPARAMETERS(handle, id)
Definition: shlwapi_undoc.h:52
#define SHELL_GlobalCounterGet(handle)
Definition: shlwapi_undoc.h:49
#define SHELL_GCOUNTER_DEFINE_HANDLE(name)
Definition: shlwapi_undoc.h:41
#define SHELL_GlobalCounterCreate(refguid, handle)
Definition: shlwapi_undoc.h:43
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUIDLIST_RELATIVE * PCUIDLIST_RELATIVE_ARRAY
Definition: shtypes.idl:58
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
OPENFILENAME ofn
Definition: sndrec32.cpp:56
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
SHELLSTATE ss
Definition: ShellState.cpp:22
BOOL fMapNetDrvBtn
Definition: shlobj.h:1601
BOOL fShowInfoTip
Definition: shlobj.h:1602
BOOL fHideIcons
Definition: shlobj.h:1603
BOOL fIconsOnly
Definition: shlobj.h:1605
BOOL fShowExtensions
Definition: shlobj.h:1592
BOOL fAutoCheckSelect
Definition: shlobj.h:1604
BOOL fShowSysFiles
Definition: shlobj.h:1594
BOOL fDontPrettyPath
Definition: shlobj.h:1599
BOOL fShowAllObjects
Definition: shlobj.h:1591
BOOL fShowAttribCol
Definition: shlobj.h:1600
BOOL fShowSysFiles
Definition: shlobj.h:1552
BOOL fWin95Classic
Definition: shlobj.h:1556
BOOL fShowSuperHidden
Definition: shlobj.h:1564
BOOL fShowAllObjects
Definition: shlobj.h:1548
LPWSTR pwszValidChars
Definition: shellord.c:2906
LPWSTR pwszInvalidChars
Definition: shellord.c:2907
WNDPROC fnWndProc
Definition: shellord.c:2905
Definition: shlobj.h:1282
FOLDERVIEWMODE fvm
Definition: shlobj.h:1289
IShellView * psvOuter
Definition: shlobj.h:1285
LPFNVIEWCALLBACK pfnCallback
Definition: shlobj.h:1288
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1286
IShellFolder * pshf
Definition: shlobj.h:1284
LPFNADDPROPSHEETPAGE lpfnAddReplaceWith
Definition: shellord.c:2208
LPARAM lParam
Definition: shellord.c:2209
BOOL bCalled
Definition: shellord.c:2210
BOOL bMultiple
Definition: shellord.c:2211
UINT uiCount
Definition: shellord.c:2212
UINT uiCount
Definition: shellord.c:2201
IShellPropSheetExt * pspsx[1]
Definition: shellord.c:2203
UINT uiAllocated
Definition: shellord.c:2202
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1367
IShellView * psvOuter
Definition: shlobj.h:1366
UINT cbSize
Definition: shlobj.h:1364
IShellFolder * pshf
Definition: shlobj.h:1365
Definition: match.c:390
Definition: cookie.c:202
Definition: tftpd.h:126
Definition: tftpd.h:138
LPCSTR lpszSubKey
Definition: shellord.c:60
DWORD nMaxItems
Definition: shellord.c:57
LPWSTR lpszSubKey
LPCSTR lpstrDefExt
Definition: commdlg.h:345
HWND hwndOwner
Definition: commdlg.h:330
LPCSTR lpstrTitle
Definition: commdlg.h:341
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
LPCSTR lpstrInitialDir
Definition: commdlg.h:340
DWORD lStructSize
Definition: commdlg.h:329
LPCSTR lpstrFilter
Definition: commdlg.h:332
DWORD nMaxFile
Definition: commdlg.h:337
#define GWLP_WNDPROC
Definition: treelist.c:66
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
HANDLE HINSTANCE
Definition: typedefs.h:77
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t * LPDWORD
Definition: typedefs.h:59
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define MAXLONG
Definition: umtypes.h:116
HRESULT WINAPI SHLimitInputCombo(HWND hWnd, IShellFolder *psf)
HWND WINAPI SetTaskmanWindow(HWND)
Definition: window.c:1878
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
#define SHOP_FILEPATH
Definition: vfdshmenu.cpp:36
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:398
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1155
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
#define FindNextFile
Definition: winbase.h:3509
#define GMEM_MOVEABLE
Definition: winbase.h:318
#define GMEM_SHARE
Definition: winbase.h:329
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define __ms_va_list
Definition: windef.h:250
#define __ms_va_end(list)
Definition: windef.h:252
#define __ms_va_start(list, arg)
Definition: windef.h:251
#define WINAPI
Definition: msvc.h:6
#define strlenW(s)
Definition: unicode.h:28
#define strrchrW(s, c)
Definition: unicode.h:35
#define snprintfW
Definition: unicode.h:60
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:781
BOOL WINAPI DeregisterShellHookWindow(_In_ HWND)
#define MB_SETFOREGROUND
Definition: winuser.h:825
#define GetWindowLongPtrW
Definition: winuser.h:4983
#define WM_PASTE
Definition: winuser.h:1891
HANDLE WINAPI RemovePropW(_In_ HWND, _In_ LPCWSTR)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI RegisterShellHookWindow(_In_ HWND)
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
HANDLE WINAPI SetClipboardData(_In_ UINT, _In_opt_ HANDLE)
HWND WINAPI GetTopWindow(_In_opt_ HWND)
BOOL WINAPI CloseClipboard(void)
Definition: ntwrapper.h:178
BOOL WINAPI WinHelpW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_ UINT, _In_ ULONG_PTR)
#define VK_CONTROL
Definition: winuser.h:2239
BOOL WINAPI OpenClipboard(_In_opt_ HWND)
BOOL WINAPI MessageBeep(_In_ UINT uType)
HANDLE WINAPI GetClipboardData(_In_ UINT)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
BOOL WINAPI IsWindowUnicode(_In_ HWND)
#define WM_IME_CHAR
Definition: winuser.h:1862
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
#define WM_CHAR
Definition: winuser.h:1745
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
#define WM_NCDESTROY
Definition: winuser.h:1712
#define MB_ICONSTOP
Definition: winuser.h:814
#define VK_SHIFT
Definition: winuser.h:2238
#define WM_KEYDOWN
Definition: winuser.h:1743
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:3014
#define SetWindowLongPtrW
Definition: winuser.h:5512
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define GWL_STYLE
Definition: winuser.h:863
#define VK_INSERT
Definition: winuser.h:2268
SHORT WINAPI GetKeyState(_In_ int)
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
#define SECURITY_SERVICE_RID
Definition: setypes.h:562
#define SECURITY_LOCAL_SYSTEM_RID
Definition: setypes.h:574
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652
unsigned char BYTE
Definition: xxhash.c:193