ReactOS 0.4.17-dev-470-gf9e3448
folder.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CabView Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Shell folder implementation
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#include "cabview.h"
9#include "util.h"
10
12{
13 COL_NAME, // PKEY_ItemNameDisplay
14 COL_SIZE, // PKEY_Size
15 COL_TYPE, // PKEY_ItemTypeText
16 COL_MDATE, // PKEY_DateModified
17 COL_PATH, // PKEY_?: Archive-relative path
18 COL_ATT, // PKEY_FileAttributes
20};
21
22static const struct FOLDERCOLUMN
23{
28 const GUID *pkg;
30} g_Columns[] =
31{
38};
39
40#include <pshpack1.h>
41struct CABITEM
42{
44 WORD Unknown; // Not sure what Windows uses this for, we always store 0
46 WORD Date, Time; // DOS
50
51#if FLATFOLDER
52 inline bool IsFolder() const { return false; }
53#else
54 inline BOOL IsFolder() const { return Attrib & FILE_ATTRIBUTE_DIRECTORY; }
55#endif
58 WORD GetFSAttributes() const { return Attrib & FSATTS; }
59 LPCWSTR GetName() const { return Path + NameOffset; }
60
61 template<class PIDL> static CABITEM* Validate(PIDL pidl)
62 {
63 CABITEM *p = (CABITEM*)pidl;
64 return p && p->cb > FIELD_OFFSET(CABITEM, Path[1]) && p->Unknown == 0 ? p : NULL;
65 }
66};
67#include <poppack.h>
68
69static CABITEM* CreateItem(LPCWSTR Path, UINT Attrib, UINT Size, UINT DateTime)
70{
72 if (cb > 0xffff)
73 return NULL;
74 CABITEM *p = (CABITEM*)SHAlloc(cb + sizeof(USHORT));
75 if (p)
76 {
77 p->cb = (USHORT)cb;
78 p->Unknown = 0;
79 p->Size = Size;
80 p->Attrib = Attrib;
81 p->Date = HIWORD(DateTime);
82 p->Time = LOWORD(DateTime);
83 p->NameOffset = 0;
84 for (UINT i = 0;; ++i)
85 {
86 WCHAR c = Path[i];
87 if (c == L':') // Don't allow absolute paths
88 c = L'_';
89 if (c == L'/') // Normalize
90 c = L'\\';
91 if (c == '\\')
92 p->NameOffset = i + 1;
93 p->Path[i] = c;
94 if (!c)
95 break;
96 }
97 ((SHITEMID*)((BYTE*)p + cb))->cb = 0;
98 }
99 return p;
100}
101
102static CABITEM* CreateItem(LPCSTR Path, UINT Attrib, UINT Size = 0, UINT DateTime = 0)
103{
104 WCHAR buf[MAX_PATH * 2];
105 UINT codepage = (Attrib & _A_NAME_IS_UTF) ? CP_UTF8 : CP_ACP;
107 return CreateItem(buf, Attrib, Size, DateTime);
108 return NULL;
109}
110
113{
114 enum { IDC_EXTRACT, IDC_EXTRACTALL };
116 const BOOL Background = !pdtobj;
117
118 switch (uMsg)
119 {
121 {
122 *((UINT*)lParam) = wParam | CMF_NOVERBS | (Background ? 0 : CMF_VERBSONLY);
123 return S_OK;
124 }
125
127 {
128 QCMINFO &qcmi = *(QCMINFO*)lParam;
129 UINT pos = qcmi.indexMenu, id = 0;
130 if (Background || SUCCEEDED(hr = InsertMenuItem(qcmi, pos, id, IDC_EXTRACT, IDS_EXTRACT, MFS_DEFAULT)))
131 {
132 hr = InsertMenuItem(qcmi, pos, id, IDC_EXTRACTALL, IDS_EXTRACTALL);
133 if (SUCCEEDED(hr) && !Background)
134 {
135 --pos;
136 InsertMenuItem(qcmi, pos, id, 0, -1); // Separator
137 }
138 }
139 if (SUCCEEDED(hr))
140 {
141 qcmi.idCmdFirst = id + 1;
142 hr = S_FALSE; // Don't add verbs
143 }
144 break;
145 }
146
148 {
149 hr = S_FALSE;
150 CCabFolder *pCabFolder = static_cast<CCabFolder*>(psf);
151 switch (wParam)
152 {
153 case IDC_EXTRACT:
154 case IDC_EXTRACTALL:
155 hr = pCabFolder->ExtractFilesUI(hwnd, wParam == IDC_EXTRACT ? pdtobj : NULL);
156 break;
157 }
158 break;
159 }
160 }
161 return hr;
162}
163
165 IDataObject *pdtobj, UINT uMsg,
167{
168 return ItemMenuCallback(psf, hwnd, NULL, uMsg, wParam, lParam);
169}
170
172{
173 CABITEM *needle = (CABITEM*)pidl;
174 for (ULONG i = 0, c = GetCount(); i < c; ++i)
175 {
177 if (!lstrcmpiW(needle->Path, item->Path))
178 return i;
179 }
180 return -1;
181}
182
184{
187};
188
190{
192
193 switch ((UINT)msg)
194 {
195 case ECM_FILE:
196 {
197 const FDINOTIFICATION &fdin = *ecd.pfdin;
200 if (IncludeInEnumIDList(data.ContF, attr))
201 {
202 UINT datetime = MAKELONG(fdin.time, fdin.date);
203 CABITEM *item = CreateItem(fdin.psz1, fdin.attribs, fdin.cb, datetime);
204 if (!item)
205 return E_OUTOFMEMORY;
206 if (FAILED(hr = data.pEIDL->Append((LPCITEMIDLIST)item)))
207 SHFree(item);
208 }
209 return SUCCEEDED(hr) ? S_FALSE : hr; // Never extract
210 }
211 }
212 return E_NOTIMPL;
213}
214
216{
218 if (SHGetPathFromIDListW(pidl, path))
221}
222
224{
225 FILLCALLBACKDATA data = { this, contf };
226 return Enumerate(pidl, NULL, EnumFillCallback, &data);
227}
228
230{
231 if (pSort)
232 *pSort = COL_NAME;
233 if (pDisplay)
234 *pDisplay = COL_NAME;
235 return S_OK;
236}
237
239{
240 if (!pcsFlags || iColumn >= _countof(g_Columns))
241 return E_INVALIDARG;
242 *pcsFlags = g_Columns[iColumn].ColFlags;
243 return S_OK;
244}
245
247{
249 if (!item || !pName)
250 return E_INVALIDARG;
251
253 {
255 return StrTo(FLATFOLDER ? item->Path : item->GetName(), *pName);
256
259 return E_FAIL;
260 UINT cch = lstrlenW(parent) + 1 + lstrlenW(item->Path) + 1;
261 pName->uType = STRRET_WSTR;
262 pName->pOleStr = (LPWSTR)SHAlloc(cch * sizeof(WCHAR));
263 if (!pName->pOleStr)
264 return E_OUTOFMEMORY;
265 lstrcpyW(pName->pOleStr, parent);
266 PathAppendW(pName->pOleStr, item->Path);
267 return S_OK;
268 }
269
270 SHFILEINFO fi;
271 DWORD attr = item->IsFolder() ? FILE_ATTRIBUTE_DIRECTORY : 0;
273 if (SHGetFileInfo(item->GetName(), attr, &fi, sizeof(fi), flags))
274 return StrTo(fi.szDisplayName, *pName);
275 return StrTo(item->GetName(), *pName);
276}
277
279{
280 HRESULT hr = E_FAIL;
281 STRRET *psr = &psd->str, srvar;
283 if (!item)
284 return E_INVALIDARG;
285
286 switch (iColumn)
287 {
288 case COL_NAME:
289 {
290 hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, pv ? &srvar : psr);
291 return SUCCEEDED(hr) && pv ? StrRetToVariantBSTR(&srvar, *pv) : hr;
292 }
293
294 case COL_SIZE:
295 {
296 UINT data = item->Size;
297 if (pv)
298 {
299 V_VT(pv) = VT_UI4;
300 V_UI4(pv) = data;
301 }
302 else
303 {
304 psr->uType = STRRET_CSTR;
306 }
307 return S_OK;
308 }
309
310 case COL_TYPE:
311 {
312 SHFILEINFO fi;
314 DWORD attr = item->GetFSAttributes();
316 if (SHGetFileInfo(item->GetName(), attr, &fi, sizeof(fi), flags))
317 return pv ? StrTo(data, *pv) : StrTo(data, *psr);
318 break;
319 }
320
321 case COL_MDATE:
322 {
323 if (pv)
324 {
325 if (DosDateTimeToVariantTime(item->Date, item->Time, &V_DATE(pv)))
326 {
327 V_VT(pv) = VT_DATE;
328 return S_OK;
329 }
330 }
331 else
332 {
333 FILETIME utc, loc;
334 if (DosDateTimeToFileTime(item->Date, item->Time, &utc) && FileTimeToLocalFileTime(&utc, &loc))
335 {
336 psr->uType = STRRET_CSTR;
337 if (SHFormatDateTimeA(&loc, NULL, psr->cStr, _countof(psr->cStr)))
338 {
339 return S_OK;
340 }
341 }
342 }
343 break;
344 }
345
346 case COL_PATH:
347 {
348 UINT len = item->NameOffset ? item->NameOffset - 1 : 0;
349 return pv ? StrTo(item->Path, len, *pv) : StrTo(item->Path, len, *psr);
350 }
351
352 case COL_ATT:
353 {
354 UINT data = item->GetFSAttributes();
355 if (pv)
356 {
357 V_VT(pv) = VT_UI4;
358 V_UI4(pv) = data;
359 }
360 else
361 {
362 UINT i = 0;
363 psr->uType = STRRET_CSTR;
364 if (data & FILE_ATTRIBUTE_READONLY) psr->cStr[i++] = 'R';
365 if (data & FILE_ATTRIBUTE_HIDDEN) psr->cStr[i++] = 'H';
366 if (data & FILE_ATTRIBUTE_SYSTEM) psr->cStr[i++] = 'S';
367 if (data & FILE_ATTRIBUTE_ARCHIVE) psr->cStr[i++] = 'A';
368 psr->cStr[i++] = '\0';
369 }
370 return S_OK;
371 }
372 }
373 return hr;
374}
375
377{
378 if (!pscid || !pv)
379 return E_INVALIDARG;
380
381 CABITEM *item;
382 int col = MapSCIDToColumn(*pscid);
383 if (col >= 0)
384 {
385 return GetItemDetails(pidl, col, NULL, pv);
386 }
387 else if ((item = CABITEM::Validate(pidl)) == NULL)
388 {
389 return E_INVALIDARG;
390 }
391 else if (IsEqual(*pscid, FMTID_ShellDetails, PID_FINDDATA))
392 {
393 WIN32_FIND_DATA wfd;
394 ZeroMemory(&wfd, sizeof(wfd));
395 wfd.dwFileAttributes = item->GetFSAttributes();
396 wfd.nFileSizeLow = item->Size;
397 DosDateTimeToFileTime(item->Date, item->Time, &wfd.ftLastWriteTime);
398 lstrcpyn(wfd.cFileName, item->GetName(), MAX_PATH);
399 return InitVariantFromBuffer(&wfd, sizeof(wfd), pv);
400 }
401 return E_FAIL;
402}
403
405{
406 if (!psd || iColumn >= _countof(g_Columns))
407 {
408 return E_INVALIDARG;
409 }
410 else if (!pidl)
411 {
412 psd->fmt = g_Columns[iColumn].LvcFmt;
413 psd->cxChar = g_Columns[iColumn].LvcChars;
415 if (LoadStringW(_AtlBaseModule.GetResourceInstance(), g_Columns[iColumn].TextId, buf, _countof(buf)))
416 return StrTo(buf, psd->str);
417 return E_FAIL;
418 }
419 return GetItemDetails(pidl, iColumn, psd, NULL);
420}
421
423{
424 for (UINT i = 0; i < _countof(g_Columns); ++i)
425 {
426 if (g_Columns[i].pkg && IsEqual(scid, *g_Columns[i].pkg, g_Columns[i].pki))
427 return i;
428 }
429 return -1;
430}
431
433{
435 {
436 pscid->fmtid = *g_Columns[column].pkg;
437 pscid->pid = g_Columns[column].pki;
438 return S_OK;
439 }
440 return E_FAIL;
441}
442
444{
445 LPOLESTR pszName;
447};
448
450{
452
453 switch ((UINT)msg)
454 {
455 case ECM_FILE:
456 {
457 const FDINOTIFICATION &fdin = *ecd.pfdin;
459 UINT datetime = MAKELONG(fdin.time, fdin.date);
460 CABITEM *item = CreateItem(fdin.psz1, fdin.attribs, fdin.cb, datetime);
461 if (!item)
462 return E_OUTOFMEMORY;
463 if (!lstrcmpiW(item->Path, data.pszName))
464 data.pItem = item;
465 else
466 SHFree(item);
467 return SUCCEEDED(hr) ? S_FALSE : hr; // Never extract
468 }
469 }
470 return E_NOTIMPL;
471}
472
473IFACEMETHODIMP CCabFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
474{
475 *ppidl = NULL;
476 if (pchEaten)
477 *pchEaten = 0;
478
479 HRESULT hr;
480 PDNCALLBACKDATA data = { lpszDisplayName, NULL };
482 return hr;
483 if (!data.pItem)
485
486 *ppidl = (PIDLIST_RELATIVE)data.pItem;
487 if (pchEaten)
488 *pchEaten = lstrlenW(lpszDisplayName);
489 if (pdwAttributes)
490 GetAttributesOf(1, ppidl, (SFGAOF*)pdwAttributes);
491 return S_OK;
492}
493
494IFACEMETHODIMP CCabFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
495{
497 *ppEnumIDList = static_cast<LPENUMIDLIST>(p);
498 return p ? p->Fill(m_CurDir, hwndOwner, dwFlags) : E_OUTOFMEMORY;
499}
500
502{
503 static_assert(FLATFOLDER, "Support Bind if we display the archive as a tree");
505 return E_NOTIMPL;
506}
507
509{
510 CABITEM *p1 = (CABITEM*)pidl1, *p2 = (CABITEM*)pidl2;
511 HRESULT hr = S_OK;
512 int ret = 0;
513
515 {
516 ret = lstrcmpiW(p1->Path, p2->Path);
517 if (ret && (lParam & SHCIDS_ALLFIELDS))
518 {
519 for (UINT i = 0; ret && SUCCEEDED(hr) && i < COLCOUNT; ++i)
520 {
521 hr = (i == COL_NAME) ? 0 : CompareID(i, pidl1, pidl2);
523 }
524 }
525 }
526 else
527 {
528 UINT col = lParam & SHCIDS_COLUMNMASK;
529 switch (col)
530 {
531 case COL_NAME:
532 ret = StrCmpLogicalW(p1->GetName(), p2->GetName());
533 break;
534
535 case COL_SIZE:
536 ret = p1->Size - p2->Size;
537 break;
538
539 case COL_MDATE:
540 ret = MAKELONG(p1->Time, p1->Date) - MAKELONG(p2->Time, p2->Date);
541 break;
542
543 default:
544 {
545 if (col < COLCOUNT)
546 {
547 PWSTR str1, str2;
548 if (SUCCEEDED(hr = ::GetDetailsOf(*this, pidl1, col, str1)))
549 {
550 if (SUCCEEDED(hr = ::GetDetailsOf(*this, pidl2, col, str2)))
551 {
553 SHFree(str2);
554 }
555 SHFree(str1);
556 }
557 }
558 else
559 {
561 }
562 }
563 }
564 }
566}
567
569{
571 if (!pidl1 || !ILIsSingle(pidl1) || !pidl2 || !ILIsSingle(pidl2))
572 return E_UNEXPECTED;
573
574 return CompareID(lParam, pidl1, pidl2);
575}
576
578{
579 if (riid == IID_IShellView)
580 {
581 SFV_CREATE sfvc = { sizeof(SFV_CREATE), static_cast<IShellFolder*>(this) };
582 return SHCreateShellFolderView(&sfvc, (IShellView**)ppv);
583 }
584 if (riid == IID_IContextMenu)
585 {
587 IContextMenu **ppCM = (IContextMenu**)ppv;
588 return CDefFolderMenu_Create2(m_CurDir, hwndOwner, 0, NULL, this, func, 0, NULL, ppCM);
589 }
590 return E_NOINTERFACE;
591}
592
594{
595 if (!cidl)
596 {
597 const SFGAOF ThisFolder = (SFGAO_FOLDER | SFGAO_BROWSABLE | SFGAO_CANLINK);
598 *rgfInOut = *rgfInOut & ThisFolder;
599 return S_OK;
600 }
601 else if (!apidl)
602 {
603 return E_INVALIDARG;
604 }
605 HRESULT hr = S_OK;
606 const SFGAOF impliedmask = SFGAO_ISSLOW | SFGAO_CANCOPY;
607 const SFGAOF filemask = SFGAO_READONLY | SFGAO_HIDDEN | SFGAO_SYSTEM | impliedmask;
608 SFGAOF remain = *rgfInOut & filemask, validate = *rgfInOut & SFGAO_VALIDATE;
609 CComPtr<CEnumIDList> list;
610 for (UINT i = 0; i < cidl && (remain || validate); ++i)
611 {
612 CABITEM *item = CABITEM::Validate(apidl[i]);
613 if (!item)
614 {
616 break;
617 }
618 else if (validate)
619 {
621 return hr;
622 if (list->FindNamedItem((PCUITEMID_CHILD)item) == -1)
624 }
625 SFGAOF att = MapFSToSFAttributes(item->GetFSAttributes()) | impliedmask;
626 remain &= att & ~(FLATFOLDER ? SFGAO_FOLDER : 0);
627 }
628 *rgfInOut = remain;
629 return hr;
630}
631
633{
635 if (riid == IID_IExtractIconA || riid == IID_IExtractIconW)
636 {
637 if (cidl != 1)
638 return E_INVALIDARG;
639 CABITEM *item = CABITEM::Validate(apidl[0]);
640 if (!item)
641 return E_INVALIDARG;
642
643 DWORD attr = item->GetFSAttributes();
644 return SHCreateFileExtractIconW(item->GetName(), attr, riid, ppvOut);
645 }
646 else if (riid == IID_IContextMenu && cidl)
647 {
649 IContextMenu **ppCM = (IContextMenu**)ppvOut;
650 return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, func, 0, NULL, ppCM);
651 }
652 else if (riid == IID_IDataObject && cidl)
653 {
654 // Note: This IDataObject is only compatible with IContextMenu, it cannot handle drag&drop of virtual items!
655 return CIDLData_CreateFromIDArray(m_CurDir, cidl, apidl, (IDataObject**)ppvOut);
656 }
657 return hr;
658}
659
661{
662 switch (uMsg)
663 {
666 return S_OK;
669 return S_OK;
670 }
671 return E_NOTIMPL;
672}
673
675{
676 if (CABITEM *item = CABITEM::Validate(pidl))
677 {
678 int index = MapPIDLToSystemImageListIndex(this, pidl, flags);
679 if (index == -1 && item->IsFolder())
680 index = (flags & GIL_OPENICON) ? SIID_FOLDEROPEN : SIID_FOLDER;
681 if (index != -1)
682 {
683 *pIconIndex = index;
684 return S_OK;
685 }
686 }
687 return S_FALSE;
688}
689
691{
692 BOOL ret = SHGetPathFromIDListW(pidl, pszPath);
693 if (!ret && ILIsEmpty(pidl))
696}
697
699{
701 switch (uMsg)
702 {
703 case BFFM_INITIALIZED:
704 {
705 if (LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_EXTRACT, buf, _countof(buf)))
706 {
707 // Remove leading and trailing dots
708 WCHAR *s = buf, *e = s + lstrlenW(s);
709 while (*s == '.') ++s;
710 while (e > s && e[-1] == '.') *--e = UNICODE_NULL;
713 }
714 if (lpData)
715 {
718 }
719 break;
720 }
721
722 case BFFM_SELCHANGED:
723 {
724 SFGAOF wanted = SFGAO_FILESYSTEM | SFGAO_FOLDER, query = wanted | SFGAO_STREAM;
726 BOOL enable = ILIsEmpty(pidl); // Allow the desktop
728 IShellFolder *pSF;
730 {
731 SFGAOF attrib = query;
732 if (SUCCEEDED(pSF->GetAttributesOf(1, &child, &attrib)))
733 enable = (attrib & query) == wanted;
734 pSF->Release();
735 }
736 if (enable)
737 {
738 // We don't trust .zip folders, check the file-system to make sure
741 }
743 break;
744 }
745 }
746 return 0;
747}
748
750{
754 STGMEDIUM cidamedium;
757 IProgressDialog *pPD;
760};
761
763{
764 HWND hWnd;
766 return hWnd;
767 return IsWindowVisible(data.hWndOwner) ? data.hWndOwner : NULL;
768}
769
771{
773 switch ((UINT)msg)
774 {
775 case ECM_BEGIN:
776 {
777 data.cabfiles = (UINT)(SIZE_T)ecd.pfdin->hf;
778 return S_OK;
779 }
780
781 case ECM_FILE:
782 {
783 if (data.pPD && data.pPD->HasUserCancelled())
785 HRESULT hr = data.pCIDA ? S_FALSE : S_OK; // Filtering or all items?
786 if (hr != S_OK)
787 {
788 CABITEM *needle = CreateItem(ecd.pfdin->psz1, ecd.pfdin->attribs);
789 if (!needle)
790 return E_OUTOFMEMORY;
791 for (UINT i = 0; i < data.pCIDA->cidl && hr == S_FALSE; ++i)
792 {
794 LPCITEMIDLIST pidlChild = ILFindLastID(HIDA_GetPIDLItem(data.pCIDA, i));
795 CABITEM *haystack = CABITEM::Validate(pidlChild);
797 break;
798 if (!lstrcmpiW(needle->Path, haystack->Path))
799 {
800 if (data.pPD)
801 data.pPD->SetLine(1, needle->Path, TRUE, NULL);
802 hr = S_OK; // Found it in the list of files to extract
803 }
804 }
805 SHFree(needle);
806 }
807 if (data.pPD)
808 data.pPD->SetProgress(data.completed++, data.cabfiles);
809 return hr;
810 }
811
812 case ECM_PREPAREPATH:
813 {
816 }
817
818 case ECM_ERROR:
819 {
820 return ErrorBox(GetUiOwner(data), ecd.hr);
821 }
822 }
823 return E_NOTIMPL;
824}
825
827{
828 if (data.pPD)
829 {
830 data.pPD->StopProgressDialog();
831 data.pPD->Release();
832 }
833 CDataObjectHIDA::DestroyCIDA(data.pCIDA, data.cidamedium);
834 IUnknown_Set((IUnknown**)&data.pDO, NULL);
835 IUnknown_Set((IUnknown**)&data.pMarshalDO, NULL);
836 IUnknown_Set((IUnknown**)&data.pLifetimeCF, NULL);
837 SHFree(&data);
838}
839
841{
843 HRESULT hr = S_OK;
844 if (SUCCEEDED(SHCoCreateInstance(NULL, &CLSID_ProgressDialog, NULL, IID_PPV_ARG(IProgressDialog, &data.pPD))))
845 {
846 // TODO: IActionProgress SPACTION_COPYING
847 if (SUCCEEDED(data.pPD->StartProgressDialog(data.hWndOwner, NULL, PROGDLG_NOTIME, NULL)))
848 {
849 data.pPD->SetTitle(data.cab);
850 data.pPD->SetLine(2, data.path, TRUE, NULL);
851 data.pPD->SetAnimation(GetModuleHandleW(L"SHELL32"), 161);
852 data.pPD->SetProgress(0, 0);
853 }
854 }
855 if (data.pMarshalDO)
856 {
858 data.pMarshalDO = NULL;
859 if (SUCCEEDED(hr))
860 hr = CDataObjectHIDA::CreateCIDA(data.pDO, &data.pCIDA, data.cidamedium);
861 }
862 if (SUCCEEDED(hr))
863 {
865 }
866 Free(data);
867 return 0;
868}
869
871{
874
876 if (!pData)
877 return E_OUTOFMEMORY;
878 ZeroMemory(pData, sizeof(*pData));
879 pData->hWndOwner = hWnd;
880 pData->pLifetimeCF = this;
881 pData->pLifetimeCF->AddRef();
882
884 if (SUCCEEDED(hr) && pDO)
885 {
887 }
888 if (SUCCEEDED(hr))
889 {
891 LPITEMIDLIST pidlInitial = ILClone(m_CurDir);
892 ILRemoveLastID(pidlInitial); // Remove the "name.cab" part (we can't extract into ourselves)
894 BROWSEINFO bi = { hWnd, NULL, NULL, pData->cab, bif, FolderBrowseCallback, (LPARAM)pidlInitial };
896 {
898 ILFree(folder);
899 if (SUCCEEDED(hr))
900 {
903 }
904 }
905 ILFree(pidlInitial);
906 }
907 if (hr != S_OK)
908 Free(*pData);
910}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4824
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
EXTERN_C HRESULT WINAPI SHCreateFileExtractIconW(_In_ LPCWSTR pszFile, _In_ DWORD dwFileAttributes, _In_ REFIID riid, _Outptr_ void **ppv)
#define SHCIDS_ALLFIELDS
Definition: CFontExt.cpp:14
#define SFVM_WINDOWCLOSING
PRTL_UNICODE_STRING_BUFFER Path
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define IDS_COL_TYPE
Definition: resource.h:9
#define index(s, c)
Definition: various.h:29
BOOL(CALLBACK * EXTRACTCALLBACK)(const EXTRACTCALLBACKINFO &Info, void *Cookie)
Definition: misc.h:78
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brfolder.cpp:1460
HRESULT ExtractCabinet(LPCWSTR cab, LPCWSTR destination, EXTRACTCALLBACK callback, LPVOID cookie)
Definition: extract.cpp:189
EXTERN_C const GUID CLSID_CabFolder
Definition: cabview.h:14
#define FLATFOLDER
Definition: cabview.h:12
EXTRACTCALLBACKMSG
Definition: cabview.h:16
@ ECM_ERROR
Definition: cabview.h:16
@ ECM_BEGIN
Definition: cabview.h:16
@ ECM_FILE
Definition: cabview.h:16
@ ECM_PREPAREPATH
Definition: cabview.h:16
IFACEMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: folder.cpp:568
HRESULT CompareID(LPARAM lParam, PCUITEMID_CHILD pidl1, PCUITEMID_CHILD pidl2)
Definition: folder.cpp:508
int MapSCIDToColumn(const SHCOLUMNID &scid)
Definition: folder.cpp:422
IFACEMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: folder.cpp:229
IFACEMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: folder.cpp:404
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: cabview.h:126
IFACEMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override
Definition: folder.cpp:660
IFACEMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: folder.cpp:473
IFACEMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) override
Definition: folder.cpp:238
IFACEMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: folder.cpp:432
IFACEMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName) override
Definition: folder.cpp:246
HRESULT GetItemDetails(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd, VARIANT *pv)
Definition: folder.cpp:278
HRESULT CreateEnum(CEnumIDList **List)
Definition: cabview.h:135
HWND m_ShellViewWindow
Definition: cabview.h:127
IFACEMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: folder.cpp:577
IFACEMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: folder.cpp:632
IFACEMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: folder.cpp:494
IFACEMETHODIMP GetIconOf(PCUITEMID_CHILD pidl, UINT flags, int *pIconIndex) override
Definition: folder.cpp:674
IFACEMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: folder.cpp:501
HRESULT ExtractFilesUI(HWND hWnd, IDataObject *pDO)
Definition: folder.cpp:870
IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: folder.cpp:376
IFACEMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) override
Definition: folder.cpp:593
static HRESULT Enumerate(PCIDLIST_ABSOLUTE pidl, HWND hwnd, EXTRACTCALLBACK Callback, LPVOID cookie)
Definition: folder.cpp:215
static CEnumIDList * CreateInstance()
Definition: cabview.h:103
HRESULT Fill(PCIDLIST_ABSOLUTE pidl, HWND hwnd=NULL, SHCONTF contf=0)
Definition: folder.cpp:223
UINT GetCount() const
Definition: cabview.h:61
HDPA m_Items
Definition: cabview.h:31
int FindNamedItem(PCUITEMID_CHILD pidl) const
Definition: folder.cpp:171
Definition: list.h:37
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#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
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
EXTERN_C INT WINAPI SHFormatDateTimeA(const FILETIME UNALIGNED *fileTime, DWORD *flags, LPSTR buf, UINT size)
Definition: ordinal.c:4732
#define SFGAO_SYSTEM
Definition: shobjidl.idl:198
#define SIID_FOLDEROPEN
Definition: precomp.h:31
#define SIID_FOLDER
Definition: precomp.h:30
#define IDS_EXTRACT
Definition: resource.h:24
#define IDS_EXTRACTALL
Definition: resource.h:25
#define IDS_COL_MDATE
Definition: resource.h:20
#define IDS_COL_NAME
Definition: resource.h:17
#define IDS_COL_ATT
Definition: resource.h:22
#define IDS_COL_SIZE
Definition: resource.h:18
#define IDS_COL_PATH
Definition: resource.h:21
bool IncludeInEnumIDList(SHCONTF contf, SFGAOF att)
Definition: util.h:131
HRESULT StrTo(LPCWSTR str, UINT len, STRRET &sr)
Definition: util.h:49
SFGAOF MapFSToSFAttributes(UINT att)
Definition: util.h:124
HRESULT StrRetToVariantBSTR(STRRET *psr, VARIANT &v)
Definition: util.h:80
int MapPIDLToSystemImageListIndex(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT GilFlags=0)
Definition: util.h:150
HRESULT InitVariantFromBuffer(const void *buffer, UINT cb, VARIANT *pv)
Definition: util.h:26
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, IUnknown *unk, IStream **stream)
Definition: marshal.c:154
HRESULT WINAPI CoGetInterfaceAndReleaseStream(IStream *stream, REFIID riid, void **obj)
Definition: marshal.c:139
#define CP_ACP
Definition: compat.h:109
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_DATE
Definition: compat.h:2302
@ VT_UI4
Definition: compat.h:2313
#define lstrlenW
Definition: compat.h:750
static DOUBLE utc(DOUBLE time, DateInstance *date)
Definition: date.c:315
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:636
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:216
BOOL WINAPI DosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime)
Definition: time.c:75
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
int WINAPI StrCmpLogicalW(const WCHAR *str, const WCHAR *comp)
Definition: string.c:1333
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE thread_proc, void *data, DWORD flags, LPTHREAD_START_ROUTINE callback)
Definition: main.c:1628
void WINAPI IUnknown_Set(IUnknown **dest, IUnknown *src)
Definition: main.c:209
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: shellole.c:197
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3219
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:988
LPSTR WINAPI StrFormatByteSizeA(DWORD dwBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:1025
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
r parent
Definition: btrfs.c:3010
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
@ IsEqual
Definition: fatprocs.h:1887
#define _A_NAME_IS_UTF
Definition: fci.h:131
static FRESULT validate(void *obj)
Definition: ff.c:2372
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
static HWND GetUiOwner(const EXTRACTFILESDATA &data)
Definition: folder.cpp:762
static HRESULT CALLBACK ItemMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: folder.cpp:111
static CABITEM * CreateItem(LPCWSTR Path, UINT Attrib, UINT Size, UINT DateTime)
Definition: folder.cpp:69
FOLDERCOLUMNS
Definition: folder.cpp:12
@ COL_NAME
Definition: folder.cpp:13
@ COLCOUNT
Definition: folder.cpp:19
@ COL_ATT
Definition: folder.cpp:18
@ COL_MDATE
Definition: folder.cpp:16
@ COL_TYPE
Definition: folder.cpp:15
@ COL_SIZE
Definition: folder.cpp:14
@ COL_PATH
Definition: folder.cpp:17
static HRESULT CALLBACK FolderBackgroundMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: folder.cpp:164
static HRESULT CALLBACK EnumFillCallback(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &ecd, LPVOID cookie)
Definition: folder.cpp:189
static const struct FOLDERCOLUMN g_Columns[]
static int CALLBACK FolderBrowseCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
Definition: folder.cpp:698
static HRESULT GetFsPathFromIDList(PCIDLIST_ABSOLUTE pidl, PWSTR pszPath)
Definition: folder.cpp:690
static HRESULT CALLBACK ParseDisplayNameCallback(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &ecd, LPVOID cookie)
Definition: folder.cpp:449
static DWORD CALLBACK ExtractFilesThread(LPVOID pParam)
Definition: folder.cpp:840
static HRESULT CALLBACK ExtractFilesCallback(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &ecd, LPVOID cookie)
Definition: folder.cpp:770
static UINT ErrorBox(UINT Error=GetLastError())
Definition: geninst.cpp:198
GLdouble s
Definition: gl.h:2039
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
const GLubyte * c
Definition: glext.h:8905
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLboolean enable
Definition: glext.h:11120
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
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
ULONG SFGAOF
Definition: shobjidl.idl:222
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
ULONG Release()
nsrefcnt AddRef()
#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
#define e
Definition: ke_i.h:82
#define c
Definition: ke_i.h:80
if(dx< 0)
Definition: linetemp.h:194
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static LPSTR pName
Definition: security.c:86
static const char haystack[]
Definition: editor.c:190
static SHCONTF
Definition: ordinal.c:61
static HWND child
Definition: cursoricon.c:298
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define IFACEMETHODIMP
Definition: ntbasedef.h:157
#define UNICODE_NULL
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_WRITETIME
Definition: ntquery.h:60
#define PID_STG_SIZE
Definition: ntquery.h:58
#define PID_STG_ATTRIBUTES
Definition: ntquery.h:59
#define PID_STG_NAME
Definition: ntquery.h:56
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define V_VT(A)
Definition: oleauto.h:211
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DATE(A)
Definition: oleauto.h:231
const GUID IID_IDataObject
#define PathAppendW
Definition: pathcch.h:310
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
unsigned short USHORT
Definition: pedump.c:61
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:222
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1504
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
#define DPA_FastGetPtr(hdpa, i)
Definition: commctrl.h:4977
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define REFIID
Definition: guiddef.h:118
@ CTF_PROCESS_REF
Definition: shlwapi.h:73
@ CTF_COINIT
Definition: shlwapi.h:75
@ CTF_THREAD_REF
Definition: shlwapi.h:72
@ CTF_FREELIBANDEXIT
Definition: shlwapi.h:77
#define list
Definition: rosglue.h:35
#define CP_UTF8
Definition: nls.h:20
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
Definition: parser.h:35
XML_HIDDEN void xmlParserErrors const char const xmlChar * str1
Definition: parser.h:35
#define LoadStringW
Definition: utils.h:64
#define SHGetFileInfo
Definition: shellapi.h:750
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:166
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
HRESULT WINAPI CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder, UINT cpidlFiles, PCUIDLIST_RELATIVE_ARRAY lppidlFiles, LPDATAOBJECT *ppdataObject)
Definition: shellord.c:2436
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:721
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:686
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:711
EXTERN_C HRESULT WINAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *modless, LPCWSTR path, DWORD flags)
Definition: shlfileop.cpp:2364
#define PID_FINDDATA
Definition: shlguid.h:169
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2205
#define BFFM_SELCHANGED
Definition: shlobj.h:1253
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1233
#define PROGDLG_NOTIME
Definition: shlobj.h:983
#define SFVM_WINDOWCREATED
Definition: shlobj.h:1324
#define BFFM_SETEXPANDED
Definition: shlobj.h:1265
#define BFFM_ENABLEOK
Definition: shlobj.h:1260
#define SHPPFW_IGNOREFILENAME
Definition: shlobj.h:341
#define BFFM_SETSELECTION
Definition: shlobj.h:1272
#define BROWSEINFO
Definition: shlobj.h:1226
#define BIF_USENEWUI
Definition: shlobj.h:1240
#define SHPPFW_DIRCREATE
Definition: shlobj.h:338
static BOOL ILIsEmpty(_In_opt_ PCUIDLIST_RELATIVE pidl)
Definition: shlobj.h:2536
#define BFFM_INITIALIZED
Definition: shlobj.h:1252
#define DFM_MODIFYQCMFLAGS
Definition: shlobj.h:2622
struct _SFV_CREATE SFV_CREATE
HRESULT(CALLBACK * LPFNDFMCALLBACK)(_In_opt_ IShellFolder *, _In_opt_ HWND, _In_opt_ IDataObject *, UINT, WPARAM, LPARAM)
Definition: shlobj.h:2585
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 ITEMIDLIST_ABSOLUTE * PCIDLIST_ABSOLUTE
Definition: shtypes.idl:62
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_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
ITEMIDLIST_RELATIVE * PIDLIST_RELATIVE
Definition: shtypes.idl:54
#define _countof(array)
Definition: sndvol32.h:70
LPCWSTR GetName() const
Definition: folder.cpp:59
@ FSATTS
Definition: folder.cpp:56
BOOL IsFolder() const
Definition: folder.cpp:54
WORD Attrib
Definition: folder.cpp:47
UINT Size
Definition: folder.cpp:45
WORD NameOffset
Definition: folder.cpp:48
WORD Date
Definition: folder.cpp:46
WORD cb
Definition: folder.cpp:43
static CABITEM * Validate(PIDL pidl)
Definition: folder.cpp:61
WCHAR Path[ANYSIZE_ARRAY]
Definition: folder.cpp:49
WORD GetFSAttributes() const
Definition: folder.cpp:58
WORD Unknown
Definition: folder.cpp:44
WORD Time
Definition: folder.cpp:46
Definition: shlobj.h:582
const FDINOTIFICATION * pfdin
Definition: cabview.h:20
IDataObject * pDO
Definition: folder.cpp:755
IStream * pMarshalDO
Definition: folder.cpp:756
STGMEDIUM cidamedium
Definition: folder.cpp:754
IProgressDialog * pPD
Definition: folder.cpp:757
CCabFolder * pLifetimeCF
Definition: folder.cpp:751
WCHAR cab[MAX_PATH]
Definition: folder.cpp:759
USHORT time
Definition: fdi.h:236
INT_PTR hf
Definition: fdi.h:233
char * psz1
Definition: fdi.h:228
USHORT date
Definition: fdi.h:235
USHORT attribs
Definition: fdi.h:237
LONG cb
Definition: fdi.h:227
CEnumIDList * pEIDL
Definition: folder.cpp:185
SHCONTF ContF
Definition: folder.cpp:186
BYTE pki
Definition: folder.cpp:29
BYTE LvcChars
Definition: folder.cpp:26
const GUID * pkg
Definition: folder.cpp:28
BYTE ColFlags
Definition: folder.cpp:27
BYTE LvcFmt
Definition: folder.cpp:25
BYTE TextId
Definition: folder.cpp:24
LPOLESTR pszName
Definition: folder.cpp:445
CABITEM * pItem
Definition: folder.cpp:446
STRRET str
Definition: shtypes.idl:108
UINT idCmdFirst
Definition: shlobj.h:1408
UINT indexMenu
Definition: shlobj.h:1407
CHAR szTypeName[80]
Definition: shellapi.h:381
CHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:380
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
Definition: cookie.c:202
Definition: cookie.c:34
Definition: fci.c:116
BSTR path
Definition: filesystem.c:114
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define ANYSIZE_ARRAY
Definition: typedefs.h:46
uint16_t * LPWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
INT WINAPI DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, double *pDateOut)
Definition: variant.c:1211
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458
int codepage
Definition: win_iconv.c:156
#define lstrcpyn
Definition: winbase.h:3596
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_OPEN_FAILED
Definition: winerror.h:306
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define E_UNEXPECTED
Definition: winerror.h:3528
#define HRESULT_CODE(hr)
Definition: winerror.h:188
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define InsertMenuItem
Definition: winuser.h:5970
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:841
#define MFS_DEFAULT
Definition: winuser.h:759
#define WM_SETTEXT
Definition: winuser.h:1645
BOOL WINAPI IsWindowVisible(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:815
#define IID_PPV_ARG(Itype, ppType)
unsigned char BYTE
Definition: xxhash.c:193