ReactOS 0.4.15-dev-7968-g24a56f8
CFSFolder.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: shell32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: file system folder
5 * COPYRIGHT: Copyright 1997 Marcus Meissner
6 * Copyright 1998, 1999, 2002 Juergen Schmied
7 * Copyright 2019-2024 Katayama Hirofumi MZ
8 * Copyright 2020 Mark Jansen (mark.jansen@reactos.org)
9 */
10
11#include <precomp.h>
12
14
15static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID* pclsidFolder);
16
17
19{
20 HKEY hkey;
21
23 DWORD dwSize = sizeof(FullName);
24 wsprintf(FullName, L"%s\\%s", pExtension, KeyName);
25
27 if (!res)
28 return hkey;
29
31 if (res)
32 {
33 WARN("Failed to get progid for extension %S (%x), error %d\n", pExtension, pExtension, res);
34 return NULL;
35 }
36
37 wcscat(FullName, L"\\");
39
40 hkey = NULL;
42 if (res)
43 WARN("Could not open key %S for extension %S\n", KeyName, pExtension);
44
45 return hkey;
46}
47
49{
50 if (!_ILIsValue(pidl))
51 {
52 ERR("Invalid pidl!\n");
53 return NULL;
54 }
55
56 FileStructW* pDataW = _ILGetFileStructW(pidl);
57 if (!pDataW)
58 {
59 ERR("Invalid pidl!\n");
60 return NULL;
61 }
62
63 LPWSTR pExtension = PathFindExtensionW(pDataW->wszName);
64 if (!pExtension || *pExtension == UNICODE_NULL)
65 {
66 WARN("No extension for %S!\n", pDataW->wszName);
67 return NULL;
68 }
69 return pExtension;
70}
71
73{
74 HKEY hkeyProgId = OpenKeyFromFileType(pExtension, KeyName);
75 if (!hkeyProgId)
76 {
77 WARN("OpenKeyFromFileType failed for key %S\n", KeyName);
78 return S_FALSE;
79 }
80
81 WCHAR wszCLSIDValue[CHARS_IN_GUID];
82 DWORD dwSize = sizeof(wszCLSIDValue);
83 LONG res = RegGetValueW(hkeyProgId, NULL, NULL, RRF_RT_REG_SZ, NULL, wszCLSIDValue, &dwSize);
84 RegCloseKey(hkeyProgId);
85 if (res)
86 {
87 ERR("OpenKeyFromFileType succeeded but RegGetValueW failed\n");
88 return S_FALSE;
89 }
90
91#if 0
92 {
94 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
95 wszCLSIDValue,
97 NULL,
98 NULL,
99 NULL);
100 if (res != ERROR_SUCCESS)
101 {
102 ERR("DropHandler extension %S not approved\n", wszName);
103 return E_ACCESSDENIED;
104 }
105 }
106#endif
107
109 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Blocked",
110 wszCLSIDValue,
112 NULL,
113 NULL,
115 {
116 ERR("Extension %S not approved\n", wszCLSIDValue);
117 return E_ACCESSDENIED;
118 }
119
120 HRESULT hres = CLSIDFromString (wszCLSIDValue, pclsid);
122 return hres;
123
124 return S_OK;
125}
126
128{
129 LPWSTR pExtension = ExtensionFromPidl(pidl);
130 if (!pExtension)
131 return S_FALSE;
132
133 return GetCLSIDForFileTypeFromExtension(pExtension, KeyName, pclsid);
134}
135
136static HRESULT
138{
139 if (!HLM_GetIconW(IDI_SHELL_FOLDER - 1, szIconFile, cchMax, piIndex))
140 {
141 if (!HCR_GetIconW(L"Folder", szIconFile, NULL, cchMax, piIndex))
142 {
143 StringCchCopyW(szIconFile, cchMax, swShell32Name);
144 *piIndex = -IDI_SHELL_FOLDER;
145 }
146 }
147
148 if (uFlags & GIL_OPENICON)
149 {
150 // next icon
151 if (*piIndex < 0)
152 (*piIndex)--;
153 else
154 (*piIndex)++;
155 }
156
157 return S_OK;
158}
159
160static BOOL
161getShellClassInfo(LPCWSTR Entry, LPWSTR pszValue, DWORD cchValueLen, LPCWSTR IniFile)
162{
163 return GetPrivateProfileStringW(L".ShellClassInfo", Entry, NULL, pszValue, cchValueLen, IniFile);
164}
165
166static HRESULT
168 LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
169{
170 DWORD dwFileAttrs;
171 WCHAR wszPath[MAX_PATH];
172 WCHAR wszIniFullPath[MAX_PATH];
173
174 if (uFlags & GIL_DEFAULTICON)
175 goto Quit;
176
177 // get path
178 if (!ILGetDisplayNameExW(psf, pidl, wszPath, 0))
179 goto Quit;
180 if (!PathIsDirectoryW(wszPath))
181 goto Quit;
182
183 // read-only or system folder?
184 dwFileAttrs = _ILGetFileAttributes(ILFindLastID(pidl), NULL, 0);
185 if ((dwFileAttrs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) == 0)
186 goto Quit;
187
188 // build the full path of ini file
189 StringCchCopyW(wszIniFullPath, _countof(wszIniFullPath), wszPath);
190 PathAppendW(wszIniFullPath, L"desktop.ini");
191
192 WCHAR wszValue[MAX_PATH], wszTemp[MAX_PATH];
193 if (getShellClassInfo(L"IconFile", wszValue, _countof(wszValue), wszIniFullPath))
194 {
195 // wszValue --> wszTemp
196 ExpandEnvironmentStringsW(wszValue, wszTemp, _countof(wszTemp));
197
198 // wszPath + wszTemp --> wszPath
199 if (PathIsRelativeW(wszTemp))
200 PathAppendW(wszPath, wszTemp);
201 else
202 StringCchCopyW(wszPath, _countof(wszPath), wszTemp);
203
204 // wszPath --> szIconFile
205 GetFullPathNameW(wszPath, cchMax, szIconFile, NULL);
206
207 *piIndex = GetPrivateProfileIntW(L".ShellClassInfo", L"IconIndex", 0, wszIniFullPath);
208 return S_OK;
209 }
210 else if (getShellClassInfo(L"CLSID", wszValue, _countof(wszValue), wszIniFullPath) &&
211 HCR_GetIconW(wszValue, szIconFile, NULL, cchMax, piIndex))
212 {
213 return S_OK;
214 }
215 else if (getShellClassInfo(L"CLSID2", wszValue, _countof(wszValue), wszIniFullPath) &&
216 HCR_GetIconW(wszValue, szIconFile, NULL, cchMax, piIndex))
217 {
218 return S_OK;
219 }
220 else if (getShellClassInfo(L"IconResource", wszValue, _countof(wszValue), wszIniFullPath))
221 {
222 // wszValue --> wszTemp
223 ExpandEnvironmentStringsW(wszValue, wszTemp, _countof(wszTemp));
224
225 // parse the icon location
226 *piIndex = PathParseIconLocationW(wszTemp);
227
228 // wszPath + wszTemp --> wszPath
229 if (PathIsRelativeW(wszTemp))
230 PathAppendW(wszPath, wszTemp);
231 else
232 StringCchCopyW(wszPath, _countof(wszPath), wszTemp);
233
234 // wszPath --> szIconFile
235 GetFullPathNameW(wszPath, cchMax, szIconFile, NULL);
236 return S_OK;
237 }
238
239Quit:
240 return getDefaultIconLocation(szIconFile, cchMax, piIndex, uFlags);
241}
242
244{
245 CComPtr<IDefaultExtractIconInit> initIcon;
246 HRESULT hr;
247 int icon_idx = 0;
248 UINT flags = 0; // FIXME: Use it!
249 WCHAR wTemp[MAX_PATH] = L"";
250
252 if (FAILED(hr))
253 return hr;
254
255 if (_ILIsFolder (pidl))
256 {
258 pidl, 0, wTemp, _countof(wTemp),
259 &icon_idx,
260 &flags)))
261 {
262 initIcon->SetNormalIcon(wTemp, icon_idx);
263 // FIXME: if/when getIconLocationForFolder does something for
264 // GIL_FORSHORTCUT, code below should be uncommented. and
265 // the following line removed.
266 initIcon->SetShortcutIcon(wTemp, icon_idx);
267 }
269 pidl, GIL_DEFAULTICON, wTemp, _countof(wTemp),
270 &icon_idx,
271 &flags)))
272 {
273 initIcon->SetDefaultIcon(wTemp, icon_idx);
274 }
275 // if (SUCCEEDED(getIconLocationForFolder(psf,
276 // pidl, GIL_FORSHORTCUT, wTemp, _countof(wTemp),
277 // &icon_idx,
278 // &flags)))
279 // {
280 // initIcon->SetShortcutIcon(wTemp, icon_idx);
281 // }
283 pidl, GIL_OPENICON, wTemp, _countof(wTemp),
284 &icon_idx,
285 &flags)))
286 {
287 initIcon->SetOpenIcon(wTemp, icon_idx);
288 }
289 }
290 else
291 {
292 LPWSTR pExtension = ExtensionFromPidl(pidl);
293 HKEY hkey = pExtension ? OpenKeyFromFileType(pExtension, L"DefaultIcon") : NULL;
294 if (!hkey)
295 WARN("Could not open DefaultIcon key!\n");
296
297 DWORD dwSize = sizeof(wTemp);
298 if (hkey && !SHQueryValueExW(hkey, NULL, NULL, NULL, wTemp, &dwSize))
299 {
300 WCHAR sNum[5];
301 if (ParseFieldW (wTemp, 2, sNum, 5))
302 icon_idx = _wtoi(sNum);
303 else
304 icon_idx = 0; /* sometimes the icon number is missing */
305 ParseFieldW (wTemp, 1, wTemp, MAX_PATH);
306 PathUnquoteSpacesW(wTemp);
307
308 if (!wcscmp(L"%1", wTemp)) /* icon is in the file */
309 {
310 ILGetDisplayNameExW(psf, pidl, wTemp, ILGDN_FORPARSING);
311 icon_idx = 0;
312
313 INT ret = PrivateExtractIconsW(wTemp, 0, 0, 0, NULL, NULL, 0, 0);
314 if (ret <= 0)
315 {
316 StringCbCopyW(wTemp, sizeof(wTemp), swShell32Name);
317 if (lstrcmpiW(pExtension, L".exe") == 0 || lstrcmpiW(pExtension, L".scr") == 0)
318 icon_idx = -IDI_SHELL_EXE;
319 else
320 icon_idx = -IDI_SHELL_DOCUMENT;
321 }
322 }
323
324 initIcon->SetNormalIcon(wTemp, icon_idx);
325 }
326 else
327 {
328 initIcon->SetNormalIcon(swShell32Name, 0);
329 }
330
331 if (hkey)
332 RegCloseKey(hkey);
333 }
334
335 return initIcon->QueryInterface(iid, ppvOut);
336}
337
338/*
339CFileSysEnum should do an initial FindFirstFile and do a FindNextFile as each file is
340returned by Next. When the enumerator is created, it can do numerous additional operations
341including formatting a drive, reconnecting a network share drive, and requesting a disk
342be inserted in a removable drive.
343*/
344
345
347 public CEnumIDListBase
348{
349private:
351 {
352#define SUPER_HIDDEN (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)
353
354 // Does it need special handling because it is hidden?
355 if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
356 {
357 DWORD dwHidden = FindData.dwFileAttributes & SUPER_HIDDEN;
358
359 // Is it hidden, but are we not asked to include hidden?
360 if (dwHidden == FILE_ATTRIBUTE_HIDDEN && !(dwFlags & SHCONTF_INCLUDEHIDDEN))
361 return S_OK;
362
363 // Is it a system file, but are we not asked to include those?
364 if (dwHidden == SUPER_HIDDEN && !(dwFlags & SHCONTF_INCLUDESUPERHIDDEN))
365 return S_OK;
366 }
367
368 BOOL bDirectory = (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
369
370 HRESULT hr;
371 if (bDirectory)
372 {
373 // Skip the current and parent directory nodes
374 if (!strcmpW(FindData.cFileName, L".") || !strcmpW(FindData.cFileName, L".."))
375 return S_OK;
376
377 // Does this directory need special handling?
378 if ((FindData.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
379 {
380 WCHAR Tmp[MAX_PATH];
381 CLSID clsidFolder;
382
383 PathCombineW(Tmp, sParentDir, FindData.cFileName);
384
385 hr = SHELL32_GetCLSIDForDirectory(Tmp, L"CLSID", &clsidFolder);
386 if (SUCCEEDED(hr))
387 {
388 ERR("Got CLSID override for '%S'\n", Tmp);
389 }
390 }
391 }
392 else
393 {
394 CLSID clsidFile;
395 LPWSTR pExtension = PathFindExtensionW(FindData.cFileName);
396 if (pExtension)
397 {
398 // FIXME: Cache this?
399 hr = GetCLSIDForFileTypeFromExtension(pExtension, L"CLSID", &clsidFile);
400 if (hr == S_OK)
401 {
402 HKEY hkey;
403 hr = SHRegGetCLSIDKeyW(clsidFile, L"ShellFolder", FALSE, FALSE, &hkey);
404 if (SUCCEEDED(hr))
405 {
406 ::RegCloseKey(hkey);
407
408 // This should be presented as directory!
409 bDirectory = TRUE;
410 TRACE("Treating '%S' as directory!\n", FindData.cFileName);
411 }
412 }
413 }
414 }
415
416 LPITEMIDLIST pidl = NULL;
417 if (bDirectory)
418 {
419 if (dwFlags & SHCONTF_FOLDERS)
420 {
421 TRACE("(%p)-> (folder=%s)\n", this, debugstr_w(FindData.cFileName));
422 pidl = _ILCreateFromFindDataW(&FindData);
423 }
424 }
425 else
426 {
427 if (dwFlags & SHCONTF_NONFOLDERS)
428 {
429 TRACE("(%p)-> (file =%s)\n", this, debugstr_w(FindData.cFileName));
430 pidl = _ILCreateFromFindDataW(&FindData);
431 }
432 }
433
434 if (pidl && !AddToEnumList(pidl))
435 {
437 return E_FAIL;
438 }
439
440 return S_OK;
441 }
442
443public:
445 {
446
447 }
448
450 {
451 }
452
454 {
455 TRACE("(%p)->(path=%s flags=0x%08x)\n", this, debugstr_w(sPathTarget), dwFlags);
456
457 if (!sPathTarget || !sPathTarget[0])
458 {
459 WARN("No path for CFileSysEnum, empty result!\n");
460 return S_FALSE;
461 }
462
463 WCHAR szFindPattern[MAX_PATH];
464 HRESULT hr = StringCchCopyW(szFindPattern, _countof(szFindPattern), sPathTarget);
466 return hr;
467
468 /* FIXME: UNSAFE CRAP */
469 PathAddBackslashW(szFindPattern);
470
471 hr = StringCchCatW(szFindPattern, _countof(szFindPattern), L"*.*");
473 return hr;
474
475
476 WIN32_FIND_DATAW FindData;
477 HANDLE hFind = FindFirstFileW(szFindPattern, &FindData);
478 if (hFind == INVALID_HANDLE_VALUE)
480
481 do
482 {
483 hr = _AddFindResult(sPathTarget, FindData, dwFlags);
484
486 break;
487
488 } while(FindNextFileW(hFind, &FindData));
489
490 if (SUCCEEDED(hr))
491 {
492 DWORD dwError = GetLastError();
493 if (dwError != ERROR_NO_MORE_FILES)
494 {
495 hr = HRESULT_FROM_WIN32(dwError);
497 }
498 }
499 TRACE("(%p)->(hr=0x%08x)\n", this, hr);
500 FindClose(hFind);
501 return hr;
502 }
503
505 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
507};
508
509
510/***********************************************************************
511 * IShellFolder implementation
512 */
513
515{
516 m_pclsid = &CLSID_ShellFSFolder;
520}
521
523{
524 TRACE("-- destroying IShellFolder(%p)\n", this);
525
528}
529
530static const shvheader GenericSFHeader[] = {
536 {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_SLOW, LVCFMT_LEFT, 10}, // We don't currently support comments but CRegFolder does
537};
538
539#define GENERICSHELLVIEWCOLUMNS _countof(GenericSFHeader)
540
542{
543 if (iColumn >= _countof(GenericSFHeader))
544 return E_INVALIDARG;
545
546 sd.fmt = GenericSFHeader[iColumn].fmt;
547 sd.cxChar = GenericSFHeader[iColumn].cxChar;
548 return SHSetStrRet(&sd.str, GenericSFHeader[iColumn].colnameid);
549}
550
552{
553 if (iColumn >= _countof(GenericSFHeader))
554 return E_INVALIDARG;
555
556 csFlags = GenericSFHeader[iColumn].colstate;
557 return S_OK;
558}
559
561{
562 WCHAR wszCLSIDValue[CHARS_IN_GUID];
563 WCHAR wszDesktopIni[MAX_PATH];
564
565 StringCchCopyW(wszDesktopIni, MAX_PATH, pwszDir);
566 StringCchCatW(wszDesktopIni, MAX_PATH, L"\\desktop.ini");
567
568 if (GetPrivateProfileStringW(L".ShellClassInfo",
569 KeyName,
570 L"",
571 wszCLSIDValue,
573 wszDesktopIni))
574 {
575 return CLSIDFromString(wszCLSIDValue, pclsidFolder);
576 }
577 return E_FAIL;
578}
579
581{
582 DWORD dwFileAttributes, dwShellAttributes;
583
584 if (!_ILIsFolder(pidl) && !_ILIsValue(pidl))
585 {
586 ERR("Got wrong type of pidl!\n");
587 *pdwAttributes &= SFGAO_CANLINK;
588 return S_OK;
589 }
590
592
593 /* Set common attributes */
594 dwShellAttributes = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK | SFGAO_CANRENAME | SFGAO_CANDELETE |
595 SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_FILESYSTEM;
596
597 BOOL bDirectory = (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
598
599 if (!bDirectory)
600 {
601 // https://git.reactos.org/?p=reactos.git;a=blob;f=dll/shellext/zipfldr/res/zipfldr.rgs;hb=032b5aacd233cd7b83ab6282aad638c161fdc400#l9
602 WCHAR szFileName[MAX_PATH];
603 LPWSTR pExtension;
604
605 if (_ILSimpleGetTextW(pidl, szFileName, _countof(szFileName)) && (pExtension = PathFindExtensionW(szFileName)))
606 {
607 CLSID clsidFile;
608 // FIXME: Cache this?
609 HRESULT hr = GetCLSIDForFileTypeFromExtension(pExtension, L"CLSID", &clsidFile);
610 if (hr == S_OK)
611 {
612 HKEY hkey;
613 hr = SHRegGetCLSIDKeyW(clsidFile, L"ShellFolder", FALSE, FALSE, &hkey);
614 if (SUCCEEDED(hr))
615 {
617 DWORD dwSize = sizeof(dwAttributes);
619
621 if (Status == STATUS_SUCCESS)
622 {
623 TRACE("Augmenting '%S' with dwAttributes=0x%x\n", szFileName, dwAttributes);
624 dwShellAttributes |= dwAttributes;
625 }
626 ::RegCloseKey(hkey);
627
628 // This should be presented as directory!
629 bDirectory = TRUE;
630 TRACE("Treating '%S' as directory!\n", szFileName);
631 }
632 }
633 }
634 }
635
636 // This is a directory
637 if (bDirectory)
638 {
639 dwShellAttributes |= (SFGAO_FOLDER | /*SFGAO_HASSUBFOLDER |*/ SFGAO_STORAGE);
640
641 // Is this a real directory?
643 {
644 dwShellAttributes |= (SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR);
645 }
646 }
647 else
648 {
649 dwShellAttributes |= SFGAO_STREAM;
650 }
651
653 dwShellAttributes |= SFGAO_HIDDEN;
654
656 dwShellAttributes |= SFGAO_READONLY;
657
658 if (SFGAO_LINK & *pdwAttributes)
659 {
660 char ext[MAX_PATH];
661
662 if (_ILGetExtension(pidl, ext, MAX_PATH) && !lstrcmpiA(ext, "lnk"))
663 dwShellAttributes |= SFGAO_LINK;
664 }
665
666 if (SFGAO_HASSUBFOLDER & *pdwAttributes)
667 {
668 CComPtr<IShellFolder> psf2;
669 if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
670 {
671 CComPtr<IEnumIDList> pEnumIL;
672 if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
673 {
674 if (pEnumIL->Skip(1) == S_OK)
675 dwShellAttributes |= SFGAO_HASSUBFOLDER;
676 }
677 }
678 }
679
680 *pdwAttributes = dwShellAttributes;
681
682 TRACE ("-- 0x%08x\n", *pdwAttributes);
683 return S_OK;
684}
685
687 _In_ LPOLESTR lpszDisplayName,
688 _Out_ WIN32_FIND_DATAW *pFind,
689 _Out_ LPITEMIDLIST *ppidl)
690{
691 HRESULT hr;
692 LPWSTR pchNext = lpszDisplayName;
693
694 *ppidl = NULL;
695
696 LPITEMIDLIST pidl;
697 for (hr = S_OK; SUCCEEDED(hr); hr = SHILAppend(pidl, ppidl))
698 {
699 hr = Shell_NextElement(&pchNext, pFind->cFileName, _countof(pFind->cFileName), FALSE);
700 if (hr != S_OK)
701 break;
702
703 if (pchNext)
704 pFind->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
705
706 pidl = _ILCreateFromFindDataW(pFind);
707 if (!pidl)
708 {
710 break;
711 }
712 }
713
714 if (SUCCEEDED(hr))
715 return S_OK;
716
717 if (*ppidl)
718 {
719 ILFree(*ppidl);
720 *ppidl = NULL;
721 }
722
723 return hr;
724}
725
727{
730 PathAppendW(szPath, pszName);
731
732 HANDLE hFind = ::FindFirstFileW(szPath, pFind);
733 if (hFind == INVALID_HANDLE_VALUE)
734 return FALSE;
735
736 ::FindClose(hFind);
737 return TRUE;
738}
739
741{
742 *ppidl = NULL;
743
744 if (PathIsDosDevice(pszName))
746
747 WIN32_FIND_DATAW FindData = { 0 };
748
749 HRESULT hr = S_OK;
750 if (attrs == ULONG_MAX) // Invalid attributes
751 {
752 if (!_GetFindDataFromName(pszName, &FindData))
754 }
755 else // Pretend as an item of attrs
756 {
757 StringCchCopyW(FindData.cFileName, _countof(FindData.cFileName), pszName);
758 FindData.dwFileAttributes = attrs;
759 }
760
761 if (FAILED(hr))
762 return hr;
763
764 *ppidl = _ILCreateFromFindDataW(&FindData);
765 if (!*ppidl)
766 return E_OUTOFMEMORY;
767
768 return S_OK;
769}
770
771/**************************************************************************
772* CFSFolder::ParseDisplayName {SHELL32}
773*
774* Parse a display name.
775*
776* PARAMS
777* hwndOwner [in] Parent window for any message's
778* pbc [in] optional FileSystemBindData context
779* lpszDisplayName [in] Unicode displayname.
780* pchEaten [out] (unicode) characters processed
781* ppidl [out] complex pidl to item
782* pdwAttributes [out] items attributes
783*
784* NOTES
785* Every folder tries to parse only its own (the leftmost) pidl and creates a
786* subfolder to evaluate the remaining parts.
787* Now we can parse into namespaces implemented by shell extensions
788*
789* Behaviour on win98: lpszDisplayName=NULL -> crash
790* lpszDisplayName="" -> returns mycoputer-pidl
791*
792* FIXME
793* pdwAttributes is not set
794* pchEaten is not set like in windows
795*/
797 LPBC pbc,
798 LPOLESTR lpszDisplayName,
799 DWORD *pchEaten, PIDLIST_RELATIVE *ppidl,
800 DWORD *pdwAttributes)
801{
802 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
803 this, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
804 pchEaten, ppidl, pdwAttributes);
805
806 if (!ppidl)
807 return E_INVALIDARG;
808
809 *ppidl = NULL;
810
811 if (!lpszDisplayName)
812 return E_INVALIDARG;
813
814 HRESULT hr;
815 WIN32_FIND_DATAW FindData;
816 if (SHIsFileSysBindCtx(pbc, &FindData) == S_OK)
817 {
818 CComHeapPtr<ITEMIDLIST> pidlTemp;
819 hr = _ParseSimple(lpszDisplayName, &FindData, &pidlTemp);
820 if (SUCCEEDED(hr) && pdwAttributes && *pdwAttributes)
821 {
822 LPCITEMIDLIST pidlLast = ILFindLastID(pidlTemp);
823 GetAttributesOf(1, &pidlLast, pdwAttributes);
824 }
825
826 if (SUCCEEDED(hr))
827 *ppidl = pidlTemp.Detach();
828 }
829 else
830 {
831 INT cchElement = lstrlenW(lpszDisplayName) + 1;
832 LPWSTR pszElement = (LPWSTR)alloca(cchElement * sizeof(WCHAR));
833 LPWSTR pchNext = lpszDisplayName;
834 hr = Shell_NextElement(&pchNext, pszElement, cchElement, TRUE);
835 if (FAILED(hr))
836 return hr;
837
838 hr = _CreateIDListFromName(pszElement, ULONG_MAX, pbc, ppidl);
839 if (FAILED(hr))
840 {
841 if (pchNext) // Is there the next element?
842 {
843 // pszElement seems like a directory
844 if (_GetFindDataFromName(pszElement, &FindData) &&
845 (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
846 {
847 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_DIRECTORY, pbc, ppidl);
848 }
849 }
850 else
851 {
852 // pszElement seems like a non-directory
855 (BindCtx_GetMode(pbc, 0) & STGM_CREATE))
856 {
857 // Pretend like a normal file
858 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_NORMAL, pbc, ppidl);
859 }
860 }
861 }
862
863 if (SUCCEEDED(hr))
864 {
865 if (pchNext) // Is there next?
866 {
867 CComPtr<IShellFolder> psfChild;
868 hr = BindToObject(*ppidl, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
869 if (FAILED(hr))
870 return hr;
871
872 DWORD chEaten;
873 CComHeapPtr<ITEMIDLIST> pidlChild;
874 hr = psfChild->ParseDisplayName(hwndOwner, pbc, pchNext, &chEaten, &pidlChild,
875 pdwAttributes);
876
877 // Append pidlChild to ppidl
878 if (SUCCEEDED(hr))
879 hr = SHILAppend(pidlChild.Detach(), ppidl);
880 }
881 else if (pdwAttributes && *pdwAttributes)
882 {
883 GetAttributesOf(1, (LPCITEMIDLIST*)ppidl, pdwAttributes);
884 }
885 }
886 }
887
888 TRACE("(%p)->(-- pidl=%p ret=0x%08x)\n", this, ppidl ? *ppidl : 0, hr);
889
890 return hr;
891}
892
893/**************************************************************************
894* CFSFolder::EnumObjects
895* PARAMETERS
896* HWND hwndOwner, //[in ] Parent Window
897* DWORD grfFlags, //[in ] SHCONTF enumeration mask
898* LPENUMIDLIST* ppenumIDList //[out] IEnumIDList interface
899*/
901 HWND hwndOwner,
903 LPENUMIDLIST *ppEnumIDList)
904{
905 return ShellObjectCreatorInit<CFileSysEnum>(m_sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
906}
907
908/**************************************************************************
909* CFSFolder::BindToObject
910* PARAMETERS
911* LPCITEMIDLIST pidl, //[in ] relative pidl to open
912* LPBC pbc, //[in ] optional FileSystemBindData context
913* REFIID riid, //[in ] Initial Interface
914* LPVOID* ppvObject //[out] Interface*
915*/
918 LPBC pbc,
919 REFIID riid,
920 LPVOID * ppvOut)
921{
922 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbc,
923 shdebugstr_guid(&riid), ppvOut);
924
925 CComPtr<IShellFolder> pSF;
926 HRESULT hr;
927
928 if (!m_pidlRoot || !ppvOut || !pidl || !pidl->mkid.cb)
929 {
930 ERR("CFSFolder::BindToObject: Invalid parameters\n");
931 return E_INVALIDARG;
932 }
933
934 /* Get the pidl data */
935 FileStruct* pData = &_ILGetDataPointer(pidl)->u.file;
936 FileStructW* pDataW = _ILGetFileStructW(pidl);
937
938 if (!pDataW)
939 {
940 ERR("CFSFolder::BindToObject: Invalid pidl!\n");
941 return E_INVALIDARG;
942 }
943
944 *ppvOut = NULL;
945
946 /* Create the target folder info */
948 pfti.dwAttributes = -1;
949 pfti.csidl = -1;
951
952 /* Get the CLSID to bind to */
953 CLSID clsidFolder;
954 if (_ILIsFolder(pidl))
955 {
956 if ((pData->uFileAttribs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
957 {
958 hr = SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder);
959
960 if (SUCCEEDED(hr))
961 {
962 /* We got a GUID from a desktop.ini, let's try it */
963 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
964 if (SUCCEEDED(hr))
965 {
966 TRACE("-- returning (%p) %08x, (%s)\n", *ppvOut, hr, wine_dbgstr_guid(&clsidFolder));
967 return hr;
968 }
969
970 /* Something went wrong, re-try it with a normal ShellFSFolder */
971 ERR("CFSFolder::BindToObject: %s failed to bind, using fallback (0x%08x)\n", wine_dbgstr_guid(&clsidFolder), hr);
972 }
973 }
974 /* No system folder or the custom class failed */
975 clsidFolder = CLSID_ShellFSFolder;
976 }
977 else
978 {
979 hr = GetCLSIDForFileType(pidl, L"CLSID", &clsidFolder);
980 if (hr == S_FALSE)
982 if (hr != S_OK)
983 return hr;
984 }
985
986 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
988 return hr;
989
990 TRACE ("-- returning (%p) %08x\n", *ppvOut, hr);
991
992 return S_OK;
993
994}
995
996/**************************************************************************
997* CFSFolder::BindToStorage
998* PARAMETERS
999* LPCITEMIDLIST pidl, //[in ] complex pidl to store
1000* LPBC pbc, //[in ] reserved
1001* REFIID riid, //[in ] Initial storage interface
1002* LPVOID* ppvObject //[out] Interface* returned
1003*/
1005 PCUIDLIST_RELATIVE pidl,
1006 LPBC pbcReserved,
1007 REFIID riid,
1008 LPVOID *ppvOut)
1009{
1010 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved,
1011 shdebugstr_guid (&riid), ppvOut);
1012
1013 *ppvOut = NULL;
1014 return E_NOTIMPL;
1015}
1016
1017/**************************************************************************
1018* CFSFolder::CompareIDs
1019*/
1020
1022 PCUIDLIST_RELATIVE pidl1,
1023 PCUIDLIST_RELATIVE pidl2)
1024{
1025 LPPIDLDATA pData1 = _ILGetDataPointer(pidl1);
1026 LPPIDLDATA pData2 = _ILGetDataPointer(pidl2);
1027 FileStructW* pDataW1 = _ILGetFileStructW(pidl1);
1028 FileStructW* pDataW2 = _ILGetFileStructW(pidl2);
1029 BOOL bIsFolder1 = _ILIsFolder(pidl1);
1030 BOOL bIsFolder2 = _ILIsFolder(pidl2);
1031 LPWSTR pExtension1, pExtension2;
1032
1033 if (!pDataW1 || !pDataW2 || LOWORD(lParam) >= GENERICSHELLVIEWCOLUMNS)
1034 return E_INVALIDARG;
1035
1036 /* When sorting between a File and a Folder, the Folder gets sorted first */
1037 if (bIsFolder1 != bIsFolder2)
1038 {
1039 return MAKE_COMPARE_HRESULT(bIsFolder1 ? -1 : 1);
1040 }
1041
1042 int result = 0;
1043 switch (LOWORD(lParam))
1044 {
1045 case SHFSF_COL_NAME:
1046 result = wcsicmp(pDataW1->wszName, pDataW2->wszName);
1047 break;
1048 case SHFSF_COL_SIZE:
1049 if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
1050 result = 1;
1051 else if (pData1->u.file.dwFileSize < pData2->u.file.dwFileSize)
1052 result = -1;
1053 else
1054 result = 0;
1055 break;
1056 case SHFSF_COL_TYPE:
1057 pExtension1 = PathFindExtensionW(pDataW1->wszName);
1058 pExtension2 = PathFindExtensionW(pDataW2->wszName);
1059 result = wcsicmp(pExtension1, pExtension2);
1060 break;
1061 case SHFSF_COL_MDATE:
1062 result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
1063 if (result == 0)
1064 result = pData1->u.file.uFileTime - pData2->u.file.uFileTime;
1065 break;
1066 case SHFSF_COL_FATTS:
1067 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
1068 case SHFSF_COL_COMMENT:
1069 result = 0;
1070 break;
1071 default:
1072 if (_ILIsPidlSimple(pidl1) || _ILIsPidlSimple(pidl2))
1073 ERR("Unknown column %u, can't compare\n", LOWORD(lParam));
1074 else
1075 TRACE("Unknown column %u, deferring to the subfolder\n", LOWORD(lParam));
1076 }
1077
1078 if (result == 0)
1079 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
1080
1082}
1083
1084/**************************************************************************
1085* CFSFolder::CreateViewObject
1086*/
1088 REFIID riid, LPVOID * ppvOut)
1089{
1090 CComPtr<IShellView> pShellView;
1092
1093 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid (&riid),
1094 ppvOut);
1095
1096 if (ppvOut)
1097 {
1098 *ppvOut = NULL;
1099
1100 BOOL bIsDropTarget = IsEqualIID (riid, IID_IDropTarget);
1101 BOOL bIsShellView = !bIsDropTarget && IsEqualIID (riid, IID_IShellView);
1102
1103 if (bIsDropTarget || bIsShellView)
1104 {
1105 DWORD dwDirAttributes = _ILGetFileAttributes(ILFindLastID(m_pidlRoot), NULL, 0);
1106
1107 if ((dwDirAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1108 {
1109 CLSID clsidFolder;
1110 hr = SHELL32_GetCLSIDForDirectory(m_sPathTarget, L"UICLSID", &clsidFolder);
1111 if (SUCCEEDED(hr))
1112 {
1113 CComPtr<IPersistFolder> spFolder;
1114 hr = SHCoCreateInstance(NULL, &clsidFolder, NULL, IID_PPV_ARG(IPersistFolder, &spFolder));
1115 if (!FAILED_UNEXPECTEDLY(hr))
1116 {
1117 hr = spFolder->Initialize(m_pidlRoot);
1118
1119 if (!FAILED_UNEXPECTEDLY(hr))
1120 {
1121 hr = spFolder->QueryInterface(riid, ppvOut);
1122 }
1123 }
1124 }
1125 else
1126 {
1127 // No desktop.ini, or no UICLSID present, continue as if nothing happened
1128 hr = E_INVALIDARG;
1129 }
1130 }
1131 }
1132
1133 if (!SUCCEEDED(hr))
1134 {
1135 // No UICLSID handler found, continue to the default handlers
1136 if (bIsDropTarget)
1137 {
1139 }
1140 else if (IsEqualIID (riid, IID_IContextMenu))
1141 {
1142 HKEY hKeys[16];
1143 UINT cKeys = 0;
1144 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
1145
1146 DEFCONTEXTMENU dcm;
1147 dcm.hwnd = hwndOwner;
1148 dcm.pcmcb = this;
1149 dcm.pidlFolder = m_pidlRoot;
1150 dcm.psf = this;
1151 dcm.cidl = 0;
1152 dcm.apidl = NULL;
1153 dcm.cKeys = cKeys;
1154 dcm.aKeys = hKeys;
1156 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
1157 }
1158 else if (bIsShellView)
1159 {
1160 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this, NULL, this};
1161 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
1162 }
1163 else
1164 {
1165 hr = E_INVALIDARG;
1166 }
1167 }
1168 }
1169 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
1170 return hr;
1171}
1172
1173/**************************************************************************
1174* CFSFolder::GetAttributesOf
1175*
1176* PARAMETERS
1177* UINT cidl, //[in ] num elements in pidl array
1178* LPCITEMIDLIST* apidl, //[in ] simple pidl array
1179* ULONG* rgfInOut) //[out] result array
1180*
1181*/
1183 PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut)
1184{
1185 HRESULT hr = S_OK;
1186
1187 if (!rgfInOut)
1188 return E_INVALIDARG;
1189 if (cidl && !apidl)
1190 return E_INVALIDARG;
1191
1192 if (*rgfInOut == 0)
1193 *rgfInOut = ~0;
1194
1195 if(cidl == 0)
1196 {
1198
1199 if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
1200 {
1201 SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
1202 }
1203 else if (_ILIsDrive(rpidl))
1204 {
1205 IShellFolder *psfParent = NULL;
1207 if(SUCCEEDED(hr))
1208 {
1209 hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
1210 psfParent->Release();
1211 }
1212 }
1213 else
1214 {
1215 ERR("Got and unknown pidl!\n");
1216 }
1217 }
1218 else
1219 {
1220 while (cidl > 0 && *apidl)
1221 {
1222 pdump(*apidl);
1223 if(_ILIsFolder(*apidl) || _ILIsValue(*apidl))
1224 SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
1225 else
1226 ERR("Got an unknown type of pidl!!!\n");
1227 apidl++;
1228 cidl--;
1229 }
1230 }
1231 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1232 *rgfInOut &= ~SFGAO_VALIDATE;
1233
1234 TRACE("-- result=0x%08x\n", *rgfInOut);
1235
1236 return hr;
1237}
1238
1239/**************************************************************************
1240* CFSFolder::GetUIObjectOf
1241*
1242* PARAMETERS
1243* HWND hwndOwner, //[in ] Parent window for any output
1244* UINT cidl, //[in ] array size
1245* LPCITEMIDLIST* apidl, //[in ] simple pidl array
1246* REFIID riid, //[in ] Requested Interface
1247* UINT* prgfInOut, //[ ] reserved
1248* LPVOID* ppvObject) //[out] Resulting Interface
1249*
1250* NOTES
1251* This function gets asked to return "view objects" for one or more (multiple
1252* select) items:
1253* The viewobject typically is an COM object with one of the following
1254* interfaces:
1255* IExtractIcon,IDataObject,IContextMenu
1256* In order to support icon positions in the default Listview your DataObject
1257* must implement the SetData method (in addition to GetData :) - the shell
1258* passes a barely documented "Icon positions" structure to SetData when the
1259* drag starts, and GetData's it if the drop is in another explorer window that
1260* needs the positions.
1261*/
1263 UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
1264 REFIID riid, UINT * prgfInOut,
1265 LPVOID * ppvOut)
1266{
1267 LPVOID pObj = NULL;
1269
1270 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
1271 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1272
1273 if (ppvOut)
1274 {
1275 *ppvOut = NULL;
1276
1277 if (cidl == 1 && _ILIsValue(apidl[0]))
1278 {
1279 hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut);
1280 if(hr != S_FALSE)
1281 return hr;
1282 }
1283
1284 if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
1285 {
1286 HKEY hKeys[16];
1287 UINT cKeys = 0;
1288 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
1289
1290 DEFCONTEXTMENU dcm;
1291 dcm.hwnd = hwndOwner;
1292 dcm.pcmcb = this;
1293 dcm.pidlFolder = m_pidlRoot;
1294 dcm.psf = this;
1295 dcm.cidl = cidl;
1296 dcm.apidl = apidl;
1297 dcm.cKeys = cKeys;
1298 dcm.aKeys = hKeys;
1300 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
1301 }
1302 else if (IsEqualIID (riid, IID_IDataObject))
1303 {
1304 if (cidl >= 1)
1305 {
1306 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1307 }
1308 else
1309 {
1310 hr = E_INVALIDARG;
1311 }
1312 }
1313 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1314 {
1315 if (_ILIsValue(apidl[0]))
1316 hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj);
1317 if (hr != S_OK)
1318 hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1319 }
1320 else if (IsEqualIID (riid, IID_IDropTarget))
1321 {
1322 /* only interested in attempting to bind to shell folders, not files (except exe), so if we fail, rebind to root */
1323 if (cidl != 1 || FAILED(hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj)))
1324 {
1326 }
1327 }
1328 else
1329 hr = E_NOINTERFACE;
1330
1331 if (SUCCEEDED(hr) && !pObj)
1332 hr = E_OUTOFMEMORY;
1333
1334 *ppvOut = pObj;
1335 }
1336 TRACE("(%p)->hr=0x%08x\n", this, hr);
1337 return hr;
1338}
1339
1340/******************************************************************************
1341 * SHELL_FS_HideExtension [Internal]
1342 *
1343 * Query the registry if the filename extension of a given path should be
1344 * hidden.
1345 *
1346 * PARAMS
1347 * szPath [I] Relative or absolute path of a file
1348 *
1349 * RETURNS
1350 * TRUE, if the filename's extension should be hidden
1351 * FALSE, otherwise.
1352 */
1354{
1355 HKEY hKey;
1356 DWORD dwData, dwDataSize = sizeof(DWORD);
1357 BOOL doHide = FALSE; /* The default value is FALSE (win98 at least) */
1358 LONG lError;
1359
1360 lError = RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
1361 0, NULL, 0, KEY_ALL_ACCESS, NULL,
1362 &hKey, NULL);
1363 if (lError == ERROR_SUCCESS)
1364 {
1365 lError = RegQueryValueExW(hKey, L"HideFileExt", NULL, NULL, (LPBYTE)&dwData, &dwDataSize);
1366 if (lError == ERROR_SUCCESS)
1367 doHide = dwData;
1369 }
1370
1371 if (!doHide)
1372 {
1374 if (*DotExt != 0)
1375 {
1377 LONG classlen = sizeof(classname);
1378 lError = RegQueryValueW(HKEY_CLASSES_ROOT, DotExt, classname, &classlen);
1379 if (lError == ERROR_SUCCESS)
1380 {
1382 if (lError == ERROR_SUCCESS)
1383 {
1384 lError = RegQueryValueExW(hKey, L"NeverShowExt", NULL, NULL, NULL, NULL);
1385 if (lError == ERROR_SUCCESS)
1386 doHide = TRUE;
1387
1389 }
1390 }
1391 }
1392 }
1393
1394 return doHide;
1395}
1396
1398{
1399 /*FIXME: MSDN also mentions SHGDN_FOREDITING which is not yet handled. */
1400 if (!(dwFlags & SHGDN_FORPARSING) &&
1401 ((dwFlags & SHGDN_INFOLDER) || (dwFlags == SHGDN_NORMAL))) {
1402 if (SHELL_FS_HideExtension(szPath) && szPath[0] != '.')
1404 }
1405}
1406
1407/**************************************************************************
1408* CFSFolder::GetDisplayNameOf
1409* Retrieves the display name for the specified file object or subfolder
1410*
1411* PARAMETERS
1412* LPCITEMIDLIST pidl, //[in ] complex pidl to item
1413* DWORD dwFlags, //[in ] SHGNO formatting flags
1414* LPSTRRET lpName) //[out] Returned display name
1415*
1416* FIXME
1417* if the name is in the pidl the ret value should be a STRRET_OFFSET
1418*/
1419
1421 DWORD dwFlags, LPSTRRET strRet)
1422{
1423 if (!strRet)
1424 return E_INVALIDARG;
1425
1426 /* If it is a complex pidl, let the child handle it */
1427 if (!_ILIsPidlSimple (pidl)) /* complex pidl */
1428 {
1429 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1430 }
1431 else if (pidl && !pidl->mkid.cb) /* empty pidl */
1432 {
1433 /* If it is an empty pidl return only the path of the folder */
1437 {
1438 return SHSetStrRet(strRet, m_sPathTarget);
1439 }
1440 return E_INVALIDARG;
1441 }
1442
1443 int len = 0;
1444 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1445 if (!pszPath)
1446 return E_OUTOFMEMORY;
1447
1451 {
1452 lstrcpynW(pszPath, m_sPathTarget, MAX_PATH);
1453 PathAddBackslashW(pszPath);
1454 len = wcslen(pszPath);
1455 }
1456 _ILSimpleGetTextW(pidl, pszPath + len, MAX_PATH + 1 - len);
1458
1459 strRet->uType = STRRET_WSTR;
1460 strRet->pOleStr = pszPath;
1461
1462 TRACE ("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1463 return S_OK;
1464}
1465
1466/**************************************************************************
1467* CFSFolder::SetNameOf
1468* Changes the name of a file object or subfolder, possibly changing its item
1469* identifier in the process.
1470*
1471* PARAMETERS
1472* HWND hwndOwner, //[in ] Owner window for output
1473* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
1474* LPCOLESTR lpszName, //[in ] the items new display name
1475* DWORD dwFlags, //[in ] SHGNO formatting flags
1476* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
1477*/
1479 HWND hwndOwner,
1480 PCUITEMID_CHILD pidl,
1481 LPCOLESTR lpName,
1482 DWORD dwFlags,
1483 PITEMID_CHILD *pPidlOut)
1484{
1485 WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
1486 BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl));
1487
1488 TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
1489 debugstr_w (lpName), dwFlags, pPidlOut);
1490
1491 FileStructW* pDataW = _ILGetFileStructW(pidl);
1492 if (!pDataW)
1493 {
1494 ERR("Got garbage pidl:\n");
1495 pdump_always(pidl);
1496 return E_INVALIDARG;
1497 }
1498
1499 /* build source path */
1500 PathCombineW(szSrc, m_sPathTarget, pDataW->wszName);
1501
1502 /* build destination path */
1505 else
1506 lstrcpynW(szDest, lpName, MAX_PATH);
1507
1509 WCHAR *ext = PathFindExtensionW(szSrc);
1510 if(*ext != '\0') {
1511 INT len = wcslen(szDest);
1512 lstrcpynW(szDest + len, ext, MAX_PATH - len);
1513 }
1514 }
1515
1516 TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
1517 if (!wcscmp(szSrc, szDest))
1518 {
1519 /* src and destination is the same */
1520 HRESULT hr = S_OK;
1521 if (pPidlOut)
1522 hr = _ILCreateFromPathW(szDest, pPidlOut);
1523
1524 return hr;
1525 }
1526
1527 if (MoveFileW (szSrc, szDest))
1528 {
1529 HRESULT hr = S_OK;
1530
1531 if (pPidlOut)
1532 hr = _ILCreateFromPathW(szDest, pPidlOut);
1533
1535 SHCNF_PATHW, szSrc, szDest);
1536
1537 return hr;
1538 }
1539
1540 return E_FAIL;
1541}
1542
1544{
1545 FIXME ("(%p)\n", this);
1546 return E_NOTIMPL;
1547}
1548
1550{
1551 FIXME ("(%p)\n", this);
1552 return E_NOTIMPL;
1553}
1554
1556 ULONG * pSort, ULONG * pDisplay)
1557{
1558 TRACE ("(%p)\n", this);
1559
1560 if (pSort)
1561 *pSort = 0;
1562 if (pDisplay)
1563 *pDisplay = 0;
1564
1565 return S_OK;
1566}
1567
1569 SHCOLSTATEF *pcsFlags)
1570{
1571 TRACE ("(%p)\n", this);
1572
1573 if (!pcsFlags)
1574 return E_INVALIDARG;
1575 else
1576 return GetDefaultFSColumnState(iColumn, *pcsFlags);
1577}
1578
1580 const SHCOLUMNID * pscid, VARIANT * pv)
1581{
1582 FIXME ("(%p)\n", this);
1583
1584 return E_NOTIMPL;
1585}
1586
1588 UINT iColumn, SHELLDETAILS * psd)
1589{
1590 HRESULT hr = E_FAIL;
1591
1592 TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1593
1594 if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS)
1595 return E_INVALIDARG;
1596
1597 if (!pidl)
1598 {
1599 /* the header titles */
1600 return GetFSColumnDetails(iColumn, *psd);
1601 }
1602 else
1603 {
1604 hr = S_OK;
1605 psd->str.uType = STRRET_CSTR;
1606 /* the data from the pidl */
1607 switch (iColumn)
1608 {
1609 case SHFSF_COL_NAME:
1611 break;
1612 case SHFSF_COL_SIZE:
1613 _ILGetFileSize(pidl, psd->str.cStr, MAX_PATH);
1614 break;
1615 case SHFSF_COL_TYPE:
1616 _ILGetFileType(pidl, psd->str.cStr, MAX_PATH);
1617 break;
1618 case SHFSF_COL_MDATE:
1619 _ILGetFileDate(pidl, psd->str.cStr, MAX_PATH);
1620 break;
1621 case SHFSF_COL_FATTS:
1623 break;
1624 case SHFSF_COL_COMMENT:
1625 psd->str.cStr[0] = '\0'; // TODO: Extract comment from .lnk files? desktop.ini?
1626 break;
1627#if DBG
1628 default:
1629 ERR("Missing case for column %d\n", iColumn);
1630#else
1632#endif
1633 }
1634 }
1635
1636 return hr;
1637}
1638
1640 SHCOLUMNID * pscid)
1641{
1642 FIXME ("(%p)\n", this);
1643 return E_NOTIMPL;
1644}
1645
1646/************************************************************************
1647 * CFSFolder::GetClassID
1648 */
1650{
1651 TRACE ("(%p)\n", this);
1652
1653 if (!lpClassId)
1654 return E_POINTER;
1655
1656 *lpClassId = *m_pclsid;
1657
1658 return S_OK;
1659}
1660
1661/************************************************************************
1662 * CFSFolder::Initialize
1663 *
1664 * NOTES
1665 * m_sPathTarget is not set. Don't know how to handle in a non rooted environment.
1666 */
1668{
1669 WCHAR wszTemp[MAX_PATH];
1670
1671 TRACE ("(%p)->(%p)\n", this, pidl);
1672
1673 SHFree(m_pidlRoot); /* free the old pidl */
1674 m_pidlRoot = ILClone (pidl); /* set my pidl */
1675
1678
1679 /* set my path */
1680 if (SHGetPathFromIDListW (pidl, wszTemp))
1681 {
1682 int len = wcslen(wszTemp);
1683 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1684 if (!m_sPathTarget)
1685 return E_OUTOFMEMORY;
1686 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1687 }
1688
1689 TRACE ("--(%p)->(%s)\n", this, debugstr_w(m_sPathTarget));
1690 return S_OK;
1691}
1692
1693/**************************************************************************
1694 * CFSFolder::GetCurFolder
1695 */
1697{
1698 TRACE ("(%p)->(%p)\n", this, pidl);
1699
1700 if (!pidl)
1701 return E_POINTER;
1702
1703 *pidl = ILClone(m_pidlRoot);
1704 return S_OK;
1705}
1706
1707/**************************************************************************
1708 * CFSFolder::InitializeEx
1709 *
1710 * FIXME: error handling
1711 */
1713 const PERSIST_FOLDER_TARGET_INFO * ppfti)
1714{
1715 WCHAR wszTemp[MAX_PATH];
1716
1717 TRACE("(%p)->(%p,%p,%p)\n", this, pbc, pidlRootx, ppfti);
1718 if (ppfti)
1719 TRACE("--%p %s %s 0x%08x 0x%08x\n",
1721 debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes,
1722 ppfti->csidl);
1723
1724 pdump (pidlRootx);
1725 if (ppfti && ppfti->pidlTargetFolder)
1726 pdump(ppfti->pidlTargetFolder);
1727
1728 if (m_pidlRoot)
1729 __SHFreeAndNil(&m_pidlRoot); /* free the old */
1730 if (m_sPathTarget)
1732
1733 /*
1734 * Root path and pidl
1735 */
1736 m_pidlRoot = ILClone(pidlRootx);
1737
1738 /*
1739 * the target folder is spezified in csidl OR pidlTargetFolder OR
1740 * szTargetParsingName
1741 */
1742 if (ppfti)
1743 {
1744 if (ppfti->csidl != -1)
1745 {
1746 if (SHGetSpecialFolderPathW(0, wszTemp, ppfti->csidl,
1747 ppfti->csidl & CSIDL_FLAG_CREATE)) {
1748 int len = wcslen(wszTemp);
1749 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1750 if (!m_sPathTarget)
1751 return E_OUTOFMEMORY;
1752 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1753 }
1754 }
1755 else if (ppfti->szTargetParsingName[0])
1756 {
1757 int len = wcslen(ppfti->szTargetParsingName);
1758 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1759 if (!m_sPathTarget)
1760 return E_OUTOFMEMORY;
1762 (len + 1) * sizeof(WCHAR));
1763 }
1764 else if (ppfti->pidlTargetFolder)
1765 {
1766 if (SHGetPathFromIDListW(ppfti->pidlTargetFolder, wszTemp))
1767 {
1768 int len = wcslen(wszTemp);
1769 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1770 if (!m_sPathTarget)
1771 return E_OUTOFMEMORY;
1772 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1773 }
1774 }
1775 }
1776
1777 TRACE("--(%p)->(target=%s)\n", this, debugstr_w(m_sPathTarget));
1779 return (m_sPathTarget) ? S_OK : E_FAIL;
1780}
1781
1783{
1784 FIXME("(%p)->(%p)\n", this, ppfti);
1785 ZeroMemory(ppfti, sizeof (*ppfti));
1786 return E_NOTIMPL;
1787}
1788
1790{
1792
1793 sprintfW(buf, L"ShellEx\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
1794 riid.Data1, riid.Data2, riid.Data3,
1795 riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3],
1796 riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7]);
1797
1798 CLSID clsid;
1799 HRESULT hr;
1800
1801 hr = GetCLSIDForFileType(pidl, buf, &clsid);
1802 if (hr != S_OK)
1803 return hr;
1804
1805 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1807 return hr;
1808
1809 return S_OK;
1810}
1811
1813{
1814 HRESULT hr;
1815
1816 TRACE("CFSFolder::_GetDropTarget entered\n");
1817
1818 if (_ILIsFolder (pidl))
1819 {
1820 CComPtr<IShellFolder> psfChild;
1821 hr = this->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1823 return hr;
1824
1825 return psfChild->CreateViewObject(NULL, IID_IDropTarget, ppvOut);
1826 }
1827
1828 CLSID clsid;
1829 hr = GetCLSIDForFileType(pidl, L"shellex\\DropHandler", &clsid);
1830 if (hr != S_OK)
1831 return hr;
1832
1833 hr = _CreateShellExtInstance(&clsid, pidl, IID_IDropTarget, ppvOut);
1835 return S_FALSE;
1836
1837 return S_OK;
1838}
1839
1841{
1842 CLSID clsid;
1843 HRESULT hr;
1844
1845 hr = GetCLSIDForFileType(pidl, L"shellex\\IconHandler", &clsid);
1846 if (hr != S_OK)
1847 return hr;
1848
1849 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1851 return S_FALSE;
1852
1853 return S_OK;
1854}
1855
1857{
1858 HRESULT hr;
1859 WCHAR wszPath[MAX_PATH];
1860
1861 FileStructW* pDataW = _ILGetFileStructW(pidl);
1862 if (!pDataW)
1863 {
1864 ERR("Got garbage pidl\n");
1865 pdump_always(pidl);
1866 return E_INVALIDARG;
1867 }
1868
1869 PathCombineW(wszPath, m_sPathTarget, pDataW->wszName);
1870
1871 CComPtr<IPersistFile> pp;
1874 return hr;
1875
1876 pp->Load(wszPath, 0);
1877
1878 hr = pp->QueryInterface(riid, ppvOut);
1879 if (hr != S_OK)
1880 {
1881 ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
1882 return hr;
1883 }
1884 return hr;
1885}
1886
1888{
1889 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1890 return S_OK;
1891
1892 /* no data object means no selection */
1893 if (!pdtobj)
1894 {
1895 if (uMsg == DFM_INVOKECOMMAND && wParam == 0)
1896 {
1897 // Create an data object
1898 CComHeapPtr<ITEMID_CHILD> pidlChild(ILClone(ILFindLastID(m_pidlRoot)));
1899 CComHeapPtr<ITEMIDLIST> pidlParent(ILClone(m_pidlRoot));
1900 ILRemoveLastID(pidlParent);
1901
1902 CComPtr<IDataObject> pDataObj;
1903 HRESULT hr = SHCreateDataObject(pidlParent, 1, &pidlChild, NULL, IID_PPV_ARG(IDataObject, &pDataObj));
1904 if (!FAILED_UNEXPECTEDLY(hr))
1905 {
1906 // Ask for a title to display
1907 CComHeapPtr<WCHAR> wszName;
1908 if (!FAILED_UNEXPECTEDLY(SHGetNameFromIDList(m_pidlRoot, SIGDN_PARENTRELATIVEPARSING, &wszName)))
1909 {
1910 BOOL bSuccess = SH_ShowPropertiesDialog(wszName, pDataObj);
1911 if (!bSuccess)
1912 ERR("SH_ShowPropertiesDialog failed\n");
1913 }
1914 }
1915 }
1916 else if (uMsg == DFM_MERGECONTEXTMENU)
1917 {
1918 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1919 HMENU hpopup = CreatePopupMenu();
1921 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu++, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1922 DestroyMenu(hpopup);
1923 }
1924
1925 return S_OK;
1926 }
1927
1929 return S_OK;
1930
1931 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1932}
1933
1935{
1936 // create stream from file
1937 HRESULT hr;
1938 CComPtr<IStream> pStream;
1940 FALSE, NULL, &pStream);
1941 if (FAILED(hr))
1942 return NULL;
1943
1944 // load the picture
1945 HBITMAP hbm = NULL;
1946 CComPtr<IPicture> pPicture;
1947 OleLoadPicture(pStream, 0, FALSE, IID_IPicture, (LPVOID *)&pPicture);
1948
1949 // get the bitmap handle
1950 if (pPicture)
1951 {
1952 pPicture->get_Handle((OLE_HANDLE *)&hbm);
1953
1954 // copy the bitmap handle
1956 }
1957
1958 return hbm;
1959}
1960
1962{
1963 if (data == NULL)
1964 {
1965 return E_POINTER;
1966 }
1967 if (data->cbSize != sizeof(*data))
1968 {
1969 // NOTE: You have to set the cbData member before SFVM_GET_CUSTOMVIEWINFO call.
1970 return E_INVALIDARG;
1971 }
1972
1973 data->hbmBack = NULL;
1974 data->clrText = CLR_INVALID;
1975 data->clrTextBack = CLR_INVALID;
1976
1978
1979 // does the folder exists?
1981 {
1982 return E_INVALIDARG;
1983 }
1984
1985 // don't use custom view in network path for security
1987 {
1988 return E_ACCESSDENIED;
1989 }
1990
1991 // build the ini file path
1993 PathAppend(szIniFile, L"desktop.ini");
1994
1995 static LPCWSTR TheGUID = L"{BE098140-A513-11D0-A3A4-00C04FD706EC}";
1996 static LPCWSTR Space = L" \t\n\r\f\v";
1997
1998 // get info from ini file
1999 WCHAR szImage[MAX_PATH], szText[64];
2000
2001 // load the image
2002 szImage[0] = UNICODE_NULL;
2003 GetPrivateProfileStringW(TheGUID, L"IconArea_Image", L"", szImage, _countof(szImage), szIniFile);
2004 if (szImage[0])
2005 {
2006 StrTrimW(szImage, Space);
2007 if (PathIsRelativeW(szImage))
2008 {
2009 PathAppendW(szPath, szImage);
2010 StringCchCopyW(szImage, _countof(szImage), szPath);
2011 }
2012 data->hbmBack = DoLoadPicture(szImage);
2013 }
2014
2015 // load the text color
2016 szText[0] = UNICODE_NULL;
2017 GetPrivateProfileStringW(TheGUID, L"IconArea_Text", L"", szText, _countof(szText), szIniFile);
2018 if (szText[0])
2019 {
2020 StrTrimW(szText, Space);
2021
2022 LPWSTR pchEnd = NULL;
2023 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2024
2025 if (pchEnd && !*pchEnd)
2026 data->clrText = cr;
2027 }
2028
2029 // load the text background color
2030 szText[0] = UNICODE_NULL;
2031 GetPrivateProfileStringW(TheGUID, L"IconArea_TextBackground", L"", szText, _countof(szText), szIniFile);
2032 if (szText[0])
2033 {
2034 StrTrimW(szText, Space);
2035
2036 LPWSTR pchEnd = NULL;
2037 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2038
2039 if (pchEnd && !*pchEnd)
2040 data->clrTextBack = cr;
2041 }
2042
2043 if (data->hbmBack != NULL || data->clrText != CLR_INVALID || data->clrTextBack != CLR_INVALID)
2044 return S_OK;
2045
2046 return E_FAIL;
2047}
2048
2050{
2052 switch (uMsg)
2053 {
2056 break;
2057 }
2058 return hr;
2059}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3857
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT WINAPI SHCreateDataObject(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IDataObject *pdtInner, REFIID riid, void **ppv)
#define SFVM_GET_CUSTOMVIEWINFO
DWORD dwFileAttributes
UINT cchMax
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDI_SHELL_FOLDER
Definition: treeview.c:36
#define IDS_PROPERTIES
Definition: resource.h:102
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL AddToEnumList(LPITEMIDLIST pidl)
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CFSFolder.cpp:1420
STDMETHOD() CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
Definition: CFSFolder.cpp:1887
STDMETHOD() Initialize(PCIDLIST_ABSOLUTE pidl) override
Definition: CFSFolder.cpp:1667
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CFSFolder.cpp:900
HRESULT _CreateShellExtInstance(const CLSID *pclsid, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1856
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:551
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CFSFolder.cpp:1478
DWORD m_bGroupPolicyActive
Definition: CFSFolder.h:31
HRESULT _GetIconHandler(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1840
LPWSTR m_sPathTarget
Definition: CFSFolder.h:27
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CFSFolder.cpp:1182
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:541
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CFSFolder.cpp:1021
STDMETHOD() GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
Definition: CFSFolder.cpp:1696
BOOL _GetFindDataFromName(_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind)
Definition: CFSFolder.cpp:726
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:1262
HRESULT _GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1812
HRESULT _CreateIDListFromName(LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:740
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CFSFolder.cpp:1639
HRESULT _ParseSimple(_In_ LPOLESTR lpszDisplayName, _Out_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:686
const CLSID * m_pclsid
Definition: CFSFolder.h:24
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:1004
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
Definition: CFSFolder.cpp:796
STDMETHOD() InitializeEx(IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *ppfti) override
Definition: CFSFolder.cpp:1712
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CFSFolder.cpp:1568
HRESULT WINAPI GetCustomViewInfo(ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data)
Definition: CFSFolder.cpp:1961
STDMETHOD() MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override
Definition: CFSFolder.cpp:2049
LPITEMIDLIST m_pidlRoot
Definition: CFSFolder.h:29
STDMETHOD() GetFolderTargetInfo(PERSIST_FOLDER_TARGET_INFO *ppfti) override
Definition: CFSFolder.cpp:1782
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CFSFolder.cpp:1579
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CFSFolder.cpp:1549
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
Definition: CFSFolder.cpp:1543
STDMETHOD() GetClassID(CLSID *lpClassId) override
Definition: CFSFolder.cpp:1649
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:1087
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CFSFolder.cpp:1555
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:916
HRESULT _CreateExtensionUIObject(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1789
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CFSFolder.cpp:1587
HRESULT _AddFindResult(LPWSTR sParentDir, const WIN32_FIND_DATAW &FindData, DWORD dwFlags)
Definition: CFSFolder.cpp:350
HRESULT WINAPI Initialize(LPWSTR sPathTarget, DWORD dwFlags)
Definition: CFSFolder.cpp:453
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define CHARS_IN_GUID
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
void pdump_always(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:319
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:311
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:428
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:75
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:74
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
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
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
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
UINT uFlags
Definition: api.c:59
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define wcsicmp
Definition: compat.h:15
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
static const WCHAR *const ext[]
Definition: module.c:53
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
BOOL WINAPI MoveFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName)
Definition: move.c:1104
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
UINT WINAPI GetPrivateProfileIntW(LPCWSTR section, LPCWSTR entry, INT def_val, LPCWSTR filename)
Definition: profile.c:1297
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
HRESULT WINAPI OleLoadPicture(LPSTREAM lpstream, LONG lSize, BOOL fRunmode, REFIID riid, LPVOID *ppvObj)
Definition: olepicture.c:2344
#define RRF_RT_REG_DWORD
Definition: driver.c:578
#define RRF_RT_REG_SZ
Definition: driver.c:575
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1353
static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID *pclsidFolder)
Definition: CFSFolder.cpp:560
#define GENERICSHELLVIEWCOLUMNS
Definition: CFSFolder.cpp:539
static BOOL getShellClassInfo(LPCWSTR Entry, LPWSTR pszValue, DWORD cchValueLen, LPCWSTR IniFile)
Definition: CFSFolder.cpp:161
#define SUPER_HIDDEN
static HRESULT getIconLocationForFolder(IShellFolder *psf, PCITEMID_CHILD pidl, UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
Definition: CFSFolder.cpp:167
HRESULT SHELL32_GetFSItemAttributes(IShellFolder *psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CFSFolder.cpp:580
static HRESULT getDefaultIconLocation(LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT uFlags)
Definition: CFSFolder.cpp:137
HRESULT GetCLSIDForFileTypeFromExtension(LPWSTR pExtension, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:72
static const shvheader GenericSFHeader[]
Definition: CFSFolder.cpp:530
HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:127
void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags)
Definition: CFSFolder.cpp:1397
HRESULT CFSExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:243
static HBITMAP DoLoadPicture(LPCWSTR pszFileName)
Definition: CFSFolder.cpp:1934
HKEY OpenKeyFromFileType(LPWSTR pExtension, LPCWSTR KeyName)
Definition: CFSFolder.cpp:18
LPWSTR ExtensionFromPidl(PCUIDLIST_RELATIVE pidl)
Definition: CFSFolder.cpp:48
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:114
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:497
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:139
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:59
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:38
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3092
HRESULT WINAPI SHCreateStreamOnFileEx(LPCWSTR lpszPath, DWORD dwMode, DWORD dwAttributes, BOOL bCreate, IStream *lpTemplate, IStream **lppStream)
Definition: istream.c:401
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
Definition: path.c:1034
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1723
int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
Definition: path.c:1092
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1579
HRESULT WINAPI SHRegGetCLSIDKeyW(REFGUID, LPCWSTR, BOOL, BOOL, PHKEY)
Definition: reg.c:2422
DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue, LPDWORD lpReserved, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1461
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1877
static BOOLEAN bSuccess
Definition: drive.cpp:433
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
BOOL SH_ShowPropertiesDialog(LPCWSTR pwszPath, IDataObject *pDataObj)
Definition: fprop.cpp:83
FxAutoRegKey hKey
Status
Definition: gdiplustypes.h:25
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint res
Definition: glext.h:9613
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
#define ULONG_MAX
Definition: limits.h:44
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
ULONG SFGAOF
Definition: shobjidl.idl:228
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
#define alloca
Definition: malloc.h:357
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HBITMAP
Definition: button.c:44
HRESULT hres
Definition: protocol.c:465
static HANDLE ULONG_PTR dwData
Definition: file.c:35
static const WCHAR sd[]
Definition: suminfo.c:286
static LPOLESTR
Definition: stg_prop.c:27
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
REFCLSID clsid
Definition: msctf.c:82
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_READ
Definition: nt_native.h:1023
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define DWORD
Definition: nt_native.h:44
#define DEFAULT_UNREACHABLE
#define UNICODE_NULL
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define L(x)
Definition: ntvdm.h:50
#define STGM_CREATE
Definition: objbase.h:926
#define STGM_READ
Definition: objbase.h:917
interface IBindCtx * LPBC
Definition: objfwd.h:18
const GUID IID_IPicture
const GUID IID_IDataObject
#define PathCombineW
Definition: pathcch.h:317
#define PathAddBackslashW
Definition: pathcch.h:301
#define PathAppendW
Definition: pathcch.h:309
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
BOOL _ILGetFileDate(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2466
DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2650
HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName)
Definition: pidl.c:1467
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2231
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1361
DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2510
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2405
HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST *ppidl)
Definition: pidl.c:1833
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2020
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1353
BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
Definition: pidl.c:100
void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2577
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2029
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2008
BOOL _ILGetExtension(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2531
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2151
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *wfd)
Definition: pidl.c:1785
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define LVCFMT_RIGHT
Definition: commctrl.h:2599
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define strcmpW(s1, s2)
Definition: unicode.h:38
#define sprintfW
Definition: unicode.h:58
WCHAR classname[128]
Definition: startup.c:15
TCHAR szIniFile[]
Definition: scrnsave.c:29
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:291
#define __SHFreeAndNil(ptr)
Definition: shell32_main.h:146
DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len) DECLSPEC_HIDDEN
Definition: shellord.c:117
#define CSIDL_FLAG_CREATE
#define STATUS_SUCCESS
Definition: shellext.h:65
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:579
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
#define SHFSF_COL_COMMENT
Definition: shfldr.h:48
#define SHFSF_COL_SIZE
Definition: shfldr.h:44
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
#define SHFSF_COL_NAME
Definition: shfldr.h:43
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:292
#define SHFSF_COL_TYPE
Definition: shfldr.h:45
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247
#define SHFSF_COL_FATTS
Definition: shfldr.h:47
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:30
#define SHFSF_COL_MDATE
Definition: shfldr.h:46
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
HRESULT hr
Definition: shlfolder.c:183
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1875
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1892
#define SHCNF_PATHW
Definition: shlobj.h:1910
#define MM_ADDSEPARATOR
Definition: shlobj.h:2513
struct _SFV_CREATE SFV_CREATE
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
LSTATUS WINAPI SHRegGetValueW(_In_ HKEY hkey, _In_opt_ LPCWSTR pszSubKey, _In_opt_ LPCWSTR pszValue, _In_ SRRF srrfFlags, _Out_opt_ LPDWORD pdwType, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID pvData, _Inout_opt_ LPDWORD pcbData)
#define PathIsNetworkPath
Definition: shlwapi.h:1101
#define PathAppend
Definition: shlwapi.h:801
#define IDI_SHELL_EXE
Definition: shresdef.h:553
#define IDS_SHV_COLUMN_SIZE
Definition: shresdef.h:52
#define IDS_SHV_COLUMN_MODIFIED
Definition: shresdef.h:54
#define IDI_SHELL_DOCUMENT
Definition: shresdef.h:551
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:69
#define IDS_SHV_COLUMN_ATTRIBUTES
Definition: shresdef.h:55
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
@ STRRET_CSTR
Definition: shtypes.idl:87
@ STRRET_WSTR
Definition: shtypes.idl:85
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_INT
Definition: shtypes.idl:122
@ SHCOLSTATE_TYPE_DATE
Definition: shtypes.idl:123
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_SLOW
Definition: shtypes.idl:126
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
IContextMenuCB * pcmcb
Definition: shlobj.h:2535
IShellFolder * psf
Definition: shlobj.h:2537
IUnknown * punkAssociationInfo
Definition: shlobj.h:2540
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2539
const HKEY * aKeys
Definition: shlobj.h:2542
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2536
base of all file and directory entries
Definition: entries.h:83
WCHAR wszName[1]
Definition: shlfolder.c:1555
STRRET str
Definition: shtypes.idl:108
HMENU hmenu
Definition: shlobj.h:1381
UINT idCmdLast
Definition: shlobj.h:1384
UINT idCmdFirst
Definition: shlobj.h:1383
UINT indexMenu
Definition: shlobj.h:1382
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
WORD colstate
Definition: shfldr.h:31
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define ILGDN_FORPARSING
Definition: undocshell.h:70
DWORD dwAttributes
Definition: vdmdbg.h:34
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpName
Definition: winbase.h:2789
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define E_ACCESSDENIED
Definition: winerror.h:2849
#define ERROR_NO_MORE_FILES
Definition: winerror.h:121
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define E_POINTER
Definition: winerror.h:2365
#define ERROR_BAD_DEVICE
Definition: winerror.h:703
#define CLR_INVALID
Definition: wingdi.h:883
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define IMAGE_BITMAP
Definition: winuser.h:211
UINT WINAPI PrivateExtractIconsW(_In_reads_(MAX_PATH) LPCWSTR szFileName, _In_ int nIconIndex, _In_ int cxIcon, _In_ int cyIcon, _Out_writes_opt_(nIcons) HICON *phicon, _Out_writes_opt_(nIcons) UINT *piconid, _In_ UINT nIcons, _In_ UINT flags)
#define LR_CREATEDIBSECTION
Definition: winuser.h:1098
HANDLE WINAPI CopyImage(_In_ HANDLE, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:2018
#define wsprintf
Definition: winuser.h:5865
#define MFS_ENABLED
Definition: winuser.h:750
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:746
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
_In_ PSTRING FullName
Definition: rtlfuncs.h:1648
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185