ReactOS 0.4.16-dev-2216-ga08d639
CRecycleBin.cpp File Reference
#include <precomp.h>
#include <mmsystem.h>
#include <ntquery.h>
#include "pshpack1.h"
#include "poppack.h"
Include dependency graph for CRecycleBin.cpp:

Go to the source code of this file.

Classes

struct  columninfo
 
struct  BBITEMDATA
 
struct  BBITEMFOOTER
 
class  CRecycleBinItemContextMenu
 
class  CRecycleBinEnum
 
struct  _FILEOPDATA
 

Macros

#define COLUMN_NAME   0
 
#define COLUMN_DELFROM   1
 
#define COLUMN_DATEDEL   2
 
#define COLUMN_SIZE   3
 
#define COLUMN_TYPE   4
 
#define COLUMN_MTIME   5
 
#define COLUMNS_COUNT   6
 
#define BBITEMFILETYPE   (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FILE_FLAG)
 
#define BBITEMFOLDERTYPE   (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FOLDER_FLAG)
 

Typedefs

typedef struct _FILEOPDATA FILEOPDATA
 

Enumerations

enum  { IDC_BB_RESTORE = 1 , IDC_BB_CUT , IDC_BB_DELETE , IDC_BB_PROPERTIES }
 
enum  { IDC_EMPTYRECYCLEBIN = 1 , IDC_PROPERTIES }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (CRecycleBin)
 
static BOOL IsFolder (LPCITEMIDLIST pidl)
 
static BBITEMDATAValidateItem (LPCITEMIDLIST pidl)
 
static LPITEMIDLIST CreateItem (LPCWSTR pszTrash, LPCWSTR pszOrig, const DELETED_FILE_INFO &Details)
 
static UINT GetItemFileSize (LPCITEMIDLIST pidl)
 
static LPCWSTR GetItemOriginalFullPath (const BBITEMDATA &Data)
 
static HRESULT GetItemOriginalFolder (const BBITEMDATA &Data, LPWSTR &Out)
 
static LPCWSTR GetItemOriginalFileName (const BBITEMDATA &Data)
 
static LPCWSTR GetItemRecycledFullPath (const BBITEMDATA &Data)
 
static int GetItemDriveNumber (LPCITEMIDLIST pidl)
 
static HRESULT GetItemTypeName (PCUITEMID_CHILD pidl, const BBITEMDATA &Data, SHFILEINFOW &shfi)
 
static UINT GetDefaultRecycleDriveNumber ()
 
static LPCWSTR GetGlobalRecycleBinPath ()
 
static BOOL IsRecycleBinEmpty (IShellFolder *pSF)
 
static void CRecycleBin_ChangeNotifyBBItem (_In_ LONG Event, _In_opt_ LPCITEMIDLIST BBItem)
 
EXTERN_C void CRecycleBin_NotifyRecycled (LPCWSTR OrigPath, const WIN32_FIND_DATAW *pFind, const RECYCLEBINFILEIDENTITY *pFI)
 
static void CRecycleBin_NotifyRemovedFromRecycleBin (LPCITEMIDLIST BBItem)
 
static HRESULT CRecyclerExtractIcon_CreateInstance (IShellFolder &FSFolder, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
 
static BOOL ConfirmDelete (LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl)
 
static LPWSTR CreateFileOpStrings (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, BOOL RecycledPath)
 
static HRESULT CALLBACK FileOpCallback (FILEOPCALLBACKEVENT Event, LPCWSTR Src, LPCWSTR Dst, UINT Attrib, HRESULT hrOp, void *CallerData)
 
static HRESULT CompareCanonical (const BBITEMDATA &Data1, const BBITEMDATA &Data2)
 
BOOL TRASH_CanTrashFile (LPCWSTR wszPath)
 
BOOL TRASH_TrashFile (LPCWSTR wszPath)
 
static void TRASH_PlayEmptyRecycleBinSound ()
 
EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon (void)
 
HRESULT WINAPI SHEmptyRecycleBinA (HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
 
HRESULT WINAPI SHEmptyRecycleBinW (HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
 
HRESULT WINAPI SHQueryRecycleBinA (LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
 
HRESULT WINAPI SHQueryRecycleBinW (LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
 

Variables

static const columninfo RecycleBinColumns []
 
static const CMVERBMAP g_BBItemVerbMap []
 
static const CMVERBMAP g_BBFolderVerbMap []
 

Macro Definition Documentation

◆ BBITEMFILETYPE

#define BBITEMFILETYPE   (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FILE_FLAG)

Definition at line 64 of file CRecycleBin.cpp.

◆ BBITEMFOLDERTYPE

#define BBITEMFOLDERTYPE   (PT_FS | PT_FS_UNICODE_FLAG | PT_FS_FOLDER_FLAG)

Definition at line 65 of file CRecycleBin.cpp.

◆ COLUMN_DATEDEL

#define COLUMN_DATEDEL   2

Definition at line 54 of file CRecycleBin.cpp.

◆ COLUMN_DELFROM

#define COLUMN_DELFROM   1

Definition at line 53 of file CRecycleBin.cpp.

◆ COLUMN_MTIME

#define COLUMN_MTIME   5

Definition at line 57 of file CRecycleBin.cpp.

◆ COLUMN_NAME

#define COLUMN_NAME   0

Definition at line 52 of file CRecycleBin.cpp.

◆ COLUMN_SIZE

#define COLUMN_SIZE   3

Definition at line 55 of file CRecycleBin.cpp.

◆ COLUMN_TYPE

#define COLUMN_TYPE   4

Definition at line 56 of file CRecycleBin.cpp.

◆ COLUMNS_COUNT

#define COLUMNS_COUNT   6

Definition at line 59 of file CRecycleBin.cpp.

Typedef Documentation

◆ FILEOPDATA

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
IDC_BB_RESTORE 
IDC_BB_CUT 
IDC_BB_DELETE 
IDC_BB_PROPERTIES 

Definition at line 421 of file CRecycleBin.cpp.

@ IDC_BB_DELETE
@ IDC_BB_RESTORE
@ IDC_BB_CUT
@ IDC_BB_PROPERTIES

◆ anonymous enum

anonymous enum
Enumerator
IDC_EMPTYRECYCLEBIN 
IDC_PROPERTIES 

Definition at line 1060 of file CRecycleBin.cpp.

@ IDC_EMPTYRECYCLEBIN
@ IDC_PROPERTIES

Function Documentation

◆ CompareCanonical()

static HRESULT CompareCanonical ( const BBITEMDATA Data1,
const BBITEMDATA Data2 
)
static

Definition at line 730 of file CRecycleBin.cpp.

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}
static LPCWSTR GetItemOriginalFullPath(const BBITEMDATA &Data)
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
GLuint64EXT * result
Definition: glext.h:11304
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
FILETIME DeletionTime
Definition: CRecycleBin.cpp:68

Referenced by CRecycleBin::CompareIDs().

◆ ConfirmDelete()

static BOOL ConfirmDelete ( LPCMINVOKECOMMANDINFO  lpcmi,
UINT  cidl,
LPCITEMIDLIST  pidl 
)
static

Definition at line 467 of file CRecycleBin.cpp.

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}
static BOOL IsFolder(LPCITEMIDLIST pidl)
Definition: CRecycleBin.cpp:84
static LPCWSTR GetItemOriginalFileName(const BBITEMDATA &Data)
static BBITEMDATA * ValidateItem(LPCITEMIDLIST pidl)
Definition: CRecycleBin.cpp:89
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define L(x)
Definition: resources.c:13
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
unsigned int UINT
Definition: ndis.h:50
#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
BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir)
Definition: shlfileop.cpp:375
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CRecycleBinItemContextMenu::InvokeCommand().

◆ CreateFileOpStrings()

static LPWSTR CreateFileOpStrings ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
BOOL  RecycledPath 
)
static

Definition at line 484 of file CRecycleBin.cpp.

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}
static LPCWSTR GetItemRecycledFullPath(const BBITEMDATA &Data)
#define lstrlenW
Definition: compat.h:750
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
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
#define LMEM_MOVEABLE
Definition: minwinbase.h:82
#define LPTR
Definition: minwinbase.h:93
#define CopyMemory
Definition: minwinbase.h:29
static HMODULE MODULEINFO DWORD cb
Definition: module.c:38
#define UNICODE_NULL
Definition: mem.c:349
uint16_t * PWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by CRecycleBinItemContextMenu::InvokeCommand().

◆ CreateItem()

static LPITEMIDLIST CreateItem ( LPCWSTR  pszTrash,
LPCWSTR  pszOrig,
const DELETED_FILE_INFO Details 
)
static

Definition at line 105 of file CRecycleBin.cpp.

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}
#define BBITEMFOLDERTYPE
Definition: CRecycleBin.cpp:65
#define BBITEMFILETYPE
Definition: CRecycleBin.cpp:64
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
BOOL WINAPI FileTimeToDosDateTime(IN CONST FILETIME *lpFileTime, OUT LPWORD lpFatDate, OUT LPWORD lpFatTime)
Definition: time.c:37
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1701
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
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
#define C_ASSERT(e)
Definition: intsafe.h:73
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define LOWORD(l)
Definition: pedump.c:82
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2450
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:149
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
UINT RECYCLEBINFILESIZETYPE
Definition: recyclebin.h:24
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
RECYCLEBINFILESIZETYPE FileSize
Definition: recyclebin.h:42
FILETIME DeletionTime
Definition: recyclebin.h:41
FILETIME LastModification
Definition: recyclebin.h:40
Definition: fci.c:116
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 FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define HIWORD(l)
Definition: typedefs.h:247
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2521
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193

Referenced by CRecycleBinEnum::CBEnumRecycleBin(), and CRecycleBin_NotifyRecycled().

◆ CRecycleBin_ChangeNotifyBBItem()

static void CRecycleBin_ChangeNotifyBBItem ( _In_ LONG  Event,
_In_opt_ LPCITEMIDLIST  BBItem 
)
static

Definition at line 242 of file CRecycleBin.cpp.

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}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define FALSE
Definition: types.h:117
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:446
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
#define CSIDL_BITBUCKET
Definition: shlobj.h:2189
#define SHCNF_IDLIST
Definition: shlobj.h:1927

Referenced by CRecycleBin_NotifyRecycled(), CRecycleBin_NotifyRemovedFromRecycleBin(), and SHEmptyRecycleBinW().

◆ CRecycleBin_NotifyRecycled()

EXTERN_C void CRecycleBin_NotifyRecycled ( LPCWSTR  OrigPath,
const WIN32_FIND_DATAW pFind,
const RECYCLEBINFILEIDENTITY pFI 
)

Definition at line 266 of file CRecycleBin.cpp.

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}
static void CRecycleBin_ChangeNotifyBBItem(_In_ LONG Event, _In_opt_ LPCITEMIDLIST BBItem)
static LPITEMIDLIST CreateItem(LPCWSTR pszTrash, LPCWSTR pszOrig, const DELETED_FILE_INFO &Details)
#define SHCNE_MKDIR
Definition: shlobj.h:1898
#define SHCNE_CREATE
Definition: shlobj.h:1896
FILETIME ftLastWriteTime
Definition: minwinbase.h:286
DWORD dwFileAttributes
Definition: minwinbase.h:283

Referenced by RecycleBin5::DeleteFile().

◆ CRecycleBin_NotifyRemovedFromRecycleBin()

static void CRecycleBin_NotifyRemovedFromRecycleBin ( LPCITEMIDLIST  BBItem)
static

Definition at line 281 of file CRecycleBin.cpp.

282{
284}
#define SHCNE_RMDIR
Definition: shlobj.h:1899
#define SHCNE_DELETE
Definition: shlobj.h:1897

Referenced by FileOpCallback().

◆ CRecyclerExtractIcon_CreateInstance()

static HRESULT CRecyclerExtractIcon_CreateInstance ( IShellFolder FSFolder,
LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppvOut 
)
static

Definition at line 286 of file CRecycleBin.cpp.

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}
#define ERR(fmt,...)
Definition: precomp.h:57
static HRESULT SHELL_CreateFallbackExtractIconForNoAssocFile(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:117
static HRESULT SHELL_CreateFallbackExtractIconForFolder(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:110
REFIID riid
Definition: atlbase.h:39
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)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT hr
Definition: shlfolder.c:183

Referenced by CRecycleBin::GetUIObjectOf().

◆ FileOpCallback()

static HRESULT CALLBACK FileOpCallback ( FILEOPCALLBACKEVENT  Event,
LPCWSTR  Src,
LPCWSTR  Dst,
UINT  Attrib,
HRESULT  hrOp,
void CallerData 
)
static

Definition at line 516 of file CRecycleBin.cpp.

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}
static BOOL IsRecycleBinEmpty(IShellFolder *pSF)
static void CRecycleBin_NotifyRemovedFromRecycleBin(LPCITEMIDLIST BBItem)
EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon(void)
@ 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
EXTERN_C BOOL RemoveFromRecycleBinDatabase(IN const RECYCLEBINFILEIDENTITY *pFI)
Definition: recyclebin.c:287
#define S_OK
Definition: intsafe.h:52
#define IID_PPV_ARG(Itype, ppType)

Referenced by CRecycleBinItemContextMenu::InvokeCommand().

◆ GetDefaultRecycleDriveNumber()

static UINT GetDefaultRecycleDriveNumber ( )
static

Definition at line 219 of file CRecycleBin.cpp.

220{
221 int drive = 0;
225 return max(0, drive);
226}
#define MAX_PATH
Definition: compat.h:34
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
int WINAPI PathGetDriveNumberW(const WCHAR *path)
Definition: path.c:1810
#define _countof(array)
Definition: sndvol32.h:70
#define max(a, b)
Definition: svc.c:63

Referenced by CRecycleBin::GetFSFolderForItem().

◆ GetGlobalRecycleBinPath()

static LPCWSTR GetGlobalRecycleBinPath ( )
inlinestatic

Definition at line 228 of file CRecycleBin.cpp.

229{
230 return NULL;
231}

Referenced by CRecycleBinEnum::Initialize().

◆ GetItemDriveNumber()

static int GetItemDriveNumber ( LPCITEMIDLIST  pidl)
static

Definition at line 197 of file CRecycleBin.cpp.

198{
199 if (BBITEMDATA *pData = ValidateItem(pidl))
203}
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2198

Referenced by CRecycleBin::GetFSFolderForItem().

◆ GetItemFileSize()

static UINT GetItemFileSize ( LPCITEMIDLIST  pidl)
inlinestatic

Definition at line 161 of file CRecycleBin.cpp.

162{
163 return _ILGetFSType(pidl) ? ((PIDLDATA*)pidl->mkid.abID)->u.file.dwFileSize : 0;
164}

Referenced by CRecycleBin::CompareIDs(), and CRecycleBin::GetDetailsOf().

◆ GetItemOriginalFileName()

static LPCWSTR GetItemOriginalFileName ( const BBITEMDATA Data)
static

◆ GetItemOriginalFolder()

static HRESULT GetItemOriginalFolder ( const BBITEMDATA Data,
LPWSTR Out 
)
static

Definition at line 171 of file CRecycleBin.cpp.

172{
174 if (SUCCEEDED(hr))
176 return hr;
177}
@ Out
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1145
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2148

Referenced by CRecycleBin::CompareIDs(), and CRecycleBin::GetDetailsOf().

◆ GetItemOriginalFullPath()

static LPCWSTR GetItemOriginalFullPath ( const BBITEMDATA Data)
inlinestatic

Definition at line 166 of file CRecycleBin.cpp.

167{
168 return Data.OriginalLocation;
169}

Referenced by CompareCanonical(), CreateFileOpStrings(), CRecycleBin::GetDisplayNameOf(), GetItemOriginalFileName(), and GetItemOriginalFolder().

◆ GetItemRecycledFullPath()

static LPCWSTR GetItemRecycledFullPath ( const BBITEMDATA Data)
inlinestatic

◆ GetItemTypeName()

static HRESULT GetItemTypeName ( PCUITEMID_CHILD  pidl,
const BBITEMDATA Data,
SHFILEINFOW shfi 
)
static

Definition at line 205 of file CRecycleBin.cpp.

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}
#define E_FAIL
Definition: ddrawi.h:102
const GLint * attribs
Definition: glext.h:10538
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
WCHAR szTypeName[80]
Definition: shellapi.h:388

Referenced by CRecycleBin::CompareIDs(), and CRecycleBin::GetDetailsOf().

◆ IsFolder()

◆ IsRecycleBinEmpty()

static BOOL IsRecycleBinEmpty ( IShellFolder pSF)
static

Definition at line 233 of file CRecycleBin.cpp.

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}
HRESULT EnumObjects([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t ULONG
Definition: typedefs.h:59

Referenced by FileOpCallback(), and CRecycleBin::QueryContextMenu().

◆ SHEmptyRecycleBinA()

HRESULT WINAPI SHEmptyRecycleBinA ( HWND  hwnd,
LPCSTR  pszRootPath,
DWORD  dwFlags 
)

Definition at line 1301 of file CRecycleBin.cpp.

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}
HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define MultiByteToWideChar
Definition: compat.h:110
GLenum GLsizei len
Definition: glext.h:6722
#define debugstr_a
Definition: kernel32.h:31
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define TRACE(s)
Definition: solgame.cpp:4
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ SHEmptyRecycleBinW()

HRESULT WINAPI SHEmptyRecycleBinW ( HWND  hwnd,
LPCWSTR  pszRootPath,
DWORD  dwFlags 
)

Definition at line 1330 of file CRecycleBin.cpp.

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}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static void TRASH_PlayEmptyRecycleBinSound()
#define shell32_hInstance
#define ShellMessageBoxW
Definition: precomp.h:63
BOOL WINAPI EmptyRecycleBinW(IN LPCWSTR pszRoot OPTIONAL)
Definition: recyclebin.c:145
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3277
return ret
Definition: mutex.c:146
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
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)
ULONG Release()
#define debugstr_w
Definition: kernel32.h:32
long LONG
Definition: pedump.c:60
#define StrRetToBuf
Definition: shlwapi.h:1241
#define SHERB_NOSOUND
Definition: shellapi.h:410
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:409
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:408
#define StrRet
Definition: shellclasses.h:871
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1907
#define IDS_DELETEITEM_TEXT
Definition: shresdef.h:124
#define IDS_EMPTY_BITBUCKET
Definition: shresdef.h:186
#define IDS_DELETEMULTIPLE_TEXT
Definition: shresdef.h:125
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
#define S_FALSE
Definition: winerror.h:3451
#define MB_YESNO
Definition: winuser.h:828
#define IDNO
Definition: winuser.h:847
#define MB_ICONEXCLAMATION
Definition: winuser.h:796
#define MB_DEFBUTTON2
Definition: winuser.h:810
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by CRecycleBin::InvokeCommand(), CRecycleBinCleaner::Purge(), and SHEmptyRecycleBinA().

◆ SHQueryRecycleBinA()

HRESULT WINAPI SHQueryRecycleBinA ( LPCSTR  pszRootPath,
LPSHQUERYRBINFO  pSHQueryRBInfo 
)

Definition at line 1431 of file CRecycleBin.cpp.

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}
HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)

◆ SHQueryRecycleBinW()

HRESULT WINAPI SHQueryRecycleBinW ( LPCWSTR  pszRootPath,
LPSHQUERYRBINFO  pSHQueryRBInfo 
)

Definition at line 1460 of file CRecycleBin.cpp.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:321
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
__int64 i64Size
Definition: shellapi.h:392
__int64 i64NumItems
Definition: shellapi.h:393
DWORD cbSize
Definition: shellapi.h:391
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

Referenced by CRecycleBinCleaner::GetSpaceUsed(), and SHQueryRecycleBinA().

◆ SHUpdateRecycleBinIcon()

EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon ( void  )

Definition at line 1286 of file CRecycleBin.cpp.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define SHCNE_UPDATEIMAGE
Definition: shlobj.h:1910
#define SHCNF_DWORD
Definition: shlobj.h:1930

Referenced by RecycleBin5::Delete(), FileOpCallback(), RecycleBin5::Restore(), and SHELL32_FileOperation().

◆ TRASH_CanTrashFile()

BOOL TRASH_CanTrashFile ( LPCWSTR  wszPath)

Tests whether a file can be trashed

Parameters
wszPathPath to the file to be trash
Returns
TRUE if the file can be trashed, FALSE otherwise

Definition at line 1152 of file CRecycleBin.cpp.

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}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
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 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
BOOL WINAPI PathStripToRootW(WCHAR *path)
Definition: path.c:1195
#define swprintf
Definition: precomp.h:40
FxAutoRegKey hKey
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define KEY_READ
Definition: nt_native.h:1026
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1087
#define KEY_WRITE
Definition: nt_native.h:1034
#define REG_DWORD
Definition: sdbapi.c:615
wcscat
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
unsigned char * LPBYTE
Definition: typedefs.h:53
#define DRIVE_FIXED
Definition: winbase.h:276
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Referenced by delete_files().

◆ TRASH_PlayEmptyRecycleBinSound()

static void TRASH_PlayEmptyRecycleBinSound ( )
static

Definition at line 1230 of file CRecycleBin.cpp.

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}
bool Allocate(_In_ size_t nElements=1)
Definition: atlalloc.h:143
void Attach(T *lp)
Definition: atlalloc.h:162
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:520
#define REG_SZ
Definition: layer.c:22
#define SND_FILENAME
Definition: mmsystem.h:162
#define SND_ASYNC
Definition: mmsystem.h:154
#define SND_NODEFAULT
Definition: mmsystem.h:155
#define REG_EXPAND_SZ
Definition: nt_native.h:1497
BOOL WINAPI PlaySoundW(LPCWSTR pszSoundW, HMODULE hmod, DWORD fdwSound)
Definition: playsound.c:709
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
Definition: shlwapi.h:783

Referenced by SHEmptyRecycleBinW().

◆ TRASH_TrashFile()

BOOL TRASH_TrashFile ( LPCWSTR  wszPath)

Definition at line 1224 of file CRecycleBin.cpp.

1225{
1226 TRACE("(%s)\n", debugstr_w(wszPath));
1227 return DeleteFileToRecycleBin(wszPath);
1228}
#define DeleteFileToRecycleBin
Definition: recyclebin.h:101

Referenced by delete_files().

◆ ValidateItem()

static BBITEMDATA * ValidateItem ( LPCITEMIDLIST  pidl)
static

Definition at line 89 of file CRecycleBin.cpp.

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}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static BYTE _ILGetType(LPCITEMIDLIST pidl)
Definition: pidl.h:144

Referenced by ConfirmDelete(), CreateFileOpStrings(), CreateItem(), CRecycleBin_ChangeNotifyBBItem(), FileOpCallback(), and GetItemDriveNumber().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( CRecycleBin  )

Variable Documentation

◆ g_BBFolderVerbMap

const CMVERBMAP g_BBFolderVerbMap[]
static
Initial value:
=
{
{ "empty", IDC_EMPTYRECYCLEBIN },
{ "properties", IDC_PROPERTIES },
{ NULL }
}

Definition at line 1061 of file CRecycleBin.cpp.

Referenced by CRecycleBin::GetCommandString(), and CRecycleBin::InvokeCommand().

◆ g_BBItemVerbMap

const CMVERBMAP g_BBItemVerbMap[]
static
Initial value:
=
{
{ "undelete", IDC_BB_RESTORE },
{ "cut", IDC_BB_CUT },
{ "delete", IDC_BB_DELETE },
{ "properties", IDC_BB_PROPERTIES },
{ NULL }
}

Definition at line 422 of file CRecycleBin.cpp.

Referenced by CRecycleBinItemContextMenu::GetCommandString(), and CRecycleBinItemContextMenu::InvokeCommand().

◆ RecycleBinColumns

const columninfo RecycleBinColumns[]
static
Initial value:
=
{
}
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:89
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:88
#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 LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define PID_DISPLACED_FROM
Definition: shlguid.h:182
#define PID_DISPLACED_DATE
Definition: shlguid.h:183
#define IDS_SHV_COLUMN_DELFROM
Definition: shresdef.h:58
#define IDS_SHV_COLUMN_SIZE
Definition: shresdef.h:50
#define IDS_SHV_COLUMN_MODIFIED
Definition: shresdef.h:52
#define IDS_SHV_COLUMN_DELDATE
Definition: shresdef.h:59
@ 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

Definition at line 40 of file CRecycleBin.cpp.

Referenced by CRecycleBin::GetDefaultColumnState(), CRecycleBin::GetDetailsOf(), and CRecycleBin::MapColumnToSCID().