ReactOS 0.4.16-dev-550-g2186ce3
CRecycleBin.cpp
Go to the documentation of this file.
1/*
2 * Trash virtual folder support. The trashing engine is implemented in trash.c
3 *
4 * Copyright (C) 2006 Mikolaj Zalewski
5 * Copyright (C) 2009 Andrew Hill
6 * Copyright (C) 2018 Russell Johnson
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include <precomp.h>
24
25#include <mmsystem.h>
26#include <ntquery.h>
27
29
30typedef struct
31{
33 const GUID *fmtId;
36 int fmt;
39
41{
48 /* {"creation time", &FMTID_Storage, PID_STG_CREATETIME, SHCOLSTATE_TYPE_DATE, LVCFMT_LEFT, 20}, */
49 /* {"attribs", &FMTID_Storage, PID_STG_ATTRIBUTES, SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 20}, */
50};
51
52#define COLUMN_NAME 0
53#define COLUMN_DELFROM 1
54#define COLUMN_DATEDEL 2
55#define COLUMN_SIZE 3
56#define COLUMN_TYPE 4
57#define COLUMN_MTIME 5
58
59#define COLUMNS_COUNT 6
60
61// The ROS Recycle Bin PIDL format starts with a NT4/2000 Unicode FS PIDL followed by
62// BBITEMDATA and BBITEMFOOTER. This makes it compatible with SHChangeNotify listeners.
63#include "pshpack1.h"
64#define BBITEMFILETYPE (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FILE_FLAG)
65#define BBITEMFOLDERTYPE (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FOLDER_FLAG)
67{
69#ifdef COLUMN_FATTS
70 WORD AttribsHi; // Nobody needs this yet
71#endif
74 // ... @RecycledPathOffset WCHAR RecycledPath[ANYSIZE_ARRAY];
75};
77{
78 enum { ENDSIG = MAKEWORD('K', 'I') }; // "Killed item". MUST have the low bit set so _ILGetFileStructW returns NULL.
81};
82#include "poppack.h"
83
84static inline BOOL IsFolder(LPCITEMIDLIST pidl)
85{
86 return _ILGetFSType(pidl) & PT_FS_FOLDER_FLAG;
87}
88
90{
91 const UINT minstringsize = sizeof(L"X") + sizeof(""); // PT_FS strings
92 const UINT minfs = sizeof(WORD) + FIELD_OFFSET(PIDLDATA, u.file.szNames) + minstringsize;
93 const UINT mindatasize = FIELD_OFFSET(BBITEMDATA, OriginalLocation) + (sizeof(L"C:\\X") * 2);
94 const UINT minsize = minfs + mindatasize + sizeof(BBITEMFOOTER);
95 const BYTE type = _ILGetType(pidl);
96 if ((type == BBITEMFILETYPE || type == BBITEMFOLDERTYPE) && pidl->mkid.cb >= minsize)
97 {
98 BBITEMFOOTER *pEnd = (BBITEMFOOTER*)((BYTE*)pidl + pidl->mkid.cb - sizeof(BBITEMFOOTER));
99 if (pEnd->EndSignature == BBITEMFOOTER::ENDSIG && pEnd->DataSize >= mindatasize)
100 return (BBITEMDATA*)((BYTE*)pEnd - pEnd->DataSize);
101 }
102 return NULL;
103}
104
105static LPITEMIDLIST CreateItem(LPCWSTR pszTrash, LPCWSTR pszOrig, const DELETED_FILE_INFO &Details)
106{
108 LPCWSTR pszName = PathFindFileNameW(pszTrash);
109 SIZE_T ofsName = (SIZE_T)(pszName - pszTrash);
110 SIZE_T cchName = wcslen(pszName) + 1, cbName = cchName * sizeof(WCHAR);
111 SIZE_T cbFSNames = cbName + sizeof("") + 1; // Empty short name + 1 for WORD alignment
112 SIZE_T cbFS = sizeof(WORD) + FIELD_OFFSET(PIDLDATA, u.file.szNames) + cbFSNames;
113 SIZE_T cchTrash = ofsName + cchName, cbTrash = cchTrash * sizeof(WCHAR);
114 SIZE_T cchOrig = wcslen(pszOrig) + 1, cbOrig = cchOrig * sizeof(WCHAR);
115 SIZE_T cbData = FIELD_OFFSET(BBITEMDATA, OriginalLocation) + cbOrig + cbTrash;
116 SIZE_T cb = cbFS + cbData + sizeof(BBITEMFOOTER);
117 if (cb > 0xffff)
118 return NULL;
119 LPITEMIDLIST pidl = (LPITEMIDLIST)SHAlloc(cb + sizeof(WORD));
120 if (!pidl)
121 return pidl;
122
123 pidl->mkid.cb = cb;
124 pidl->mkid.abID[0] = folder ? BBITEMFOLDERTYPE : BBITEMFILETYPE;
125 ILGetNext(pidl)->mkid.cb = 0; // Terminator
126 FileStruct &fsitem = ((PIDLDATA*)pidl->mkid.abID)->u.file;
127 fsitem.dummy = 0;
128 C_ASSERT(sizeof(RECYCLEBINFILESIZETYPE) <= sizeof(fsitem.dwFileSize));
129 fsitem.dwFileSize = Details.FileSize;
130 fsitem.uFileAttribs = LOWORD(Details.Attributes);
131 FileTimeToDosDateTime(&Details.LastModification, &fsitem.uFileDate, &fsitem.uFileTime);
132 CopyMemory(fsitem.szNames, pszName, cbName);
133 LPSTR pszShort = const_cast<LPSTR>(&fsitem.szNames[cbName]);
134 pszShort[0] = '\0';
135 pszShort[1] = '\0'; // Fill alignment padding (for ILIsEqual memcmp)
136
137 BBITEMFOOTER *footer = (BBITEMFOOTER*)((BYTE*)pidl + cb - sizeof(BBITEMFOOTER));
138 footer->DataSize = cbData;
140
141 BBITEMDATA *data = (BBITEMDATA*)((BYTE*)footer - footer->DataSize);
142 data->DeletionTime = Details.DeletionTime;
143#ifdef COLUMN_FATTS
144 data->AttribsHi = HIWORD(Details.Attributes);
145#endif
146 data->RecycledPathOffset = FIELD_OFFSET(BBITEMDATA, OriginalLocation) + cbOrig;
147 CopyMemory(data->OriginalLocation, pszOrig, cbOrig);
148 CopyMemory((BYTE*)data + data->RecycledPathOffset, pszTrash, cbTrash);
149
150 assert(!(((SIZE_T)&fsitem.szNames) & 1)); // WORD aligned please
151 C_ASSERT(!(FIELD_OFFSET(BBITEMDATA, OriginalLocation) & 1)); // WORD aligned please
152 assert(!(((SIZE_T)data) & 1)); // WORD aligned please
153 assert(_ILGetFSType(pidl));
154 assert(_ILIsPidlSimple(pidl));
155 assert(*(WORD*)((BYTE*)pidl + pidl->mkid.cb - sizeof(WORD)) & 1); // ENDSIG bit
156 assert(_ILGetFileStructW(pidl) == NULL); // Our custom footer is incompatible with WinXP pidl data
157 assert(ValidateItem(pidl) == data);
158 return pidl;
159}
160
162{
163 return _ILGetFSType(pidl) ? ((PIDLDATA*)pidl->mkid.abID)->u.file.dwFileSize : 0;
164}
165
167{
168 return Data.OriginalLocation;
169}
170
172{
174 if (SUCCEEDED(hr))
176 return hr;
177}
178
180{
182}
183
185{
186 return (LPCWSTR)((BYTE*)&Data + Data.RecycledPathOffset);
187}
188
190{
191 C_ASSERT(BBITEMFILETYPE & PT_FS_UNICODE_FLAG);
192 return (LPCWSTR)((LPPIDLDATA)pidl->mkid.abID)->u.file.szNames;
193}
194
196{
197 if (BBITEMDATA *pData = ValidateItem(pidl))
201}
202
204{
206 UINT attribs = ((PIDLDATA*)pidl->mkid.abID)->u.file.uFileAttribs;
208 return S_OK;
209 shfi.szTypeName[0] = UNICODE_NULL;
210 return E_FAIL;
211}
212
214{
217}
218
219/*
220 * Recycle Bin folder
221 */
222
224{
225 int drive = 0;
229 return max(0, drive);
230}
231
233{
234 return NULL;
235}
236
238{
239 CComPtr<IEnumIDList> spEnumFiles;
240 HRESULT hr = pSF->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &spEnumFiles);
241 CComHeapPtr<ITEMIDLIST> spPidl;
242 ULONG itemcount;
243 return FAILED(hr) || spEnumFiles->Next(1, &spPidl, &itemcount) != S_OK;
244}
245
247{
249 if (!pidlFolder)
250 return;
251 if (BBItem)
252 {
253 assert(ValidateItem(BBItem));
254 if (LPITEMIDLIST pidlFull = ILCombine(pidlFolder, BBItem))
255 {
256 // Send notification for [Desktop][RecycleBin][BBItem]
257 // FIXME: Windows monitors each RecycleBin FS folder on every drive
258 // instead of manually sending these?
260 ILFree(pidlFull);
261 }
262 }
263 else
264 {
265 SHChangeNotify(Event, SHCNF_IDLIST, pidlFolder, NULL);
266 }
267 ILFree(pidlFolder);
268}
269
271 const RECYCLEBINFILEIDENTITY *pFI)
272{
274 info.LastModification = pFind->ftLastWriteTime;
275 info.DeletionTime = pFI->DeletionTime;
276 info.FileSize = pFind->nFileSizeLow;
277 info.Attributes = pFind->dwFileAttributes;
278 if (LPITEMIDLIST pidl = CreateItem(pFI->RecycledFullPath, OrigPath, info))
279 {
281 ILFree(pidl);
282 }
283}
284
286{
288
289 CComHeapPtr<ITEMIDLIST> pidlBB(SHCloneSpecialIDList(NULL, CSIDL_BITBUCKET, FALSE));
290 CComPtr<IShellFolder> pSF;
291 if (pidlBB && SUCCEEDED(SHBindToObject(NULL, pidlBB, IID_PPV_ARG(IShellFolder, &pSF))))
292 {
293 if (IsRecycleBinEmpty(pSF))
295 }
296}
297
299 IShellFolder &FSFolder, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
300{
301 HRESULT hr = FSFolder.GetUIObjectOf(NULL, 1, &pidl, riid, NULL, ppvOut);
302 if (SUCCEEDED(hr))
303 return hr;
304
305 // In case the search fails we use a default icon
306 ERR("Recycler could not retrieve the icon, this shouldn't happen\n");
307
308 if (IsFolder(pidl))
310 else
312}
313
315 public CComObjectRootEx<CComMultiThreadModelNoCS>,
316 public IContextMenu2
317{
318 private:
320 public:
324
325 // IContextMenu
326 STDMETHOD(QueryContextMenu)(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
328 STDMETHOD(GetCommandString)(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override;
329
330 // IContextMenu2
332
334 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
335 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
337};
338
340 public CEnumIDListBase
341{
342 public:
346 BOOL CBEnumRecycleBin(IN HDELFILE hDeletedFile);
347 static BOOL CALLBACK CBEnumRecycleBin(IN PVOID Context, IN HDELFILE hDeletedFile)
348 {
349 return static_cast<CRecycleBinEnum*>(Context)->CBEnumRecycleBin(hDeletedFile);
350 }
351
353 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
355};
356
358{
359}
360
362{
363}
364
366{
368 if (dwFlags & SHCONTF_NONFOLDERS)
369 {
370 TRACE("Starting Enumeration\n");
371
372 if (!EnumerateRecycleBinW(szDrive, CBEnumRecycleBin, this))
373 {
374 WARN("Error: EnumerateCRecycleBinW failed\n");
375 return E_FAIL;
376 }
377 }
378 else
379 {
380 // do nothing
381 }
382 return S_OK;
383}
384
386{
387 LPITEMIDLIST pidl = NULL;
389 IRecycleBinFile *pRBF = IRecycleBinFileFromHDELFILE(hDeletedFile);
390 BOOL ret = SUCCEEDED(pRBF->GetInfo(&info));
391 if (ret)
392 {
393 pidl = CreateItem(info.RecycledFullPath.String, info.OriginalFullPath.String, info);
394 ret = pidl != NULL;
395 FreeRecycleBinString(&info.OriginalFullPath);
396 FreeRecycleBinString(&info.RecycledFullPath);
397 }
398 if (pidl)
399 {
400 ret = AddToEnumList(pidl);
401 if (!ret)
402 ILFree(pidl);
403 }
404 CloseRecycleBinHandle(hDeletedFile);
405 return ret;
406}
407
408/**************************************************************************
409* IContextMenu2 Bitbucket Item Implementation
410*/
411
413{
414 apidl = NULL;
415}
416
418{
419 ILFree(apidl);
420}
421
423{
424 apidl = ILClone(pidl);
425 if (apidl == NULL)
426 return E_OUTOFMEMORY;
427 return S_OK;
428}
429
432{
433 { "undelete", IDC_BB_RESTORE },
434 { "cut", IDC_BB_CUT },
435 { "delete", IDC_BB_DELETE },
436 { "properties", IDC_BB_PROPERTIES },
437 { NULL }
438};
439
441{
442 UINT idHigh = 0, id;
443
444 TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", this, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
445
446 id = idCmdFirst + IDC_BB_RESTORE;
447 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_RESTORE), 0))
448 {
449 idHigh = max(idHigh, id);
450 indexMenu++;
451 }
452 id = idCmdFirst + IDC_BB_CUT;
454 {
455 idHigh = max(idHigh, id);
456 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
457 indexMenu++;
458 }
459 id = idCmdFirst + IDC_BB_DELETE;
460 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_DELETE), 0))
461 {
462 idHigh = max(idHigh, id);
463 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
464 indexMenu++;
465 }
466 id = idCmdFirst + IDC_BB_PROPERTIES;
467 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), 0))
468 {
469 idHigh = max(idHigh, id);
470 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
471 indexMenu++;
472 }
473 return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK;
474}
475
476static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl, const BBITEMDATA &Data)
477{
478 if (lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)
479 {
480 return TRUE;
481 }
482 else if (cidl == 1)
483 {
484 const UINT ask = IsFolder(pidl) ? ASK_DELETE_FOLDER : ASK_DELETE_FILE;
485 return SHELL_ConfirmYesNoW(lpcmi->hwnd, ask, GetItemOriginalFileName(Data));
486 }
488 wsprintfW(buf, L"%d", cidl);
490}
491
493{
494 TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd);
495
497
498 // Handle DefView accelerators
499 if ((SIZE_T)lpcmi->lpVerb == FCIDM_SHVIEW_CUT)
500 CmdId = IDC_BB_CUT;
501 if ((SIZE_T)lpcmi->lpVerb == FCIDM_SHVIEW_DELETE)
502 CmdId = IDC_BB_DELETE;
504 CmdId = IDC_BB_PROPERTIES;
505
506 if (CmdId == IDC_BB_RESTORE || CmdId == IDC_BB_DELETE)
507 {
510 return E_FAIL;
511 HDELFILE hDelFile = GetRecycleBinFileHandleFromItem(*pData);
512 if (!hDelFile && FAILED_UNEXPECTEDLY(E_FAIL))
513 return E_FAIL;
514
516 if (CmdId == IDC_BB_RESTORE)
517 hr = RestoreFileFromRecycleBin(hDelFile) ? S_OK : E_FAIL;
518 else if (ConfirmDelete(lpcmi, 1, apidl, *pData))
519 hr = DeleteFileInRecycleBin(hDelFile) ? S_OK : E_FAIL;
520
521 if (hr == S_OK)
523
524 CloseRecycleBinHandle(hDelFile);
525 return hr;
526 }
527 else if (CmdId == IDC_BB_CUT)
528 {
529 FIXME("implement cut\n");
530 SHELL_ErrorBox(lpcmi->hwnd, ERROR_NOT_SUPPORTED);
531 return E_NOTIMPL;
532 }
533 else if (CmdId == IDC_BB_PROPERTIES)
534 {
535 FIXME("implement properties\n");
536 SHELL_ErrorBox(lpcmi->hwnd, ERROR_NOT_SUPPORTED);
537 return E_NOTIMPL;
538 }
539 return E_UNEXPECTED;
540}
541
543{
544 TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
545 return SHELL_GetCommandStringImpl(idCommand, uFlags, lpszName, uMaxNameLen, g_BBItemVerbMap);
546}
547
549{
550 TRACE("CRecycleBin_IContextMenu2Item_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n", this, uMsg, wParam, lParam);
551
552 return E_NOTIMPL;
553}
554
556{
557 pidl = NULL;
559}
560
562{
563 SHFree(pidl);
564 for (SIZE_T i = 0; i < _countof(m_pFSFolders); ++i)
565 {
566 if (m_pFSFolders[i])
568 }
569}
570
572{
574 if (drive < 0)
577 return NULL;
578
579 if (!m_pFSFolders[drive])
580 {
581 HRESULT hr;
582 PERSIST_FOLDER_TARGET_INFO pfti = {};
583 if (FAILED_UNEXPECTEDLY(hr = GetRecycleBinPathFromDriveNumber(drive, pfti.szTargetParsingName)))
584 return NULL;
585 pfti.dwAttributes = FILE_ATTRIBUTE_DIRECTORY;
586 pfti.csidl = -1;
587 CComHeapPtr<ITEMIDLIST> pidlRoot;
588 pidlRoot.Attach(SHELL32_CreateSimpleIDListFromPath(pfti.szTargetParsingName, pfti.dwAttributes));
589 if (!pidlRoot && FAILED_UNEXPECTEDLY(E_FAIL))
590 return NULL;
591 IShellFolder *psf;
592 hr = SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, &CLSID_ShellFSFolder, IID_PPV_ARG(IShellFolder, &psf));
593 if (FAILED(hr))
594 return NULL;
595 m_pFSFolders[drive] = psf; // Reference count is 1 (for the m_pFSFolders cache)
596 }
597 m_pFSFolders[drive]->AddRef(); // AddRef for the caller
598 return m_pFSFolders[drive];
599}
600
601/*************************************************************************
602 * RecycleBin IPersistFolder2 interface
603 */
604
606{
607 TRACE("(%p, %p)\n", this, pClassID);
608 if (pClassID == NULL)
609 return E_INVALIDARG;
610 *pClassID = GetClassID();
611 return S_OK;
612}
613
615{
616 TRACE("(%p, %p)\n", this, pidl);
617
618 SHFree((LPVOID)this->pidl);
619 this->pidl = ILClone(pidl);
620 if (this->pidl == NULL)
621 return E_OUTOFMEMORY;
622 return S_OK;
623}
624
626{
627 TRACE("\n");
628 return SHILClone((LPCITEMIDLIST)pidl, ppidl);
629}
630
631/*************************************************************************
632 * RecycleBin IShellFolder2 interface
633 */
634
636 LPOLESTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl,
637 ULONG *pdwAttributes)
638{
639 FIXME("stub\n");
640 return E_NOTIMPL; // FIXME: Parse "D<Drive><UniqueId>.ext"
641}
642
643HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
644{
645 return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
646}
647
649{
650 FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv);
651 return E_NOTIMPL;
652}
653
655{
656 FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv);
657 return E_NOTIMPL;
658}
659
660static HRESULT CompareCanonical(const BBITEMDATA &Data1, const BBITEMDATA &Data2)
661{
662 // This assumes two files with the same original path cannot be deleted at
663 // the same time (within the FAT/NTFS FILETIME resolution).
664 int result = CompareFileTime(&Data1.DeletionTime, &Data2.DeletionTime);
665 if (result == 0)
668}
669
671{
672 UINT column = UINT(lParam & SHCIDS_COLUMNMASK);
673 if (column >= COLUMNS_COUNT || !_ILGetFSType(pidl1) || !_ILGetFSType(pidl2))
674 return E_INVALIDARG;
675 BBITEMDATA *pData1 = ValidateItem(pidl1), *pData2 = ValidateItem(pidl2);
676 if ((!pData1 || !pData2) && column != COLUMN_NAME)
677 return E_INVALIDARG;
678
679 LPCWSTR pName1, pName2;
680 FILETIME ft1, ft2;
681 SHFILEINFOW shfi1, shfi2;
682 int result;
684 if (SUCCEEDED(hr))
685 return hr;
686 switch (column)
687 {
688 case COLUMN_NAME:
689 if (pData1 && pData2)
690 {
692 return CompareCanonical(*pData1, *pData2);
693 pName1 = GetItemOriginalFileName(*pData1);
694 pName2 = GetItemOriginalFileName(*pData2);
695 result = CFSFolder::CompareUiStrings(pName1, pName2);
696 }
697 else
698 {
699 // We support comparing names even for non-Recycle items because
700 // SHChangeNotify can broadcast regular FS items.
701 if (IShellFolder *pSF = GetFSFolderForItem(pidl1))
702 {
703 hr = pSF->CompareIDs(lParam, pidl1, pidl2);
704 pSF->Release();
705 return hr;
706 }
707 return E_INVALIDARG;
708 }
709 break;
710 case COLUMN_DELFROM:
711 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData1, const_cast<LPWSTR&>(pName1))))
712 {
713 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast<LPWSTR&>(pName2))))
714 {
715 result = CFSFolder::CompareUiStrings(pName1, pName2);
716 SHFree(const_cast<LPWSTR>(pName2));
717 }
718 SHFree(const_cast<LPWSTR>(pName1));
719 }
721 case COLUMN_DATEDEL:
722 result = CompareFileTime(&pData1->DeletionTime, &pData2->DeletionTime);
723 break;
724 case COLUMN_SIZE:
725 result = GetItemFileSize(pidl1) - GetItemFileSize(pidl2);
726 break;
727 case COLUMN_TYPE:
728 GetItemTypeName(pidl1, *pData1, shfi1);
729 GetItemTypeName(pidl2, *pData2, shfi2);
731 break;
732 case COLUMN_MTIME:
733 _ILGetFileDateTime(pidl1, &ft1);
734 _ILGetFileDateTime(pidl2, &ft2);
735 result = CompareFileTime(&ft1, &ft2);
736 break;
737 }
739}
740
742{
743 CComPtr<IShellView> pShellView;
745
746 TRACE("(%p, %p, %s, %p)\n", this, hwndOwner, debugstr_guid(&riid), ppv);
747
748 if (!ppv)
749 return hr;
750 *ppv = NULL;
751
752 if (IsEqualIID (riid, IID_IDropTarget))
753 {
755 }
756 else if (IsEqualIID (riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2))
757 {
758 m_IsBackgroundMenu = true;
759 hr = this->QueryInterface(riid, ppv);
760 }
761 else if (IsEqualIID (riid, IID_IShellView))
762 {
763 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this };
764 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppv);
765 }
766 else
767 return hr;
768
769 TRACE ("-- (%p)->(interface=%p)\n", this, ppv);
770 return hr;
771
772}
773
775 SFGAOF *rgfInOut)
776{
777 TRACE("(%p, %d, {%p, ...}, {%x})\n", this, cidl, apidl ? apidl[0] : NULL, (unsigned int)*rgfInOut);
778 HRESULT hr = S_OK;
779 const SFGAOF ThisFolder = SFGAO_FOLDER | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_CANRENAME | SFGAO_CANLINK;
780 if (!cidl)
781 {
782 *rgfInOut &= ThisFolder;
784 *rgfInOut &= ~SFGAO_HASPROPSHEET;
785 return hr;
786 }
787 SFGAOF remain = SFGAO_LINK & *rgfInOut;
788 *rgfInOut &= remain | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_FILESYSTEM; // TODO: SFGAO_CANMOVE
789 for (UINT i = 0; (*rgfInOut & remain) && i < cidl && SUCCEEDED(hr); ++i)
790 {
791 if (IShellFolder* pSF = GetFSFolderForItem(apidl[i]))
792 {
793 hr = pSF->GetAttributesOf(1, &apidl[i], rgfInOut);
794 pSF->Release();
795 }
796 }
797 return hr;
798}
799
801 REFIID riid, UINT *prgfInOut, void **ppv)
802{
803 LPVOID pObj = NULL;
805
806 TRACE ("(%p)->(%p,%u,apidl=%p, %p %p)\n", this,
807 hwndOwner, cidl, apidl, prgfInOut, ppv);
808
809 if (!ppv)
810 return hr;
811
812 *ppv = NULL;
813 assert(!cidl || (apidl && apidl[0]));
814
815 if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, IID_IContextMenu2)) && (cidl >= 1))
816 {
817 // FIXME: Handle multiple items
818 hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(apidl[0], riid, &pObj);
819 }
820 else if((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1))
821 {
822 if (IShellFolder *pSF = GetFSFolderForItem(apidl[0]))
823 {
824 hr = CRecyclerExtractIcon_CreateInstance(*pSF, apidl[0], riid, &pObj);
825 pSF->Release();
826 }
827 }
828 else
830
831 if (SUCCEEDED(hr) && !pObj)
833
834 *ppv = pObj;
835 TRACE ("(%p)->hr=0x%08x\n", this, hr);
836 return hr;
837}
838
840{
841 TRACE("(%p, %p, %x, %p)\n", this, pidl, (unsigned int)uFlags, pName);
843 if (!pData)
844 return E_INVALIDARG;
845
847 {
850 pszName = PathFindFileNameW(pszName);
851 pName->pOleStr = SHStrDupW(pszName);
852 }
853 else
854 {
857 else
859 }
860
861 if (pName->pOleStr)
862 {
863 pName->uType = STRRET_WSTR;
864 if (!IsFolder(pidl))
866 return S_OK;
867 }
868 pName->uType = STRRET_CSTR;
869 pName->cStr[0] = '\0';
870 return E_OUTOFMEMORY;
871}
872
874 SHGDNF uFlags, PITEMID_CHILD *ppidlOut)
875{
876 TRACE("\n");
877 return E_FAIL; /* not supported */
878}
879
881{
882 FIXME("stub\n");
883 return E_NOTIMPL;
884}
885
887{
888 FIXME("stub\n");
889 *ppEnum = NULL;
890 return E_NOTIMPL;
891}
892
894{
895 TRACE("(%p, %x, %p, %p)\n", this, (unsigned int)dwReserved, pSort, pDisplay);
896 if (pSort)
897 *pSort = 0;
898 if (pDisplay)
899 *pDisplay = 0;
900 return S_OK;
901}
902
904{
905 TRACE("(%p, %d, %p)\n", this, iColumn, pcsFlags);
906 if (iColumn >= COLUMNS_COUNT)
907 return E_INVALIDARG;
908 *pcsFlags = RecycleBinColumns[iColumn].pcsFlags;
909 return S_OK;
910}
911
913{
914 FIXME("stub\n");
915 return E_NOTIMPL;
916}
917
919{
920 HRESULT hr;
921 FILETIME ft;
922 SHFILEINFOW shfi;
924
925 TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, pDetails);
926 if (iColumn >= COLUMNS_COUNT)
927 return E_FAIL;
928
929 if (pidl == NULL)
930 {
931 pDetails->fmt = RecycleBinColumns[iColumn].fmt;
932 pDetails->cxChar = RecycleBinColumns[iColumn].cxChars;
933 return SHSetStrRet(&pDetails->str, RecycleBinColumns[iColumn].column_name_id);
934 }
935
936 if (iColumn == COLUMN_NAME)
937 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &pDetails->str);
938
941 return E_INVALIDARG;
942
943 switch (iColumn)
944 {
945 case COLUMN_DATEDEL:
947 break;
948 case COLUMN_DELFROM:
950 pDetails->str.uType = STRRET_WSTR;
951 return hr;
952 case COLUMN_SIZE:
954 if (!IsFolder(pidl))
956 break;
957 case COLUMN_MTIME:
960 break;
961 case COLUMN_TYPE:
962 GetItemTypeName(pidl, *pData, shfi);
963 return SHSetStrRet(&pDetails->str, shfi.szTypeName);
964 default:
965 return E_FAIL;
966 }
967 return SHSetStrRet(&pDetails->str, buffer);
968}
969
971{
972 TRACE("(%p, %d, %p)\n", this, iColumn, pscid);
973 if (iColumn >= COLUMNS_COUNT)
974 return E_INVALIDARG;
975 pscid->fmtid = *RecycleBinColumns[iColumn].fmtId;
976 pscid->pid = RecycleBinColumns[iColumn].pid;
977 return S_OK;
978}
979
980/*************************************************************************
981 * RecycleBin IContextMenu interface
982 */
983
986{
987 { "empty", IDC_EMPTYRECYCLEBIN },
988 { "properties", IDC_PROPERTIES },
989 { NULL }
990};
991
992HRESULT WINAPI CRecycleBin::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
993{
994 TRACE("QueryContextMenu %p %p %u %u %u %u\n", this, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags );
995
996 if (!hMenu)
997 return E_INVALIDARG;
998
999 UINT idHigh = 0, id;
1000
1002 id = idCmdFirst + IDC_EMPTYRECYCLEBIN;
1004 {
1005 idHigh = max(idHigh, id);
1007 {
1008 id = idCmdFirst + IDC_PROPERTIES;
1009 if (_InsertMenuItemW(hMenu, ++indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), 0))
1010 {
1011 idHigh = max(idHigh, id);
1012 _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0);
1013 }
1014 }
1015 }
1016 return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK;
1017}
1018
1020{
1021 TRACE("%p %p verb %p\n", this, lpcmi, lpcmi ? lpcmi->lpVerb : NULL);
1023 if (CmdId == IDC_EMPTYRECYCLEBIN)
1024 {
1025 HRESULT hr = SHEmptyRecycleBinW(lpcmi->hwnd, NULL, 0);
1026 TRACE("result %x\n", hr);
1027 if (hr != S_OK)
1028 return hr;
1029#if 0 // This is a nasty hack because lpcmi->hwnd might not be a shell browser.
1030 // Not required with working SHChangeNotify.
1031 CComPtr<IShellView> pSV;
1032 LPSHELLBROWSER lpSB = (LPSHELLBROWSER)SendMessage(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0);
1033 if (lpSB && SUCCEEDED(lpSB->QueryActiveShellView(&pSV)))
1034 pSV->Refresh();
1035#endif
1036 return hr;
1037 }
1038 else if (CmdId == IDC_PROPERTIES)
1039 {
1041 }
1042 return E_INVALIDARG;
1043}
1044
1046{
1047 TRACE("%p %lu %u %p %p %u\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
1048 return SHELL_GetCommandStringImpl(idCommand, uFlags, lpszName, uMaxNameLen, g_BBFolderVerbMap);
1049}
1050
1051/*************************************************************************
1052 * RecycleBin IShellPropSheetExt interface
1053 */
1054
1056{
1058 return RecycleBin_AddPropSheetPages(pfnAddPage, lParam);
1059}
1060
1062{
1063 FIXME("%p %lu %p %lu\n", this, uPageID, pfnReplaceWith, lParam);
1064
1065 return E_NOTIMPL;
1066}
1067
1068/*************************************************************************
1069 * RecycleBin IShellExtInit interface
1070 */
1071
1073{
1074 TRACE("%p %p %p %p\n", this, pidlFolder, pdtobj, hkeyProgID );
1075 m_IsBackgroundMenu = false;
1076 return S_OK;
1077}
1078
1084BOOL
1086{
1087 LONG ret;
1088 DWORD dwNukeOnDelete, dwType, VolSerialNumber, MaxComponentLength;
1089 DWORD FileSystemFlags, dwSize, dwDisposition;
1090 HKEY hKey;
1091 WCHAR szBuffer[10];
1092 WCHAR szKey[150] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\";
1093
1094 if (wszPath[1] != L':')
1095 {
1096 /* path is UNC */
1097 return FALSE;
1098 }
1099
1100 // Copy and retrieve the root path from get given string
1101 WCHAR wszRootPathName[MAX_PATH];
1102 StringCbCopyW(wszRootPathName, sizeof(wszRootPathName), wszPath);
1103 PathStripToRootW(wszRootPathName);
1104
1105 // Test to see if the drive is fixed (non removable)
1106 if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED)
1107 {
1108 /* no bitbucket on removable media */
1109 return FALSE;
1110 }
1111
1112 if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0))
1113 {
1114 ERR("GetVolumeInformationW failed with %u wszRootPathName=%s\n", GetLastError(), debugstr_w(wszRootPathName));
1115 return FALSE;
1116 }
1117
1118 swprintf(szBuffer, L"%04X-%04X", LOWORD(VolSerialNumber), HIWORD(VolSerialNumber));
1119 wcscat(szKey, szBuffer);
1120
1121 if (RegCreateKeyExW(HKEY_CURRENT_USER, szKey, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS)
1122 {
1123 ERR("RegCreateKeyExW failed\n");
1124 return FALSE;
1125 }
1126
1127 if (dwDisposition & REG_CREATED_NEW_KEY)
1128 {
1129 /* per default move to bitbucket */
1130 dwNukeOnDelete = 0;
1131 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1132 /* per default unlimited size */
1133 dwSize = -1;
1134 RegSetValueExW(hKey, L"MaxCapacity", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD));
1135 }
1136 else
1137 {
1138 dwSize = sizeof(dwNukeOnDelete);
1139 ret = RegQueryValueExW(hKey, L"NukeOnDelete", NULL, &dwType, (LPBYTE)&dwNukeOnDelete, &dwSize);
1140 if (ret != ERROR_SUCCESS)
1141 {
1142 dwNukeOnDelete = 0;
1144 {
1145 /* restore key and enable bitbucket */
1146 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1147 }
1148 }
1149 }
1150 BOOL bCanTrash = !dwNukeOnDelete;
1151 // FIXME: Check if bitbucket is full (CORE-13743)
1153 return bCanTrash;
1154}
1155
1156BOOL
1158{
1159 TRACE("(%s)\n", debugstr_w(wszPath));
1160 return DeleteFileToRecycleBin(wszPath);
1161}
1162
1164{
1165 CRegKey regKey;
1166 CHeapPtr<WCHAR> pszValue;
1167 CHeapPtr<WCHAR> pszSndPath;
1168 DWORD dwType, dwSize;
1169 LONG lError;
1170
1171 lError = regKey.Open(HKEY_CURRENT_USER,
1172 L"AppEvents\\Schemes\\Apps\\Explorer\\EmptyRecycleBin\\.Current",
1173 KEY_READ);
1174 if (lError != ERROR_SUCCESS)
1175 return;
1176
1177 lError = regKey.QueryValue(NULL, &dwType, NULL, &dwSize);
1178 if (lError != ERROR_SUCCESS)
1179 return;
1180
1181 if (!pszValue.AllocateBytes(dwSize))
1182 return;
1183
1184 lError = regKey.QueryValue(NULL, &dwType, pszValue, &dwSize);
1185 if (lError != ERROR_SUCCESS)
1186 return;
1187
1188 if (dwType == REG_EXPAND_SZ)
1189 {
1190 dwSize = ExpandEnvironmentStringsW(pszValue, NULL, 0);
1191 if (dwSize == 0)
1192 return;
1193
1194 if (!pszSndPath.Allocate(dwSize))
1195 return;
1196
1197 if (ExpandEnvironmentStringsW(pszValue, pszSndPath, dwSize) == 0)
1198 return;
1199 }
1200 else if (dwType == REG_SZ)
1201 {
1202 /* The type is REG_SZ, no need to expand */
1203 pszSndPath.Attach(pszValue.Detach());
1204 }
1205 else
1206 {
1207 /* Invalid type */
1208 return;
1209 }
1210
1212}
1213
1214/*************************************************************************
1215 * SHUpdateCRecycleBinIcon [SHELL32.@]
1216 *
1217 * Undocumented
1218 */
1220{
1221 FIXME("stub\n");
1222
1223 // HACK! This dwItem2 should be the icon index in the system image list that has changed.
1224 // FIXME: Call SHMapPIDLToSystemImageListIndex
1225 DWORD dwItem2 = -1;
1226
1228 return S_OK;
1229}
1230
1231/*************************************************************************
1232 * SHEmptyRecycleBinA (SHELL32.@)
1233 */
1235{
1236 LPWSTR szRootPathW = NULL;
1237 int len;
1238 HRESULT hr;
1239
1240 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_a(pszRootPath), dwFlags);
1241
1242 if (pszRootPath)
1243 {
1244 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1245 if (len == 0)
1247 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1248 if (!szRootPathW)
1249 return E_OUTOFMEMORY;
1250 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1251 {
1252 HeapFree(GetProcessHeap(), 0, szRootPathW);
1254 }
1255 }
1256
1257 hr = SHEmptyRecycleBinW(hwnd, szRootPathW, dwFlags);
1258 HeapFree(GetProcessHeap(), 0, szRootPathW);
1259
1260 return hr;
1261}
1262
1264{
1265 WCHAR szBuffer[MAX_PATH];
1266 DWORD count;
1267 LONG ret;
1268 IShellFolder *pDesktop, *pRecycleBin;
1269 PIDLIST_ABSOLUTE pidlRecycleBin;
1270 PITEMID_CHILD pidl;
1271 HRESULT hr = S_OK;
1272 LPENUMIDLIST penumFiles;
1273 STRRET StrRet;
1274
1275 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags);
1276
1278 {
1279 hr = SHGetDesktopFolder(&pDesktop);
1280 if (FAILED(hr))
1281 return hr;
1282 hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlRecycleBin);
1283 if (FAILED(hr))
1284 {
1285 pDesktop->Release();
1286 return hr;
1287 }
1288 hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder, &pRecycleBin));
1289 CoTaskMemFree(pidlRecycleBin);
1290 pDesktop->Release();
1291 if (FAILED(hr))
1292 return hr;
1293 hr = pRecycleBin->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumFiles);
1294 if (FAILED(hr))
1295 {
1296 pRecycleBin->Release();
1297 return hr;
1298 }
1299
1300 count = 0;
1301 if (hr != S_FALSE)
1302 {
1303 while (penumFiles->Next(1, &pidl, NULL) == S_OK)
1304 {
1305 count++;
1306 pRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &StrRet);
1307 StrRetToBuf(&StrRet, pidl, szBuffer, _countof(szBuffer));
1308 CoTaskMemFree(pidl);
1309 }
1310 penumFiles->Release();
1311 }
1312 pRecycleBin->Release();
1313
1314 switch (count)
1315 {
1316 case 0:
1317 /* no files, don't need confirmation */
1318 break;
1319
1320 case 1:
1321 /* we have only one item inside the bin, so show a message box with its name */
1324 {
1325 return S_OK;
1326 }
1327 break;
1328
1329 default:
1330 /* we have more than one item, so show a message box with the count of the items */
1331 StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%u", count);
1334 {
1335 return S_OK;
1336 }
1337 break;
1338 }
1339 }
1340
1342 {
1343 ret = EmptyRecycleBinW(pszRootPath);
1344 }
1345 else
1346 {
1347 /* FIXME
1348 * show a progress dialog
1349 */
1350 ret = EmptyRecycleBinW(pszRootPath);
1351 }
1352
1353 if (!ret)
1355
1357 if (!(dwFlags & SHERB_NOSOUND))
1358 {
1360 }
1361 return S_OK;
1362}
1363
1365{
1366 LPWSTR szRootPathW = NULL;
1367 int len;
1368 HRESULT hr;
1369
1370 TRACE("%s, %p\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
1371
1372 if (pszRootPath)
1373 {
1374 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1375 if (len == 0)
1377 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1378 if (!szRootPathW)
1379 return E_OUTOFMEMORY;
1380 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1381 {
1382 HeapFree(GetProcessHeap(), 0, szRootPathW);
1384 }
1385 }
1386
1387 hr = SHQueryRecycleBinW(szRootPathW, pSHQueryRBInfo);
1388 HeapFree(GetProcessHeap(), 0, szRootPathW);
1389
1390 return hr;
1391}
1392
1394{
1395 TRACE("%s, %p\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
1396
1397 if (!pszRootPath || (pszRootPath[0] == 0) ||
1398 !pSHQueryRBInfo || (pSHQueryRBInfo->cbSize < sizeof(SHQUERYRBINFO)))
1399 {
1400 return E_INVALIDARG;
1401 }
1402
1403 pSHQueryRBInfo->i64Size = 0;
1404 pSHQueryRBInfo->i64NumItems = 0;
1405
1406 CComPtr<IRecycleBin> spRecycleBin;
1407 HRESULT hr;
1408 if (FAILED_UNEXPECTEDLY((hr = GetDefaultRecycleBin(pszRootPath, &spRecycleBin))))
1409 return hr;
1410
1411 CComPtr<IRecycleBinEnumList> spEnumList;
1412 hr = spRecycleBin->EnumObjects(&spEnumList);
1413 if (!SUCCEEDED(hr))
1414 return hr;
1415
1416 while (TRUE)
1417 {
1418 CComPtr<IRecycleBinFile> spFile;
1419 hr = spEnumList->Next(1, &spFile, NULL);
1420 if (hr == S_FALSE)
1421 return S_OK;
1422
1424 return hr;
1425
1426 ULARGE_INTEGER Size = {};
1427 if (FAILED_UNEXPECTEDLY((hr = spFile->GetFileSize(&Size))))
1428 return hr;
1429
1430 pSHQueryRBInfo->i64Size += Size.QuadPart;
1431 pSHQueryRBInfo->i64NumItems++;
1432 }
1433
1434 return S_OK;
1435}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4677
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: CFindFolder.cpp:13
static BOOL IsRecycleBinEmpty(IShellFolder *pSF)
@ IDC_BB_DELETE
@ IDC_BB_RESTORE
@ IDC_BB_CUT
@ IDC_BB_PROPERTIES
static BOOL IsFolder(LPCITEMIDLIST pidl)
Definition: CRecycleBin.cpp:84
EXTERN_C void CRecycleBin_NotifyRecycled(LPCWSTR OrigPath, const WIN32_FIND_DATAW *pFind, const RECYCLEBINFILEIDENTITY *pFI)
#define COLUMN_SIZE
Definition: CRecycleBin.cpp:55
static HRESULT CRecyclerExtractIcon_CreateInstance(IShellFolder &FSFolder, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
static HDELFILE GetRecycleBinFileHandleFromItem(const BBITEMDATA &Data)
static void CRecycleBin_ChangeNotifyBBItem(_In_ LONG Event, _In_opt_ LPCITEMIDLIST BBItem)
static const CMVERBMAP g_BBFolderVerbMap[]
static void CRecycleBin_NotifyRemovedFromRecycleBin(LPCITEMIDLIST BBItem)
static LPCWSTR GetItemRecycledFileName(LPCITEMIDLIST pidl, const BBITEMDATA &Data)
HRESULT WINAPI SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
static HRESULT CompareCanonical(const BBITEMDATA &Data1, const BBITEMDATA &Data2)
static const columninfo RecycleBinColumns[]
Definition: CRecycleBin.cpp:40
BOOL TRASH_TrashFile(LPCWSTR wszPath)
static LPITEMIDLIST CreateItem(LPCWSTR pszTrash, LPCWSTR pszOrig, const DELETED_FILE_INFO &Details)
static LPCWSTR GetItemOriginalFileName(const BBITEMDATA &Data)
static HRESULT GetItemTypeName(PCUITEMID_CHILD pidl, const BBITEMDATA &Data, SHFILEINFOW &shfi)
HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
static LPCWSTR GetGlobalRecycleBinPath()
static int GetItemDriveNumber(LPCITEMIDLIST pidl)
#define COLUMNS_COUNT
Definition: CRecycleBin.cpp:59
HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
static const CMVERBMAP g_BBItemVerbMap[]
EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon(void)
#define COLUMN_MTIME
Definition: CRecycleBin.cpp:57
static LPCWSTR GetItemOriginalFullPath(const BBITEMDATA &Data)
#define BBITEMFOLDERTYPE
Definition: CRecycleBin.cpp:65
#define BBITEMFILETYPE
Definition: CRecycleBin.cpp:64
static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl, const BBITEMDATA &Data)
static HRESULT GetItemOriginalFolder(const BBITEMDATA &Data, LPWSTR &Out)
HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
@ IDC_EMPTYRECYCLEBIN
@ IDC_PROPERTIES
static BBITEMDATA * ValidateItem(LPCITEMIDLIST pidl)
Definition: CRecycleBin.cpp:89
BOOL TRASH_CanTrashFile(LPCWSTR wszPath)
static LPCWSTR GetItemRecycledFullPath(const BBITEMDATA &Data)
static UINT GetItemFileSize(LPCITEMIDLIST pidl)
static UINT GetDefaultRecycleDriveNumber()
#define COLUMN_DATEDEL
Definition: CRecycleBin.cpp:54
#define COLUMN_DELFROM
Definition: CRecycleBin.cpp:53
static void TRASH_PlayEmptyRecycleBinSound()
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define shell32_hInstance
static DWORD const LPVOID const lpReserved
static int state
Definition: maze.c:121
#define IDS_DELETE
Definition: resource.h:40
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define IDS_PROPERTIES
Definition: resource.h:102
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHOD(m)
Definition: basetyps.h:62
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL AddToEnumList(LPITEMIDLIST pidl)
static int CompareUiStrings(LPCWSTR a, LPCWSTR b)
Definition: CFSFolder.h:136
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: CFSFolder.cpp:1091
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2115
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2099
bool AllocateBytes(_In_ size_t nBytes)
Definition: atlalloc.h:127
T * Detach()
Definition: atlalloc.h:168
bool Allocate(_In_ size_t nElements=1)
Definition: atlalloc.h:143
void Attach(T *lp)
Definition: atlalloc.h:162
BOOL CBEnumRecycleBin(IN HDELFILE hDeletedFile)
HRESULT WINAPI Initialize(DWORD dwFlags)
static BOOL CALLBACK CBEnumRecycleBin(IN PVOID Context, IN HDELFILE hDeletedFile)
STDMETHOD() QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
STDMETHOD() InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) override
HRESULT WINAPI Initialize(LPCITEMIDLIST pidl)
STDMETHOD() GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
STDMETHOD() HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) override
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
LPITEMIDLIST pidl
Definition: CRecycleBin.h:39
STDMETHOD() AddPages(LPFNSVADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) override
bool m_IsBackgroundMenu
Definition: CRecycleBin.h:41
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
STDMETHOD() InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) override
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
STDMETHOD() GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
IShellFolder * m_pFSFolders[RECYCLEBINMAXDRIVECOUNT]
Definition: CRecycleBin.h:40
static REFCLSID GetClassID()
Definition: CRecycleBin.h:48
STDMETHOD() GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
STDMETHOD() ReplacePage(EXPPS uPageID, LPFNSVADDPROPSHEETPAGE pfnReplaceWith, LPARAM lParam) override
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
IShellFolder * GetFSFolderForItem(LPCITEMIDLIST pidl)
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
STDMETHOD() Initialize(PCIDLIST_ABSOLUTE pidl) override
STDMETHOD() QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
wcscat
#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
#define ERROR_SUCCESS
Definition: deptool.c:10
@ Out
#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 IDC_PROPERTIES
Definition: resource.h:32
#define SHCIDS_CANONICALONLY
Definition: precomp.h:50
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 RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI 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)
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define MultiByteToWideChar
Definition: compat.h:110
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
BOOL WINAPI FileTimeToDosDateTime(IN CONST FILETIME *lpFileTime, OUT LPWORD lpFatDate, OUT LPWORD lpFatTime)
Definition: time.c:37
void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags)
Definition: CFSFolder.cpp:1472
#define ShellMessageBoxW
Definition: precomp.h:62
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:369
BOOL WINAPI EnumerateRecycleBinW(IN LPCWSTR pszRoot OPTIONAL, IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, IN PVOID Context OPTIONAL)
Definition: recyclebin.c:205
EXTERN_C HRESULT GetRecycleBinPathFromDriveNumber(UINT Drive, LPWSTR Path)
Definition: recyclebin.c:337
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:306
BOOL WINAPI CloseRecycleBinHandle(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:12
BOOL WINAPI DeleteFileInRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:93
BOOL WINAPI RestoreFileFromRecycleBin(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:287
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
EXTERN_C HDELFILE GetRecycleBinFileHandle(IN LPCWSTR pszRoot OPTIONAL, IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:277
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:132
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1779
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1745
static HRESULT SHELL_CreateFallbackExtractIconForNoAssocFile(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:79
static HRESULT SHELL_CreateFallbackExtractIconForFolder(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:72
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3150
int WINAPI PathGetDriveNumberW(const WCHAR *path)
Definition: path.c:553
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
BOOL WINAPI PathStripToRootW(LPWSTR lpszPath)
Definition: path.c:733
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2018
#define swprintf
Definition: precomp.h:40
#define assert(x)
Definition: debug.h:53
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
FxAutoRegKey hKey
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint buffer
Definition: glext.h:5915
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
const GLint * attribs
Definition: glext.h:10538
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
ULONG SFGAOF
Definition: shobjidl.idl:222
HRESULT GetUIObjectOf([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
HRESULT EnumObjects([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
DWORD SHGDNF
Definition: shobjidl.idl:169
ULONG AddRef()
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 C_ASSERT(e)
Definition: intsafe.h:73
HRESULT SHELL_ShowItemIDListProperties(LPCITEMIDLIST pidl)
Definition: item_prop.cpp:182
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
#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
#define SND_FILENAME
Definition: mmsystem.h:162
#define SND_ASYNC
Definition: mmsystem.h:154
#define SND_NODEFAULT
Definition: mmsystem.h:155
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static LPSTR pName
Definition: security.c:75
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
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
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define KEY_READ
Definition: nt_native.h:1023
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define KEY_WRITE
Definition: nt_native.h:1031
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#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_NAME
Definition: ntquery.h:56
#define L(x)
Definition: ntvdm.h:50
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:445
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2428
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
LPITEMIDLIST SHELL32_CreateSimpleIDListFromPath(LPCWSTR pszPath, DWORD dwAttributes)
Definition: pidl.c:1188
BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
Definition: pidl.c:2470
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2174
static BYTE _ILGetType(LPCITEMIDLIST pidl)
Definition: pidl.h:120
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:125
struct tagPIDLDATA * LPPIDLDATA
BOOL WINAPI PlaySoundW(LPCWSTR pszSoundW, HMODULE hmod, DWORD fdwSound)
Definition: playsound.c:709
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
static void FreeRecycleBinString(PRECYCLEBINSTRING pRBS)
Definition: recyclebin.h:55
#define DeleteFileToRecycleBin
Definition: recyclebin.h:101
#define IRecycleBinFileFromHDELFILE(hDF)
Definition: recyclebin.h:50
UINT RECYCLEBINFILESIZETYPE
Definition: recyclebin.h:24
HRESULT RecycleBin_AddPropSheetPages(LPFNSVADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
#define REG_DWORD
Definition: sdbapi.c:596
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define ASK_DELETE_MULTIPLE_ITEM
Definition: shell32_main.h:129
#define ASK_DELETE_FILE
Definition: shell32_main.h:127
#define ASK_DELETE_FOLDER
Definition: shell32_main.h:128
#define SHGFI_TYPENAME
Definition: shellapi.h:168
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:182
#define SHERB_NOSOUND
Definition: shellapi.h:399
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:398
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:397
#define StrRet
Definition: shellclasses.h:871
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:619
#define IS_SHGDN_FOR_PARSING(flags)
Definition: shfldr.h:77
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
#define COLUMN_NAME
#define COLUMN_TYPE
BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir)
Definition: shlfileop.cpp:332
HRESULT hr
Definition: shlfolder.c:183
#define PID_DISPLACED_FROM
Definition: shlguid.h:182
#define PID_DISPLACED_DATE
Definition: shlguid.h:183
#define SHCNE_RMDIR
Definition: shlobj.h:1894
#define SHCNE_DELETE
Definition: shlobj.h:1892
#define SHCNE_MKDIR
Definition: shlobj.h:1893
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1902
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1905
#define SHCNE_CREATE
Definition: shlobj.h:1891
#define SHCNF_DWORD
Definition: shlobj.h:1924
struct _SFV_CREATE SFV_CREATE
@ REST_BITBUCKNOPROP
Definition: shlobj.h:1810
#define CSIDL_BITBUCKET
Definition: shlobj.h:2183
#define SHCNF_IDLIST
Definition: shlobj.h:1921
#define StrRetToBuf
Definition: shlwapi.h:1795
LPARAM LPFNSVADDPROPSHEETPAGE
Definition: shobjidl.idl:117
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:150
#define IDS_SHV_COLUMN_DELFROM
Definition: shresdef.h:58
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:828
#define IDS_CUT
Definition: shresdef.h:226
#define IDS_RESTORE
Definition: shresdef.h:227
#define IDS_SHV_COLUMN_SIZE
Definition: shresdef.h:50
#define IDS_SHV_COLUMN_MODIFIED
Definition: shresdef.h:52
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:827
#define IDS_DELETEITEM_TEXT
Definition: shresdef.h:124
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:826
#define IDS_EMPTY_BITBUCKET
Definition: shresdef.h:186
#define IDS_SHV_COLUMN_DELDATE
Definition: shresdef.h:59
#define IDS_DELETEMULTIPLE_TEXT
Definition: shresdef.h:125
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_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:70
#define TRACE(s)
Definition: solgame.cpp:4
static BOOL ValidateItem(int index, BOOL bNewState, BOOL bDisplayErrors)
Definition: srvpage.cpp:503
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
WORD RecycledPathOffset
Definition: CRecycleBin.cpp:72
FILETIME DeletionTime
Definition: CRecycleBin.cpp:68
WCHAR OriginalLocation[ANYSIZE_ARRAY]
Definition: CRecycleBin.cpp:73
STRRET str
Definition: shtypes.idl:108
RECYCLEBINFILESIZETYPE FileSize
Definition: recyclebin.h:42
FILETIME DeletionTime
Definition: recyclebin.h:41
FILETIME LastModification
Definition: recyclebin.h:40
WCHAR szTypeName[80]
Definition: shellapi.h:377
__int64 i64Size
Definition: shellapi.h:381
__int64 i64NumItems
Definition: shellapi.h:382
DWORD cbSize
Definition: shellapi.h:380
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
const GUID * fmtId
Definition: CRecycleBin.cpp:33
int column_name_id
Definition: CRecycleBin.cpp:32
Definition: fci.c:116
WORD uFileDate
Definition: pidl.h:178
WORD uFileAttribs
Definition: pidl.h:180
WORD uFileTime
Definition: pidl.h:179
DWORD dwFileSize
Definition: pidl.h:177
BYTE dummy
Definition: pidl.h:176
CHAR szNames[1]
Definition: pidl.h:181
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define MAKEWORD(a, b)
Definition: typedefs.h:248
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define ANYSIZE_ARRAY
Definition: typedefs.h:46
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define CWM_GETISHELLBROWSER
Definition: undocshell.h:230
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define ZeroMemory
Definition: winbase.h:1737
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CopyMemory
Definition: winbase.h:1735
#define DRIVE_FIXED
Definition: winbase.h:278
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2792
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define E_UNEXPECTED
Definition: winerror.h:2456
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define HKEY_CURRENT_USER
Definition: winreg.h:11
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define MFS_DISABLED
Definition: winuser.h:752
#define MB_YESNO
Definition: winuser.h:820
#define MFT_SEPARATOR
Definition: winuser.h:747
#define IDNO
Definition: winuser.h:839
#define SendMessage
Definition: winuser.h:5855
#define MB_ICONEXCLAMATION
Definition: winuser.h:788
#define MFS_ENABLED
Definition: winuser.h:753
#define MB_DEFBUTTON2
Definition: winuser.h:802
#define MFT_STRING
Definition: winuser.h:749
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193