ReactOS 0.4.16-dev-975-g3b8cfa4
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);
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);
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 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this };
834 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppv);
835 }
836 else
837 return hr;
838
839 TRACE ("-- (%p)->(interface=%p)\n", this, ppv);
840 return hr;
841
842}
843
845 SFGAOF *rgfInOut)
846{
847 TRACE("(%p, %d, {%p, ...}, {%x})\n", this, cidl, apidl ? apidl[0] : NULL, (unsigned int)*rgfInOut);
848 HRESULT hr = S_OK;
849 const SFGAOF ThisFolder = SFGAO_FOLDER | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_CANRENAME | SFGAO_CANLINK;
850 if (!cidl)
851 {
852 *rgfInOut &= ThisFolder;
854 *rgfInOut &= ~SFGAO_HASPROPSHEET;
855 return hr;
856 }
857 SFGAOF remain = SFGAO_LINK & *rgfInOut;
858 *rgfInOut &= remain | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_FILESYSTEM; // TODO: SFGAO_CANMOVE
859 for (UINT i = 0; (*rgfInOut & remain) && i < cidl && SUCCEEDED(hr); ++i)
860 {
861 if (IShellFolder* pSF = GetFSFolderForItem(apidl[i]))
862 {
863 hr = pSF->GetAttributesOf(1, &apidl[i], rgfInOut);
864 pSF->Release();
865 }
866 }
867 return hr;
868}
869
871 REFIID riid, UINT *prgfInOut, void **ppv)
872{
873 LPVOID pObj = NULL;
875
876 TRACE ("(%p)->(%p,%u,apidl=%p, %p %p)\n", this,
877 hwndOwner, cidl, apidl, prgfInOut, ppv);
878
879 if (!ppv)
880 return hr;
881
882 *ppv = NULL;
883 assert(!cidl || (apidl && apidl[0]));
884
885 if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, IID_IContextMenu2)) && (cidl >= 1))
886 {
887 hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(cidl, apidl, riid, &pObj);
888 }
889 else if((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1))
890 {
891 if (IShellFolder *pSF = GetFSFolderForItem(apidl[0]))
892 {
893 hr = CRecyclerExtractIcon_CreateInstance(*pSF, apidl[0], riid, &pObj);
894 pSF->Release();
895 }
896 }
897 else
899
900 if (SUCCEEDED(hr) && !pObj)
902
903 *ppv = pObj;
904 TRACE ("(%p)->hr=0x%08x\n", this, hr);
905 return hr;
906}
907
909{
910 TRACE("(%p, %p, %x, %p)\n", this, pidl, (unsigned int)uFlags, pName);
912 if (!pData)
913 return E_INVALIDARG;
914
916 {
919 pszName = PathFindFileNameW(pszName);
920 pName->pOleStr = SHStrDupW(pszName);
921 }
922 else
923 {
926 else
928 }
929
930 if (pName->pOleStr)
931 {
932 pName->uType = STRRET_WSTR;
933 if (!IsFolder(pidl))
935 return S_OK;
936 }
937 pName->uType = STRRET_CSTR;
938 pName->cStr[0] = '\0';
939 return E_OUTOFMEMORY;
940}
941
943 SHGDNF uFlags, PITEMID_CHILD *ppidlOut)
944{
945 TRACE("\n");
946 return E_FAIL; /* not supported */
947}
948
950{
951 FIXME("stub\n");
952 return E_NOTIMPL;
953}
954
956{
957 FIXME("stub\n");
958 *ppEnum = NULL;
959 return E_NOTIMPL;
960}
961
963{
964 TRACE("(%p, %x, %p, %p)\n", this, (unsigned int)dwReserved, pSort, pDisplay);
965 if (pSort)
966 *pSort = 0;
967 if (pDisplay)
968 *pDisplay = 0;
969 return S_OK;
970}
971
973{
974 TRACE("(%p, %d, %p)\n", this, iColumn, pcsFlags);
975 if (iColumn >= COLUMNS_COUNT)
976 return E_INVALIDARG;
977 *pcsFlags = RecycleBinColumns[iColumn].pcsFlags;
978 return S_OK;
979}
980
982{
983 FIXME("stub\n");
984 return E_NOTIMPL;
985}
986
988{
989 HRESULT hr;
990 FILETIME ft;
991 SHFILEINFOW shfi;
993
994 TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, pDetails);
995 if (iColumn >= COLUMNS_COUNT)
996 return E_FAIL;
997
998 if (pidl == NULL)
999 {
1000 pDetails->fmt = RecycleBinColumns[iColumn].fmt;
1001 pDetails->cxChar = RecycleBinColumns[iColumn].cxChars;
1002 return SHSetStrRet(&pDetails->str, RecycleBinColumns[iColumn].column_name_id);
1003 }
1004
1005 if (iColumn == COLUMN_NAME)
1006 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &pDetails->str);
1007
1010 return E_INVALIDARG;
1011
1012 switch (iColumn)
1013 {
1014 case COLUMN_DATEDEL:
1016 break;
1017 case COLUMN_DELFROM:
1018 if (SUCCEEDED(hr = GetItemOriginalFolder(*pData, pDetails->str.pOleStr)))
1019 pDetails->str.uType = STRRET_WSTR;
1020 return hr;
1021 case COLUMN_SIZE:
1023 if (!IsFolder(pidl))
1025 break;
1026 case COLUMN_MTIME:
1029 break;
1030 case COLUMN_TYPE:
1031 GetItemTypeName(pidl, *pData, shfi);
1032 return SHSetStrRet(&pDetails->str, shfi.szTypeName);
1033 default:
1034 return E_FAIL;
1035 }
1036 return SHSetStrRet(&pDetails->str, buffer);
1037}
1038
1040{
1041 TRACE("(%p, %d, %p)\n", this, iColumn, pscid);
1042 if (iColumn >= COLUMNS_COUNT)
1043 return E_INVALIDARG;
1044 pscid->fmtid = *RecycleBinColumns[iColumn].fmtId;
1045 pscid->pid = RecycleBinColumns[iColumn].pid;
1046 return S_OK;
1047}
1048
1049/*************************************************************************
1050 * RecycleBin IContextMenu interface
1051 */
1052
1055{
1056 { "empty", IDC_EMPTYRECYCLEBIN },
1057 { "properties", IDC_PROPERTIES },
1058 { NULL }
1059};
1060
1061HRESULT WINAPI CRecycleBin::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
1062{
1063 TRACE("QueryContextMenu %p %p %u %u %u %u\n", this, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags );
1064
1065 if (!hMenu)
1066 return E_INVALIDARG;
1067
1068 UINT idHigh = 0, id;
1069
1071 id = idCmdFirst + IDC_EMPTYRECYCLEBIN;
1073 {
1074 idHigh = max(idHigh, id);
1076 {
1077 id = idCmdFirst + IDC_PROPERTIES;
1078 if (_InsertMenuItemW(hMenu, ++indexMenu, TRUE, id, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), 0))
1079 {
1080 idHigh = max(idHigh, id);
1081 _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, 0);
1082 }
1083 }
1084 }
1085 return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK;
1086}
1087
1089{
1090 TRACE("%p %p verb %p\n", this, lpcmi, lpcmi ? lpcmi->lpVerb : NULL);
1092 if (CmdId == IDC_EMPTYRECYCLEBIN)
1093 {
1094 HRESULT hr = SHEmptyRecycleBinW(lpcmi->hwnd, NULL, 0);
1095 TRACE("result %x\n", hr);
1096 if (hr != S_OK)
1097 return hr;
1098#if 0 // This is a nasty hack because lpcmi->hwnd might not be a shell browser.
1099 // Not required with working SHChangeNotify.
1100 CComPtr<IShellView> pSV;
1101 LPSHELLBROWSER lpSB = (LPSHELLBROWSER)SendMessage(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0);
1102 if (lpSB && SUCCEEDED(lpSB->QueryActiveShellView(&pSV)))
1103 pSV->Refresh();
1104#endif
1105 return hr;
1106 }
1107 else if (CmdId == IDC_PROPERTIES)
1108 {
1110 }
1111 return E_INVALIDARG;
1112}
1113
1115{
1116 TRACE("%p %lu %u %p %p %u\n", this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
1117 return SHELL_GetCommandStringImpl(idCommand, uFlags, lpszName, uMaxNameLen, g_BBFolderVerbMap);
1118}
1119
1120/*************************************************************************
1121 * RecycleBin IShellPropSheetExt interface
1122 */
1123
1125{
1127 return RecycleBin_AddPropSheetPages(pfnAddPage, lParam);
1128}
1129
1131{
1132 FIXME("%p %lu %p %lu\n", this, uPageID, pfnReplaceWith, lParam);
1133
1134 return E_NOTIMPL;
1135}
1136
1137/*************************************************************************
1138 * RecycleBin IShellExtInit interface
1139 */
1140
1142{
1143 TRACE("%p %p %p %p\n", this, pidlFolder, pdtobj, hkeyProgID );
1144 m_IsBackgroundMenu = false;
1145 return S_OK;
1146}
1147
1153BOOL
1155{
1156 LONG ret;
1157 DWORD dwNukeOnDelete, dwType, VolSerialNumber, MaxComponentLength;
1158 DWORD FileSystemFlags, dwSize, dwDisposition;
1159 HKEY hKey;
1160 WCHAR szBuffer[10];
1161 WCHAR szKey[150] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume\\";
1162
1163 if (wszPath[1] != L':')
1164 {
1165 /* path is UNC */
1166 return FALSE;
1167 }
1168
1169 // Copy and retrieve the root path from get given string
1170 WCHAR wszRootPathName[MAX_PATH];
1171 StringCbCopyW(wszRootPathName, sizeof(wszRootPathName), wszPath);
1172 PathStripToRootW(wszRootPathName);
1173
1174 // Test to see if the drive is fixed (non removable)
1175 if (GetDriveTypeW(wszRootPathName) != DRIVE_FIXED)
1176 {
1177 /* no bitbucket on removable media */
1178 return FALSE;
1179 }
1180
1181 if (!GetVolumeInformationW(wszRootPathName, NULL, 0, &VolSerialNumber, &MaxComponentLength, &FileSystemFlags, NULL, 0))
1182 {
1183 ERR("GetVolumeInformationW failed with %u wszRootPathName=%s\n", GetLastError(), debugstr_w(wszRootPathName));
1184 return FALSE;
1185 }
1186
1187 swprintf(szBuffer, L"%04X-%04X", LOWORD(VolSerialNumber), HIWORD(VolSerialNumber));
1188 wcscat(szKey, szBuffer);
1189
1190 if (RegCreateKeyExW(HKEY_CURRENT_USER, szKey, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS)
1191 {
1192 ERR("RegCreateKeyExW failed\n");
1193 return FALSE;
1194 }
1195
1196 if (dwDisposition & REG_CREATED_NEW_KEY)
1197 {
1198 /* per default move to bitbucket */
1199 dwNukeOnDelete = 0;
1200 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1201 /* per default unlimited size */
1202 dwSize = -1;
1203 RegSetValueExW(hKey, L"MaxCapacity", 0, REG_DWORD, (LPBYTE)&dwSize, sizeof(DWORD));
1204 }
1205 else
1206 {
1207 dwSize = sizeof(dwNukeOnDelete);
1208 ret = RegQueryValueExW(hKey, L"NukeOnDelete", NULL, &dwType, (LPBYTE)&dwNukeOnDelete, &dwSize);
1209 if (ret != ERROR_SUCCESS)
1210 {
1211 dwNukeOnDelete = 0;
1213 {
1214 /* restore key and enable bitbucket */
1215 RegSetValueExW(hKey, L"NukeOnDelete", 0, REG_DWORD, (LPBYTE)&dwNukeOnDelete, sizeof(DWORD));
1216 }
1217 }
1218 }
1219 BOOL bCanTrash = !dwNukeOnDelete;
1220 // FIXME: Check if bitbucket is full (CORE-13743)
1222 return bCanTrash;
1223}
1224
1225BOOL
1227{
1228 TRACE("(%s)\n", debugstr_w(wszPath));
1229 return DeleteFileToRecycleBin(wszPath);
1230}
1231
1233{
1234 CRegKey regKey;
1235 CHeapPtr<WCHAR> pszValue;
1236 CHeapPtr<WCHAR> pszSndPath;
1237 DWORD dwType, dwSize;
1238 LONG lError;
1239
1240 lError = regKey.Open(HKEY_CURRENT_USER,
1241 L"AppEvents\\Schemes\\Apps\\Explorer\\EmptyRecycleBin\\.Current",
1242 KEY_READ);
1243 if (lError != ERROR_SUCCESS)
1244 return;
1245
1246 lError = regKey.QueryValue(NULL, &dwType, NULL, &dwSize);
1247 if (lError != ERROR_SUCCESS)
1248 return;
1249
1250 if (!pszValue.AllocateBytes(dwSize))
1251 return;
1252
1253 lError = regKey.QueryValue(NULL, &dwType, pszValue, &dwSize);
1254 if (lError != ERROR_SUCCESS)
1255 return;
1256
1257 if (dwType == REG_EXPAND_SZ)
1258 {
1259 dwSize = ExpandEnvironmentStringsW(pszValue, NULL, 0);
1260 if (dwSize == 0)
1261 return;
1262
1263 if (!pszSndPath.Allocate(dwSize))
1264 return;
1265
1266 if (ExpandEnvironmentStringsW(pszValue, pszSndPath, dwSize) == 0)
1267 return;
1268 }
1269 else if (dwType == REG_SZ)
1270 {
1271 /* The type is REG_SZ, no need to expand */
1272 pszSndPath.Attach(pszValue.Detach());
1273 }
1274 else
1275 {
1276 /* Invalid type */
1277 return;
1278 }
1279
1281}
1282
1283/*************************************************************************
1284 * SHUpdateCRecycleBinIcon [SHELL32.@]
1285 *
1286 * Undocumented
1287 */
1289{
1290 FIXME("stub\n");
1291
1292 // HACK! This dwItem2 should be the icon index in the system image list that has changed.
1293 // FIXME: Call SHMapPIDLToSystemImageListIndex
1294 DWORD dwItem2 = -1;
1295
1297 return S_OK;
1298}
1299
1300/*************************************************************************
1301 * SHEmptyRecycleBinA (SHELL32.@)
1302 */
1304{
1305 LPWSTR szRootPathW = NULL;
1306 int len;
1307 HRESULT hr;
1308
1309 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_a(pszRootPath), dwFlags);
1310
1311 if (pszRootPath)
1312 {
1313 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1314 if (len == 0)
1316 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1317 if (!szRootPathW)
1318 return E_OUTOFMEMORY;
1319 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1320 {
1321 HeapFree(GetProcessHeap(), 0, szRootPathW);
1323 }
1324 }
1325
1326 hr = SHEmptyRecycleBinW(hwnd, szRootPathW, dwFlags);
1327 HeapFree(GetProcessHeap(), 0, szRootPathW);
1328
1329 return hr;
1330}
1331
1333{
1334 WCHAR szBuffer[MAX_PATH];
1335 DWORD count;
1336 LONG ret;
1337 IShellFolder *pDesktop, *pRecycleBin;
1338 PIDLIST_ABSOLUTE pidlRecycleBin;
1339 PITEMID_CHILD pidl;
1340 HRESULT hr = S_OK;
1341 LPENUMIDLIST penumFiles;
1342 STRRET StrRet;
1343
1344 TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags);
1345
1347 {
1348 hr = SHGetDesktopFolder(&pDesktop);
1349 if (FAILED(hr))
1350 return hr;
1351 hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlRecycleBin);
1352 if (FAILED(hr))
1353 {
1354 pDesktop->Release();
1355 return hr;
1356 }
1357 hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder, &pRecycleBin));
1358 CoTaskMemFree(pidlRecycleBin);
1359 pDesktop->Release();
1360 if (FAILED(hr))
1361 return hr;
1362 hr = pRecycleBin->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumFiles);
1363 if (FAILED(hr))
1364 {
1365 pRecycleBin->Release();
1366 return hr;
1367 }
1368
1369 count = 0;
1370 if (hr != S_FALSE)
1371 {
1372 while (penumFiles->Next(1, &pidl, NULL) == S_OK)
1373 {
1374 count++;
1375 pRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &StrRet);
1376 StrRetToBuf(&StrRet, pidl, szBuffer, _countof(szBuffer));
1377 CoTaskMemFree(pidl);
1378 }
1379 penumFiles->Release();
1380 }
1381 pRecycleBin->Release();
1382
1383 switch (count)
1384 {
1385 case 0:
1386 /* no files, don't need confirmation */
1387 break;
1388
1389 case 1:
1390 /* we have only one item inside the bin, so show a message box with its name */
1393 {
1394 return S_OK;
1395 }
1396 break;
1397
1398 default:
1399 /* we have more than one item, so show a message box with the count of the items */
1400 StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%u", count);
1403 {
1404 return S_OK;
1405 }
1406 break;
1407 }
1408 }
1409
1411 {
1412 ret = EmptyRecycleBinW(pszRootPath);
1413 }
1414 else
1415 {
1416 /* FIXME
1417 * show a progress dialog
1418 */
1419 ret = EmptyRecycleBinW(pszRootPath);
1420 }
1421
1422 if (!ret)
1424
1426 if (!(dwFlags & SHERB_NOSOUND))
1427 {
1429 }
1430 return S_OK;
1431}
1432
1434{
1435 LPWSTR szRootPathW = NULL;
1436 int len;
1437 HRESULT hr;
1438
1439 TRACE("%s, %p\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
1440
1441 if (pszRootPath)
1442 {
1443 len = MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, NULL, 0);
1444 if (len == 0)
1446 szRootPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
1447 if (!szRootPathW)
1448 return E_OUTOFMEMORY;
1449 if (MultiByteToWideChar(CP_ACP, 0, pszRootPath, -1, szRootPathW, len) == 0)
1450 {
1451 HeapFree(GetProcessHeap(), 0, szRootPathW);
1453 }
1454 }
1455
1456 hr = SHQueryRecycleBinW(szRootPathW, pSHQueryRBInfo);
1457 HeapFree(GetProcessHeap(), 0, szRootPathW);
1458
1459 return hr;
1460}
1461
1463{
1464 TRACE("%s, %p\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
1465
1466 if (!pszRootPath || (pszRootPath[0] == 0) ||
1467 !pSHQueryRBInfo || (pSHQueryRBInfo->cbSize < sizeof(SHQUERYRBINFO)))
1468 {
1469 return E_INVALIDARG;
1470 }
1471
1472 pSHQueryRBInfo->i64Size = 0;
1473 pSHQueryRBInfo->i64NumItems = 0;
1474
1475 CComPtr<IRecycleBin> spRecycleBin;
1476 HRESULT hr;
1477 if (FAILED_UNEXPECTEDLY((hr = GetDefaultRecycleBin(pszRootPath, &spRecycleBin))))
1478 return hr;
1479
1480 CComPtr<IRecycleBinEnumList> spEnumList;
1481 hr = spRecycleBin->EnumObjects(&spEnumList);
1482 if (!SUCCEEDED(hr))
1483 return hr;
1484
1485 while (TRUE)
1486 {
1487 CComPtr<IRecycleBinFile> spFile;
1488 hr = spEnumList->Next(1, &spFile, NULL);
1489 if (hr == S_FALSE)
1490 return S_OK;
1491
1493 return hr;
1494
1495 ULARGE_INTEGER Size = {};
1496 if (FAILED_UNEXPECTEDLY((hr = spFile->GetFileSize(&Size))))
1497 return hr;
1498
1499 pSHQueryRBInfo->i64Size += Size.QuadPart;
1500 pSHQueryRBInfo->i64NumItems++;
1501 }
1502
1503 return S_OK;
1504}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4794
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)
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)
@ IDC_EMPTYRECYCLEBIN
@ IDC_PROPERTIES
static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl)
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)
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
static LPCWSTR GetItemOriginalFullPath(const BBITEMDATA &Data)
#define BBITEMFOLDERTYPE
Definition: CRecycleBin.cpp:65
static LPWSTR CreateFileOpStrings(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, BOOL RecycledPath)
@ IDC_BB_DELETE
@ IDC_BB_RESTORE
@ IDC_BB_CUT
@ IDC_BB_PROPERTIES
#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 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: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 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:2113
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2097
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
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
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:78
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:77
#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
#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:63
enum _FILEOPCALLBACKEVENT FILEOPCALLBACKEVENT
@ FOCE_POSTDELETEITEM
Definition: precomp.h:329
@ FOCE_FINISHOPERATIONS
Definition: precomp.h:323
@ FOCE_POSTMOVEITEM
Definition: precomp.h:325
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
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:1783
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1749
static HRESULT SHELL_CreateFallbackExtractIconForNoAssocFile(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:103
static HRESULT SHELL_CreateFallbackExtractIconForFolder(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:96
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:3301
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 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
_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:205
#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 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
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
Definition: pidl.c:2589
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:2408
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2572
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:2450
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2156
static BYTE _ILGetType(LPCITEMIDLIST pidl)
Definition: pidl.h:124
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:129
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:138
#define ASK_DELETE_FILE
Definition: shell32_main.h:136
#define ASK_DELETE_FOLDER
Definition: shell32_main.h:137
#define SHGFI_TYPENAME
Definition: shellapi.h:168
#define FOF_MULTIDESTFILES
Definition: shellapi.h:142
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:182
#define FO_DELETE
Definition: shellapi.h:139
#define SHERB_NOSOUND
Definition: shellapi.h:399
#define FOF_NOERRORUI
Definition: shellapi.h:152
#define FOF_NOCONFIRMMKDIR
Definition: shellapi.h:151
#define FOF_NOCONFIRMATION
Definition: shellapi.h:146
#define FO_MOVE
Definition: shellapi.h:137
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:398
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:397
#define FOF_SILENT
Definition: shellapi.h:144
#define StrRet
Definition: shellclasses.h:871
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:623
#define SHELL_ErrorBox
Definition: shellutils.h:126
#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
#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:1902
#define SHCNE_DELETE
Definition: shlobj.h:1900
#define SHCNE_MKDIR
Definition: shlobj.h:1901
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1910
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1913
#define SHCNE_CREATE
Definition: shlobj.h:1899
#define SHCNF_DWORD
Definition: shlobj.h:1932
struct _SFV_CREATE SFV_CREATE
@ REST_BITBUCKNOPROP
Definition: shlobj.h:1818
#define CSIDL_BITBUCKET
Definition: shlobj.h:2191
#define SHCNF_IDLIST
Definition: shlobj.h:1929
#define StrRetToBuf
Definition: shlwapi.h:1804
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:854
#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:853
#define IDS_DELETEITEM_TEXT
Definition: shresdef.h:124
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:852
#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:377
FILEOP_FLAGS fFlags
Definition: shellapi.h:360
__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
Definition: mem.c:349
WORD uFileDate
Definition: pidl.h:182
WORD uFileAttribs
Definition: pidl.h:184
WORD uFileTime
Definition: pidl.h:183
DWORD dwFileSize
Definition: pidl.h:181
BYTE dummy
Definition: pidl.h:180
CHAR szNames[1]
Definition: pidl.h:185
#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
#define CWM_GETISHELLBROWSER
Definition: undocshell.h:248
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define LMEM_MOVEABLE
Definition: winbase.h:395
#define ZeroMemory
Definition: winbase.h:1743
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define LPTR
Definition: winbase.h:407
#define CopyMemory
Definition: winbase.h:1741
#define DRIVE_FIXED
Definition: winbase.h:278
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2798
_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 ERROR_CANCELLED
Definition: winerror.h:726
#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:760
#define MB_YESNO
Definition: winuser.h:828
#define MFT_SEPARATOR
Definition: winuser.h:755
#define IDNO
Definition: winuser.h:847
#define SendMessage
Definition: winuser.h:5863
#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
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