ReactOS 0.4.16-dev-2206-gc56950d
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
189#if 0 // Unused
190static inline LPCWSTR GetItemRecycledFileName(LPCITEMIDLIST pidl, const BBITEMDATA &Data)
191{
193 return (LPCWSTR)((LPPIDLDATA)pidl->mkid.abID)->u.file.szNames;
194}
195#endif
196
198{
199 if (BBITEMDATA *pData = ValidateItem(pidl))
203}
204
206{
208 UINT attribs = ((PIDLDATA*)pidl->mkid.abID)->u.file.uFileAttribs;
210 return S_OK;
211 shfi.szTypeName[0] = UNICODE_NULL;
212 return E_FAIL;
213}
214
215/*
216 * Recycle Bin folder
217 */
218
220{
221 int drive = 0;
225 return max(0, drive);
226}
227
229{
230 return NULL;
231}
232
234{
235 CComPtr<IEnumIDList> spEnumFiles;
236 HRESULT hr = pSF->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &spEnumFiles);
237 CComHeapPtr<ITEMIDLIST> spPidl;
238 ULONG itemcount;
239 return FAILED(hr) || spEnumFiles->Next(1, &spPidl, &itemcount) != S_OK;
240}
241
243{
245 if (!pidlFolder)
246 return;
247 if (BBItem)
248 {
249 assert(ValidateItem(BBItem));
250 if (LPITEMIDLIST pidlFull = ILCombine(pidlFolder, BBItem))
251 {
252 // Send notification for [Desktop][RecycleBin][BBItem]
253 // FIXME: Windows monitors each RecycleBin FS folder on every drive
254 // instead of manually sending these?
256 ILFree(pidlFull);
257 }
258 }
259 else
260 {
261 SHChangeNotify(Event, SHCNF_IDLIST, pidlFolder, NULL);
262 }
263 ILFree(pidlFolder);
264}
265
267 const RECYCLEBINFILEIDENTITY *pFI)
268{
270 info.LastModification = pFind->ftLastWriteTime;
271 info.DeletionTime = pFI->DeletionTime;
272 info.FileSize = pFind->nFileSizeLow;
273 info.Attributes = pFind->dwFileAttributes;
274 if (LPITEMIDLIST pidl = CreateItem(pFI->RecycledFullPath, OrigPath, info))
275 {
277 ILFree(pidl);
278 }
279}
280
282{
284}
285
287 IShellFolder &FSFolder, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
288{
289 HRESULT hr = FSFolder.GetUIObjectOf(NULL, 1, &pidl, riid, NULL, ppvOut);
290 if (SUCCEEDED(hr))
291 return hr;
292
293 // In case the search fails we use a default icon
294 ERR("Recycler could not retrieve the icon, this shouldn't happen\n");
295
296 if (IsFolder(pidl))
298 else
300}
301
303 public CComObjectRootEx<CComMultiThreadModelNoCS>,
304 public IContextMenu2
305{
306 private:
309 public:
313
314 // IContextMenu
315 STDMETHOD(QueryContextMenu)(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
317 STDMETHOD(GetCommandString)(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override;
318
319 // IContextMenu2
321
323 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
324 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
326};
327
329 public CEnumIDListBase
330{
331 public:
335 BOOL CBEnumRecycleBin(IN HDELFILE hDeletedFile);
336 static BOOL CALLBACK CBEnumRecycleBin(IN PVOID Context, IN HDELFILE hDeletedFile)
337 {
338 return static_cast<CRecycleBinEnum*>(Context)->CBEnumRecycleBin(hDeletedFile);
339 }
340
342 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
344};
345
347{
348}
349
351{
352}
353
355{
357 if (dwFlags & SHCONTF_NONFOLDERS)
358 {
359 TRACE("Starting Enumeration\n");
360
361 if (!EnumerateRecycleBinW(szDrive, CBEnumRecycleBin, this))
362 {
363 WARN("Error: EnumerateCRecycleBinW failed\n");
364 return E_FAIL;
365 }
366 }
367 else
368 {
369 // do nothing
370 }
371 return S_OK;
372}
373
375{
376 LPITEMIDLIST pidl = NULL;
378 IRecycleBinFile *pRBF = IRecycleBinFileFromHDELFILE(hDeletedFile);
379 BOOL ret = SUCCEEDED(pRBF->GetInfo(&info));
380 if (ret)
381 {
382 pidl = CreateItem(info.RecycledFullPath.String, info.OriginalFullPath.String, info);
383 ret = pidl != NULL;
384 FreeRecycleBinString(&info.OriginalFullPath);
385 FreeRecycleBinString(&info.RecycledFullPath);
386 }
387 if (pidl)
388 {
389 ret = AddToEnumList(pidl);
390 if (!ret)
391 ILFree(pidl);
392 }
393 CloseRecycleBinHandle(hDeletedFile);
394 return ret;
395}
396
397/**************************************************************************
398* IContextMenu2 Bitbucket Item Implementation
399*/
400
402{
403 m_apidl = NULL;
404 m_cidl = 0;
405}
406
408{
410}
411
413{
414 m_apidl = _ILCopyaPidl(apidl, cidl);
415 if (m_apidl == NULL)
416 return E_OUTOFMEMORY;
417 m_cidl = cidl;
418 return S_OK;
419}
420
423{
424 { "undelete", IDC_BB_RESTORE },
425 { "cut", IDC_BB_CUT },
426 { "delete", IDC_BB_DELETE },
427 { "properties", IDC_BB_PROPERTIES },
428 { NULL }
429};
430
432{
433 UINT idHigh = 0, id;
434
435 TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", this, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
436
437 id = idCmdFirst + IDC_BB_RESTORE;
438 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_RESTORE), 0))
439 {
440 idHigh = max(idHigh, id);
441 indexMenu++;
442 }
443 id = idCmdFirst + IDC_BB_CUT;
445 {
446 idHigh = max(idHigh, id);
447 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
448 indexMenu++;
449 }
450 id = idCmdFirst + IDC_BB_DELETE;
451 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_DELETE), 0))
452 {
453 idHigh = max(idHigh, id);
454 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
455 indexMenu++;
456 }
457 id = idCmdFirst + IDC_BB_PROPERTIES;
458 if (_InsertMenuItemW(hMenu, indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), 0))
459 {
460 idHigh = max(idHigh, id);
461 if (_InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0))
462 indexMenu++;
463 }
464 return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK;
465}
466
467static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl)
468{
470 if (lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)
471 {
472 return TRUE;
473 }
474 else if (cidl == 1 && (pData = ValidateItem(pidl)) != NULL)
475 {
476 const UINT ask = IsFolder(pidl) ? ASK_DELETE_FOLDER : ASK_DELETE_FILE;
477 return SHELL_ConfirmYesNoW(lpcmi->hwnd, ask, GetItemOriginalFileName(*pData));
478 }
479 WCHAR buf[42];
480 wsprintfW(buf, L"%d", cidl);
482}
483
485{
486 PWSTR mem = NULL, newmem;
487 for (SIZE_T i = 0, cb = 0, cb2, cbPath; i < cidl; ++i, cb = cb2)
488 {
489 BBITEMDATA *pData = ValidateItem(apidl[i]);
490 if (!pData)
491 {
492fail:
493 LocalFree(mem);
494 return NULL;
495 }
497 cbPath = (lstrlenW(path) + 1) * sizeof(WCHAR);
498 cb2 = cb + cbPath;
499 SIZE_T cbTot = cb2 + sizeof(WCHAR); // \0\0 termination
500 newmem = (PWSTR)(i ? LocalReAlloc(mem, cbTot, LMEM_MOVEABLE) : LocalAlloc(LPTR, cbTot));
501 if (!newmem)
502 goto fail;
503 mem = newmem;
504 CopyMemory((char*)mem + cb, path, cbPath);
505 *(PWSTR)((char*)mem + cb + cbPath) = UNICODE_NULL;
506 }
507 return mem;
508}
509
510typedef struct _FILEOPDATA
511{
515
517{
518 FILEOPDATA &data = *(FILEOPDATA*)CallerData;
520 {
521 for (UINT i = 0; i < data.cidl; ++i)
522 {
523 BBITEMDATA *pItem = ValidateItem(data.apidl[i]);
524 if (pItem && !_wcsicmp(Src, GetItemRecycledFullPath(*pItem)))
525 {
529 break;
530 }
531 }
532 }
533 else if (Event == FOCE_FINISHOPERATIONS)
534 {
535 CComHeapPtr<ITEMIDLIST> pidlBB(SHCloneSpecialIDList(NULL, CSIDL_BITBUCKET, FALSE));
536 CComPtr<IShellFolder> pSF;
537 if (pidlBB && SUCCEEDED(SHBindToObject(NULL, pidlBB, IID_PPV_ARG(IShellFolder, &pSF))))
538 {
539 if (IsRecycleBinEmpty(pSF))
541 }
542 }
543 return S_OK;
544}
545
547{
548 TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd);
549
551
552 // Handle DefView accelerators
553 if ((SIZE_T)lpcmi->lpVerb == FCIDM_SHVIEW_CUT)
554 CmdId = IDC_BB_CUT;
555 if ((SIZE_T)lpcmi->lpVerb == FCIDM_SHVIEW_DELETE)
556 CmdId = IDC_BB_DELETE;
558 CmdId = IDC_BB_PROPERTIES;
559
560 if (CmdId == IDC_BB_RESTORE || CmdId == IDC_BB_DELETE)
561 {
562 HRESULT hr = S_OK;
563 if (CmdId == IDC_BB_DELETE && !ConfirmDelete(lpcmi, m_cidl, m_apidl[0]))
564 return S_OK;
565
566 LPWSTR pszzDst = NULL;
568 if (!pszzSrc)
569 return E_OUTOFMEMORY;
570 SHFILEOPSTRUCTW shfos = { lpcmi->hwnd, FO_DELETE, pszzSrc, NULL, FOF_NOCONFIRMMKDIR };
571 if (CmdId == IDC_BB_RESTORE)
572 {
574 if (!pszzDst)
576 shfos.wFunc = FO_MOVE;
577 shfos.pTo = pszzDst;
578 shfos.fFlags |= FOF_MULTIDESTFILES;
579 }
580 else // IDC_BB_DELETE
581 {
582 shfos.fFlags |= FOF_NOCONFIRMATION;
583 }
584 if (SUCCEEDED(hr))
585 {
586 if (lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)
590 if (res && res != DE_OPCANCELLED && res != ERROR_CANCELLED)
591 hr = SHELL_ErrorBox(*lpcmi, E_FAIL);
592 }
593 LocalFree(pszzDst);
594 LocalFree(pszzSrc);
595 return hr;
596 }
597 else if (CmdId == IDC_BB_CUT)
598 {
599 FIXME("implement cut\n");
601 return E_NOTIMPL;
602 }
603 else if (CmdId == IDC_BB_PROPERTIES)
604 {
605 FIXME("implement properties\n");
607 return E_NOTIMPL;
608 }
609 return E_UNEXPECTED;
610}
611
613{
614 TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
615 return SHELL_GetCommandStringImpl(idCommand, uFlags, lpszName, uMaxNameLen, g_BBItemVerbMap);
616}
617
619{
620 TRACE("CRecycleBin_IContextMenu2Item_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n", this, uMsg, wParam, lParam);
621
622 return E_NOTIMPL;
623}
624
626{
627 pidl = NULL;
629}
630
632{
633 SHFree(pidl);
634 for (SIZE_T i = 0; i < _countof(m_pFSFolders); ++i)
635 {
636 if (m_pFSFolders[i])
638 }
639}
640
642{
644 if (drive < 0)
647 return NULL;
648
649 if (!m_pFSFolders[drive])
650 {
651 HRESULT hr;
652 PERSIST_FOLDER_TARGET_INFO pfti = {};
653 if (FAILED_UNEXPECTEDLY(hr = GetRecycleBinPathFromDriveNumber(drive, pfti.szTargetParsingName)))
654 return NULL;
655 pfti.dwAttributes = FILE_ATTRIBUTE_DIRECTORY;
656 pfti.csidl = -1;
657 CComHeapPtr<ITEMIDLIST> pidlRoot;
658 pidlRoot.Attach(SHELL32_CreateSimpleIDListFromPath(pfti.szTargetParsingName, pfti.dwAttributes));
659 if (!pidlRoot && FAILED_UNEXPECTEDLY(E_FAIL))
660 return NULL;
661 IShellFolder *psf;
662 hr = SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, &CLSID_ShellFSFolder, IID_PPV_ARG(IShellFolder, &psf));
663 if (FAILED(hr))
664 return NULL;
665 m_pFSFolders[drive] = psf; // Reference count is 1 (for the m_pFSFolders cache)
666 }
667 m_pFSFolders[drive]->AddRef(); // AddRef for the caller
668 return m_pFSFolders[drive];
669}
670
671/*************************************************************************
672 * RecycleBin IPersistFolder2 interface
673 */
674
676{
677 TRACE("(%p, %p)\n", this, pClassID);
678 if (pClassID == NULL)
679 return E_INVALIDARG;
680 *pClassID = GetClassID();
681 return S_OK;
682}
683
685{
686 TRACE("(%p, %p)\n", this, pidl);
687
688 SHFree((LPVOID)this->pidl);
689 this->pidl = ILClone(pidl);
690 if (this->pidl == NULL)
691 return E_OUTOFMEMORY;
692 return S_OK;
693}
694
696{
697 TRACE("\n");
698 return SHILClone((LPCITEMIDLIST)pidl, ppidl);
699}
700
701/*************************************************************************
702 * RecycleBin IShellFolder2 interface
703 */
704
706 LPOLESTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl,
707 ULONG *pdwAttributes)
708{
709 FIXME("stub\n");
710 return E_NOTIMPL; // FIXME: Parse "D<Drive><UniqueId>.ext"
711}
712
713HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
714{
715 return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
716}
717
719{
720 FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv);
721 return E_NOTIMPL;
722}
723
725{
726 FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv);
727 return E_NOTIMPL;
728}
729
730static HRESULT CompareCanonical(const BBITEMDATA &Data1, const BBITEMDATA &Data2)
731{
732 // This assumes two files with the same original path cannot be deleted at
733 // the same time (within the FAT/NTFS FILETIME resolution).
734 int result = CompareFileTime(&Data1.DeletionTime, &Data2.DeletionTime);
735 if (result == 0)
738}
739
741{
742 UINT column = UINT(lParam & SHCIDS_COLUMNMASK);
743 if (column >= COLUMNS_COUNT || !_ILGetFSType(pidl1) || !_ILGetFSType(pidl2))
744 return E_INVALIDARG;
745 BBITEMDATA *pData1 = ValidateItem(pidl1), *pData2 = ValidateItem(pidl2);
746 if ((!pData1 || !pData2) && column != COLUMN_NAME)
747 return E_INVALIDARG;
748
749 LPCWSTR pName1, pName2;
750 FILETIME ft1, ft2;
751 SHFILEINFOW shfi1, shfi2;
752 int result;
754 if (SUCCEEDED(hr))
755 return hr;
756 switch (column)
757 {
758 case COLUMN_NAME:
759 if (pData1 && pData2)
760 {
762 return CompareCanonical(*pData1, *pData2);
763 pName1 = GetItemOriginalFileName(*pData1);
764 pName2 = GetItemOriginalFileName(*pData2);
765 result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
766 }
767 else
768 {
769 // We support comparing names even for non-Recycle items because
770 // SHChangeNotify can broadcast regular FS items.
771 if (IShellFolder *pSF = GetFSFolderForItem(pidl1))
772 {
773 hr = pSF->CompareIDs(lParam, pidl1, pidl2);
774 pSF->Release();
775 return hr;
776 }
777 return E_INVALIDARG;
778 }
779 break;
780 case COLUMN_DELFROM:
781 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData1, const_cast<LPWSTR&>(pName1))))
782 {
783 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast<LPWSTR&>(pName2))))
784 {
785 result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
786 SHFree(const_cast<LPWSTR>(pName2));
787 }
788 SHFree(const_cast<LPWSTR>(pName1));
789 }
791 case COLUMN_DATEDEL:
792 result = CompareFileTime(&pData1->DeletionTime, &pData2->DeletionTime);
793 break;
794 case COLUMN_SIZE:
795 result = GetItemFileSize(pidl1) - GetItemFileSize(pidl2);
796 break;
797 case COLUMN_TYPE:
798 GetItemTypeName(pidl1, *pData1, shfi1);
799 GetItemTypeName(pidl2, *pData2, shfi2);
801 break;
802 case COLUMN_MTIME:
803 _ILGetFileDateTime(pidl1, &ft1);
804 _ILGetFileDateTime(pidl2, &ft2);
805 result = CompareFileTime(&ft1, &ft2);
806 break;
807 }
809}
810
812{
813 CComPtr<IShellView> pShellView;
815
816 TRACE("(%p, %p, %s, %p)\n", this, hwndOwner, debugstr_guid(&riid), ppv);
817
818 if (!ppv)
819 return hr;
820 *ppv = NULL;
821
822 if (IsEqualIID (riid, IID_IDropTarget))
823 {
825 }
826 else if (IsEqualIID (riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2))
827 {
828 m_IsBackgroundMenu = true;
829 hr = this->QueryInterface(riid, ppv);
830 }
831 else if (IsEqualIID (riid, IID_IShellView))
832 {
833 CComPtr<CRecycleBinFolderViewCB> sfviewcb;
834 hr = ShellObjectCreator(sfviewcb);
835 if (SUCCEEDED(hr))
836 {
837 SFV_CREATE create = { sizeof(create), this, NULL, sfviewcb };
839 if (SUCCEEDED(hr))
840 sfviewcb->Initialize(this, (IShellView*)*ppv, this->pidl);
841 }
842 }
843 else
844 return hr;
845
846 TRACE ("-- (%p)->(interface=%p)\n", this, ppv);
847 return hr;
848
849}
850
852 SFGAOF *rgfInOut)
853{
854 TRACE("(%p, %d, {%p, ...}, {%x})\n", this, cidl, apidl ? apidl[0] : NULL, (unsigned int)*rgfInOut);
855 HRESULT hr = S_OK;
856 const SFGAOF ThisFolder = SFGAO_FOLDER | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_CANRENAME | SFGAO_CANLINK;
857 if (!cidl)
858 {
859 *rgfInOut &= ThisFolder;
861 *rgfInOut &= ~SFGAO_HASPROPSHEET;
862 return hr;
863 }
864 SFGAOF remain = SFGAO_LINK & *rgfInOut;
865 *rgfInOut &= remain | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_FILESYSTEM; // TODO: SFGAO_CANMOVE
866 for (UINT i = 0; (*rgfInOut & remain) && i < cidl && SUCCEEDED(hr); ++i)
867 {
868 if (IShellFolder* pSF = GetFSFolderForItem(apidl[i]))
869 {
870 hr = pSF->GetAttributesOf(1, &apidl[i], rgfInOut);
871 pSF->Release();
872 }
873 }
874 return hr;
875}
876
878 REFIID riid, UINT *prgfInOut, void **ppv)
879{
880 LPVOID pObj = NULL;
882
883 TRACE ("(%p)->(%p,%u,apidl=%p, %p %p)\n", this,
884 hwndOwner, cidl, apidl, prgfInOut, ppv);
885
886 if (!ppv)
887 return hr;
888
889 *ppv = NULL;
890 assert(!cidl || (apidl && apidl[0]));
891
892 if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, IID_IContextMenu2)) && (cidl >= 1))
893 {
894 hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(cidl, apidl, riid, &pObj);
895 }
896 else if((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1))
897 {
898 if (IShellFolder *pSF = GetFSFolderForItem(apidl[0]))
899 {
900 hr = CRecyclerExtractIcon_CreateInstance(*pSF, apidl[0], riid, &pObj);
901 pSF->Release();
902 }
903 }
904 else
906
907 if (SUCCEEDED(hr) && !pObj)
909
910 *ppv = pObj;
911 TRACE ("(%p)->hr=0x%08x\n", this, hr);
912 return hr;
913}
914
916{
917 TRACE("(%p, %p, %x, %p)\n", this, pidl, (unsigned int)uFlags, pName);
919 if (!pData)
920 return E_INVALIDARG;
921
923 {
926 pszName = PathFindFileNameW(pszName);
927 pName->pOleStr = SHStrDupW(pszName);
928 }
929 else
930 {
933 else
935 }
936
937 if (pName->pOleStr)
938 {
939 pName->uType = STRRET_WSTR;
940 if (!IsFolder(pidl))
942 return S_OK;
943 }
944 pName->uType = STRRET_CSTR;
945 pName->cStr[0] = '\0';
946 return E_OUTOFMEMORY;
947}
948
950 SHGDNF uFlags, PITEMID_CHILD *ppidlOut)
951{
952 TRACE("\n");
953 return E_FAIL; /* not supported */
954}
955
957{
958 FIXME("stub\n");
959 return E_NOTIMPL;
960}
961
963{
964 FIXME("stub\n");
965 *ppEnum = NULL;
966 return E_NOTIMPL;
967}
968
970{
971 TRACE("(%p, %x, %p, %p)\n", this, (unsigned int)dwReserved, pSort, pDisplay);
972 if (pSort)
973 *pSort = 0;
974 if (pDisplay)
975 *pDisplay = 0;
976 return S_OK;
977}
978
980{
981 TRACE("(%p, %d, %p)\n", this, iColumn, pcsFlags);
982 if (iColumn >= COLUMNS_COUNT)
983 return E_INVALIDARG;
984 *pcsFlags = RecycleBinColumns[iColumn].pcsFlags;
985 return S_OK;
986}
987
989{
990 FIXME("stub\n");
991 return E_NOTIMPL;
992}
993
995{
996 HRESULT hr;
997 FILETIME ft;
998 SHFILEINFOW shfi;
1000
1001 TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, pDetails);
1002 if (iColumn >= COLUMNS_COUNT)
1003 return E_FAIL;
1004
1005 if (pidl == NULL)
1006 {
1007 pDetails->fmt = RecycleBinColumns[iColumn].fmt;
1008 pDetails->cxChar = RecycleBinColumns[iColumn].cxChars;
1009 return SHSetStrRet(&pDetails->str, RecycleBinColumns[iColumn].column_name_id);
1010 }
1011
1012 if (iColumn == COLUMN_NAME)
1013 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &pDetails->str);
1014
1017 return E_INVALIDARG;
1018
1019 switch (iColumn)
1020 {
1021 case COLUMN_DATEDEL:
1023 break;
1024 case COLUMN_DELFROM:
1025 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData, pDetails->str.pOleStr)))
1026 pDetails->str.uType = STRRET_WSTR;
1027 return hr;
1028 case COLUMN_SIZE:
1030 if (!IsFolder(pidl))
1032 break;
1033 case COLUMN_MTIME:
1036 break;
1037 case COLUMN_TYPE:
1038 GetItemTypeName(pidl, *pData, shfi);
1039 return SHSetStrRet(&pDetails->str, shfi.szTypeName);
1040 default:
1041 return E_FAIL;
1042 }
1043 return SHSetStrRet(&pDetails->str, buffer);
1044}
1045
1047{
1048 TRACE("(%p, %d, %p)\n", this, iColumn, pscid);
1049 if (iColumn >= COLUMNS_COUNT)
1050 return E_INVALIDARG;
1051 pscid->fmtid = *RecycleBinColumns[iColumn].fmtId;
1052 pscid->pid = RecycleBinColumns[iColumn].pid;
1053 return S_OK;
1054}
1055
1056/*************************************************************************
1057 * RecycleBin IContextMenu interface
1058 */
1059
1062{
1063 { "empty", IDC_EMPTYRECYCLEBIN },
1064 { "properties", IDC_PROPERTIES },
1065 { NULL }
1066};
1067
1068HRESULT WINAPI CRecycleBin::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
1069{
1070 TRACE("QueryContextMenu %p %p %u %u %u %u\n", this, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags );
1071
1072 if (!hMenu)
1073 return E_INVALIDARG;
1074
1075 UINT idHigh = 0, id;
1076
1078 id = idCmdFirst + IDC_EMPTYRECYCLEBIN;
1080 {
1081 idHigh = max(idHigh, id);
1083 {
1084 id = idCmdFirst + IDC_PROPERTIES;
1085 if (_InsertMenuItemW(hMenu, ++indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), 0))
1086 {
1087 idHigh = max(idHigh, id);
1088 _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0);
1089 }
1090 }
1091 }
1092 return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK;
1093}
1094
1096{
1097 TRACE("%p %p verb %p\n", this, lpcmi, lpcmi ? lpcmi->lpVerb : NULL);
1099 if (CmdId == IDC_EMPTYRECYCLEBIN)
1100 {
1101 HRESULT hr = SHEmptyRecycleBinW(lpcmi->hwnd, NULL, 0);
1102 TRACE("result %x\n", hr);
1103 return hr;
1104 }
1105 else if (CmdId == IDC_PROPERTIES)
1106 {
1108 }
1109 return E_INVALIDARG;
1110}
1111
1113{
1114 TRACE("%p %lu %u %p %p %u\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
1115 return SHELL_GetCommandStringImpl(idCommand, uFlags, lpszName, uMaxNameLen, g_BBFolderVerbMap);
1116}
1117
1118/*************************************************************************
1119 * RecycleBin IShellPropSheetExt interface
1120 */
1121
1123{
1125 return RecycleBin_AddPropSheetPages(pfnAddPage, lParam);
1126}
1127
1129{
1130 FIXME("%p %lu %p %lu\n", this, uPageID, pfnReplaceWith, lParam);
1131
1132 return E_NOTIMPL;
1133}
1134
1135/*************************************************************************
1136 * RecycleBin IShellExtInit interface
1137 */
1138
1140{
1141 TRACE("%p %p %p %p\n", this, pidlFolder, pdtobj, hkeyProgID );
1142 m_IsBackgroundMenu = false;
1143 return S_OK;
1144}
1145
1151BOOL
1153{
1154 LONG ret;
1155 DWORD dwNukeOnDelete, dwType, VolSerialNumber, MaxComponentLength;
1156 DWORD FileSystemFlags, dwSize, dwDisposition;
1157 HKEY hKey;
1158 WCHAR szBuffer[10];
1159 WCHAR szKey[150] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\";
1160
1161 if (wszPath[1] != L':')
1162 {
1163 /* path is UNC */
1164 return FALSE;
1165 }
1166
1167 // Copy and retrieve the root path from get given string
1168 WCHAR wszRootPathName[MAX_PATH];
1169 StringCbCopyW(wszRootPathName, sizeof(wszRootPathName), wszPath);
1170 PathStripToRootW(wszRootPathName);
1171
1172 // Test to see if the drive is fixed (non removable)
1173 if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED)
1174 {
1175 /* no bitbucket on removable media */
1176 return FALSE;
1177 }
1178
1179 if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0))
1180 {
1181 ERR("GetVolumeInformationW failed with %u wszRootPathName=%s\n", GetLastError(), debugstr_w(wszRootPathName));
1182 return FALSE;
1183 }
1184
1185 swprintf(szBuffer, L"%04X-%04X", LOWORD(VolSerialNumber), HIWORD(VolSerialNumber));
1186 wcscat(szKey, szBuffer);
1187
1188 if (RegCreateKeyExW(HKEY_CURRENT_USER, szKey, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS)
1189 {
1190 ERR("RegCreateKeyExW failed\n");
1191 return FALSE;
1192 }
1193
1194 if (dwDisposition & REG_CREATED_NEW_KEY)
1195 {
1196 /* per default move to bitbucket */
1197 dwNukeOnDelete = 0;
1198 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1199 /* per default unlimited size */
1200 dwSize = -1;
1201 RegSetValueExW(hKey, L"MaxCapacity", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD));
1202 }
1203 else
1204 {
1205 dwSize = sizeof(dwNukeOnDelete);
1206 ret = RegQueryValueExW(hKey, L"NukeOnDelete", NULL, &dwType, (LPBYTE)&dwNukeOnDelete, &dwSize);
1207 if (ret != ERROR_SUCCESS)
1208 {
1209 dwNukeOnDelete = 0;
1211 {
1212 /* restore key and enable bitbucket */
1213 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1214 }
1215 }
1216 }
1217 BOOL bCanTrash = !dwNukeOnDelete;
1218 // FIXME: Check if bitbucket is full (CORE-13743)
1220 return bCanTrash;
1221}
1222
1223BOOL
1225{
1226 TRACE("(%s)\n", debugstr_w(wszPath));
1227 return DeleteFileToRecycleBin(wszPath);
1228}
1229
1231{
1232 CRegKey regKey;
1234 CHeapPtr<WCHAR> pszSndPath;
1235 DWORD dwType, dwSize;
1236 LONG lError;
1237
1238 lError = regKey.Open(HKEY_CURRENT_USER,
1239 L"AppEvents\\Schemes\\Apps\\Explorer\\EmptyRecycleBin\\.Current",
1240 KEY_READ);
1241 if (lError != ERROR_SUCCESS)
1242 return;
1243
1244 lError = regKey.QueryValue(NULL, &dwType, NULL, &dwSize);
1245 if (lError != ERROR_SUCCESS)
1246 return;
1247
1248 if (!pszValue.AllocateBytes(dwSize))
1249 return;
1250
1251 lError = regKey.QueryValue(NULL, &dwType, pszValue, &dwSize);
1252 if (lError != ERROR_SUCCESS)
1253 return;
1254
1255 if (dwType == REG_EXPAND_SZ)
1256 {
1258 if (dwSize == 0)
1259 return;
1260
1261 if (!pszSndPath.Allocate(dwSize))
1262 return;
1263
1264 if (ExpandEnvironmentStringsW(pszValue, pszSndPath, dwSize) == 0)
1265 return;
1266 }
1267 else if (dwType == REG_SZ)
1268 {
1269 /* The type is REG_SZ, no need to expand */
1270 pszSndPath.Attach(pszValue.Detach());
1271 }
1272 else
1273 {
1274 /* Invalid type */
1275 return;
1276 }
1277
1279}
1280
1281/*************************************************************************
1282 * SHUpdateCRecycleBinIcon [SHELL32.@]
1283 *
1284 * Undocumented
1285 */
1287{
1288 FIXME("stub\n");
1289
1290 // HACK! This dwItem2 should be the icon index in the system image list that has changed.
1291 // FIXME: Call SHMapPIDLToSystemImageListIndex
1292 DWORD dwItem2 = -1;
1293
1295 return S_OK;
1296}
1297
1298/*************************************************************************
1299 * SHEmptyRecycleBinA (SHELL32.@)
1300 */
1302{
1303 LPWSTR szRootPathW = NULL;
1304 int len;
1305 HRESULT hr;
1306
1307 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_a(pszRootPath), dwFlags);
1308
1309 if (pszRootPath)
1310 {
1311 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1312 if (len == 0)
1314 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1315 if (!szRootPathW)
1316 return E_OUTOFMEMORY;
1317 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1318 {
1319 HeapFree(GetProcessHeap(), 0, szRootPathW);
1321 }
1322 }
1323
1324 hr = SHEmptyRecycleBinW(hwnd, szRootPathW, dwFlags);
1325 HeapFree(GetProcessHeap(), 0, szRootPathW);
1326
1327 return hr;
1328}
1329
1331{
1332 WCHAR szBuffer[MAX_PATH];
1333 DWORD count;
1334 LONG ret;
1335 IShellFolder *pDesktop, *pRecycleBin;
1336 PIDLIST_ABSOLUTE pidlRecycleBin;
1337 PITEMID_CHILD pidl;
1338 HRESULT hr = S_OK;
1339 LPENUMIDLIST penumFiles;
1340 STRRET StrRet;
1341
1342 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags);
1343
1345 {
1346 hr = SHGetDesktopFolder(&pDesktop);
1347 if (FAILED(hr))
1348 return hr;
1349 hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlRecycleBin);
1350 if (FAILED(hr))
1351 {
1352 pDesktop->Release();
1353 return hr;
1354 }
1355 hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder, &pRecycleBin));
1356 CoTaskMemFree(pidlRecycleBin);
1357 pDesktop->Release();
1358 if (FAILED(hr))
1359 return hr;
1360 hr = pRecycleBin->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumFiles);
1361 if (FAILED(hr))
1362 {
1363 pRecycleBin->Release();
1364 return hr;
1365 }
1366
1367 count = 0;
1368 if (hr != S_FALSE)
1369 {
1370 while (penumFiles->Next(1, &pidl, NULL) == S_OK)
1371 {
1372 count++;
1373 pRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &StrRet);
1374 StrRetToBuf(&StrRet, pidl, szBuffer, _countof(szBuffer));
1375 CoTaskMemFree(pidl);
1376 }
1377 penumFiles->Release();
1378 }
1379 pRecycleBin->Release();
1380
1381 switch (count)
1382 {
1383 case 0:
1384 /* no files, don't need confirmation */
1385 break;
1386
1387 case 1:
1388 /* we have only one item inside the bin, so show a message box with its name */
1391 {
1392 return S_OK;
1393 }
1394 break;
1395
1396 default:
1397 /* we have more than one item, so show a message box with the count of the items */
1398 StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%u", count);
1401 {
1402 return S_OK;
1403 }
1404 break;
1405 }
1406 }
1407
1409 {
1410 ret = EmptyRecycleBinW(pszRootPath);
1411 }
1412 else
1413 {
1414 /* FIXME
1415 * show a progress dialog
1416 */
1417 ret = EmptyRecycleBinW(pszRootPath);
1418 }
1419
1420 if (!ret)
1422
1424 if (!(dwFlags & SHERB_NOSOUND))
1425 {
1427 }
1428 return S_OK;
1429}
1430
1432{
1433 LPWSTR szRootPathW = NULL;
1434 int len;
1435 HRESULT hr;
1436
1437 TRACE("%s, %p\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
1438
1439 if (pszRootPath)
1440 {
1441 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1442 if (len == 0)
1444 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1445 if (!szRootPathW)
1446 return E_OUTOFMEMORY;
1447 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1448 {
1449 HeapFree(GetProcessHeap(), 0, szRootPathW);
1451 }
1452 }
1453
1454 hr = SHQueryRecycleBinW(szRootPathW, pSHQueryRBInfo);
1455 HeapFree(GetProcessHeap(), 0, szRootPathW);
1456
1457 return hr;
1458}
1459
1461{
1462 TRACE("%s, %p\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
1463
1464 if (!pszRootPath || (pszRootPath[0] == 0) ||
1465 !pSHQueryRBInfo || (pSHQueryRBInfo->cbSize < sizeof(SHQUERYRBINFO)))
1466 {
1467 return E_INVALIDARG;
1468 }
1469
1470 pSHQueryRBInfo->i64Size = 0;
1471 pSHQueryRBInfo->i64NumItems = 0;
1472
1473 CComPtr<IRecycleBin> spRecycleBin;
1474 HRESULT hr;
1475 if (FAILED_UNEXPECTEDLY((hr = GetDefaultRecycleBin(pszRootPath, &spRecycleBin))))
1476 return hr;
1477
1478 CComPtr<IRecycleBinEnumList> spEnumList;
1479 hr = spRecycleBin->EnumObjects(&spEnumList);
1480 if (!SUCCEEDED(hr))
1481 return hr;
1482
1483 while (TRUE)
1484 {
1485 CComPtr<IRecycleBinFile> spFile;
1486 hr = spEnumList->Next(1, &spFile, NULL);
1487 if (hr == S_FALSE)
1488 return S_OK;
1489
1491 return hr;
1492
1493 ULARGE_INTEGER Size = {};
1494 if (FAILED_UNEXPECTEDLY((hr = spFile->GetFileSize(&Size))))
1495 return hr;
1496
1497 pSHQueryRBInfo->i64Size += Size.QuadPart;
1498 pSHQueryRBInfo->i64NumItems++;
1499 }
1500
1501 return S_OK;
1502}
1503
1504/**************************************************************************
1505 * CRecycleBin::ParseRecycleBinPath
1506 *
1507 * Parses a filesystem path that points to an item in a drive's recycle bin
1508 * and creates a PIDL for it.
1509 *
1510 * Input: "C:\$Recycle.Bin\S-1-5-21-xxx\Dc1.txt"
1511 * Output: Complex PIDL representing the recycled item
1512 */
1514 LPCWSTR lpszPath,
1515 LPBC pbc,
1516 PIDLIST_RELATIVE *ppidl,
1517 DWORD *pdwAttributes)
1518{
1519 TRACE("(%p, %s, %p, %p)\n", this, debugstr_w(lpszPath), ppidl, pdwAttributes);
1520
1522 UNREFERENCED_PARAMETER(pdwAttributes);
1523 if (!ppidl || !lpszPath)
1524 return E_INVALIDARG;
1525
1526 *ppidl = NULL;
1527
1528 if (!lpszPath[0] || lpszPath[1] != L':' || lpszPath[2] != L'\\')
1529 return E_INVALIDARG;
1530
1531 CComPtr<IEnumIDList> pList;
1534 return hr;
1535
1536 for (;;)
1537 {
1538 CComHeapPtr<ITEMIDLIST> pidl;
1539 ULONG cFetched;
1540 hr = pList->Next(1, &pidl, &cFetched);
1541 if (hr != S_OK)
1542 break;
1543
1545 if (!pData)
1546 continue;
1547
1548 LPCWSTR pszItemPath = GetItemRecycledFullPath(*pData);
1549 if (!_wcsicmp(lpszPath, pszItemPath))
1550 {
1551 *ppidl = pidl.Detach();
1552 return S_OK;
1553 }
1554 }
1555
1556 return E_FAIL;
1557}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4823
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:39
static BOOL IsRecycleBinEmpty(IShellFolder *pSF)
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 void CRecycleBin_ChangeNotifyBBItem(_In_ LONG Event, _In_opt_ LPCITEMIDLIST BBItem)
static const CMVERBMAP g_BBFolderVerbMap[]
static void CRecycleBin_NotifyRemovedFromRecycleBin(LPCITEMIDLIST BBItem)
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 BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl)
static LPCWSTR GetItemOriginalFileName(const BBITEMDATA &Data)
@ IDC_EMPTYRECYCLEBIN
@ IDC_PROPERTIES
static HRESULT GetItemTypeName(PCUITEMID_CHILD pidl, const BBITEMDATA &Data, SHFILEINFOW &shfi)
HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
struct _FILEOPDATA FILEOPDATA
static HRESULT CALLBACK FileOpCallback(FILEOPCALLBACKEVENT Event, LPCWSTR Src, LPCWSTR Dst, UINT Attrib, HRESULT hrOp, void *CallerData)
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
@ IDC_BB_DELETE
@ IDC_BB_RESTORE
@ IDC_BB_CUT
@ IDC_BB_PROPERTIES
static LPCWSTR GetItemOriginalFullPath(const BBITEMDATA &Data)
#define BBITEMFOLDERTYPE
Definition: CRecycleBin.cpp:65
static LPWSTR CreateFileOpStrings(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, BOOL RecycledPath)
#define BBITEMFILETYPE
Definition: CRecycleBin.cpp:64
static HRESULT GetItemOriginalFolder(const BBITEMDATA &Data, LPWSTR &Out)
HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
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 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:108
#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 HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: CFSFolder.cpp:1116
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2171
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2155
static int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam=0)
Definition: CFSFolder.h:132
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
STDMETHOD() GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
HRESULT WINAPI Initialize(UINT cidl, PCUITEMID_CHILD_ARRAY apidl)
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
HRESULT ParseRecycleBinPath(LPCWSTR lpszPath, LPBC pbc, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
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
#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:89
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:88
#define IDC_PROPERTIES
Definition: resource.h:32
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
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 lstrlenW
Definition: compat.h:750
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:520
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
int WINAPI PathGetDriveNumberW(const WCHAR *path)
Definition: path.c:1810
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1701
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1145
BOOL WINAPI PathStripToRootW(WCHAR *path)
Definition: path.c:1195
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags)
Definition: CFSFolder.cpp:1479
#define ShellMessageBoxW
Definition: precomp.h:63
enum _FILEOPCALLBACKEVENT FILEOPCALLBACKEVENT
@ FOCE_POSTDELETEITEM
Definition: precomp.h:351
@ FOCE_FINISHOPERATIONS
Definition: precomp.h:345
@ FOCE_POSTMOVEITEM
Definition: precomp.h:347
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:360
int SHELL32_FileOperation(LPSHFILEOPSTRUCTW lpFileOp, FILEOPCALLBACK Callback, void *CallerData)
Definition: shlfileop.cpp:2093
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:352
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:321
EXTERN_C BOOL RemoveFromRecycleBinDatabase(IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:287
BOOL WINAPI CloseRecycleBinHandle(IN HDELFILE hDeletedFile)
Definition: recyclebin.c:12
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1792
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1758
static HRESULT SHELL_CreateFallbackExtractIconForNoAssocFile(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:117
static HRESULT SHELL_CreateFallbackExtractIconForFolder(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:110
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3277
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2148
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define swprintf
Definition: precomp.h:40
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
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 res
Definition: glext.h:9613
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
HLOCAL NTAPI LocalReAlloc(HLOCAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:1625
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
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)
@ SHCONTF_INCLUDEHIDDEN
Definition: shobjidl.idl:175
@ SHCONTF_NONFOLDERS
Definition: shobjidl.idl:174
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:199
#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 PT_FS_UNICODE_FLAG
Definition: lnktool.cpp:41
#define Dst
Definition: mesh.h:153
#define LMEM_MOVEABLE
Definition: minwinbase.h:82
#define ZeroMemory
Definition: minwinbase.h:31
#define LPTR
Definition: minwinbase.h:93
#define CopyMemory
Definition: minwinbase.h:29
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#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:38
static const struct access_res create[16]
Definition: package.c:7505
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:60
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
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define KEY_READ
Definition: nt_native.h:1026
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1087
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define KEY_WRITE
Definition: nt_native.h:1034
#define REG_EXPAND_SZ
Definition: nt_native.h:1497
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#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
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:446
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
Definition: pidl.c:2629
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2450
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2614
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
LPITEMIDLIST SHELL32_CreateSimpleIDListFromPath(LPCWSTR pszPath, DWORD dwAttributes)
Definition: pidl.c:1195
BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
Definition: pidl.c:2492
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2198
static BYTE _ILGetType(LPCITEMIDLIST pidl)
Definition: pidl.h:144
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:149
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
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
#define StrRetToBuf
Definition: shlwapi.h:1241
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
Definition: shlwapi.h:783
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:615
wcscat
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:177
#define ASK_DELETE_FILE
Definition: shell32_main.h:175
#define ASK_DELETE_FOLDER
Definition: shell32_main.h:176
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define FOF_MULTIDESTFILES
Definition: shellapi.h:141
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
#define FO_DELETE
Definition: shellapi.h:138
#define SHERB_NOSOUND
Definition: shellapi.h:410
#define FOF_NOERRORUI
Definition: shellapi.h:151
#define FOF_NOCONFIRMMKDIR
Definition: shellapi.h:150
#define FOF_NOCONFIRMATION
Definition: shellapi.h:145
#define FO_MOVE
Definition: shellapi.h:136
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:409
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:408
#define FOF_SILENT
Definition: shellapi.h:143
#define StrRet
Definition: shellclasses.h:871
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
#define SHELL_ErrorBox
Definition: shellutils.h:126
#define IS_SHGDN_FOR_PARSING(flags)
Definition: shfldr.h:78
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
#define COLUMN_NAME
#define COLUMN_TYPE
#define DE_OPCANCELLED
Definition: shlfileop.c:45
BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir)
Definition: shlfileop.cpp:375
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:1899
#define SHCNE_DELETE
Definition: shlobj.h:1897
#define SHCNE_MKDIR
Definition: shlobj.h:1898
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1907
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1910
#define SHCNE_CREATE
Definition: shlobj.h:1896
#define SHCNF_DWORD
Definition: shlobj.h:1930
@ REST_BITBUCKNOPROP
Definition: shlobj.h:1815
#define CSIDL_BITBUCKET
Definition: shlobj.h:2189
#define SHCNF_IDLIST
Definition: shlobj.h:1927
LPARAM LPFNSVADDPROPSHEETPAGE
Definition: shobjidl.idl:117
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define IDS_SHV_COLUMN_DELFROM
Definition: shresdef.h:58
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:871
#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:870
#define IDS_DELETEITEM_TEXT
Definition: shresdef.h:124
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:868
#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
PCUITEMID_CHILD_ARRAY apidl
WCHAR szTypeName[80]
Definition: shellapi.h:388
FILEOP_FLAGS fFlags
Definition: shellapi.h:371
__int64 i64Size
Definition: shellapi.h:392
__int64 i64NumItems
Definition: shellapi.h:393
DWORD cbSize
Definition: shellapi.h:391
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
FILETIME ftLastWriteTime
Definition: minwinbase.h:286
DWORD dwFileAttributes
Definition: minwinbase.h:283
const GUID * fmtId
Definition: CRecycleBin.cpp:33
int column_name_id
Definition: CRecycleBin.cpp:32
Definition: fci.c:116
Definition: mem.c:349
WORD uFileDate
Definition: pidl.h:202
WORD uFileAttribs
Definition: pidl.h:204
WORD uFileTime
Definition: pidl.h:203
DWORD dwFileSize
Definition: pidl.h:201
BYTE dummy
Definition: pidl.h:200
CHAR szNames[1]
Definition: pidl.h:205
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
#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
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define DRIVE_FIXED
Definition: winbase.h:276
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2521
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#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 SEVERITY_SUCCESS
Definition: winerror.h:177
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define E_UNEXPECTED
Definition: winerror.h:3528
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO _In_opt_ LPVOID lpReserved
Definition: winnls.h:1268
#define HKEY_CURRENT_USER
Definition: winreg.h:11
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define MFS_DISABLED
Definition: winuser.h:760
#define MB_YESNO
Definition: winuser.h:828
#define MFT_SEPARATOR
Definition: winuser.h:755
#define IDNO
Definition: winuser.h:847
#define MB_ICONEXCLAMATION
Definition: winuser.h:796
#define MFS_ENABLED
Definition: winuser.h:761
#define MB_DEFBUTTON2
Definition: winuser.h:810
#define MFT_STRING
Definition: winuser.h:757
#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
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193