ReactOS 0.4.16-dev-1025-gd3456f5
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 1053 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
GLuint64EXT * result
Definition: glext.h:11304
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:630
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
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define ASK_DELETE_MULTIPLE_ITEM
Definition: shell32_main.h:139
#define ASK_DELETE_FILE
Definition: shell32_main.h:137
#define ASK_DELETE_FOLDER
Definition: shell32_main.h:138
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
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define UNICODE_NULL
Definition: mem.c:349
uint16_t * PWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define LMEM_MOVEABLE
Definition: winbase.h:395
#define LPTR
Definition: winbase.h:407
#define CopyMemory
Definition: winbase.h:1741
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
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
#define assert(x)
Definition: debug.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#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:2443
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:129
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: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 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:2798
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:445
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
#define CSIDL_BITBUCKET
Definition: shlobj.h:2191
#define SHCNF_IDLIST
Definition: shlobj.h:1929

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:1901
#define SHCNE_CREATE
Definition: shlobj.h:1899

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:1902
#define SHCNE_DELETE
Definition: shlobj.h:1900

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:103
static HRESULT SHELL_CreateFallbackExtractIconForFolder(REFIID riid, LPVOID *ppvOut)
Definition: utils.h:96
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: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
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:553
#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:2191

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(LPWSTR lpszPath)
Definition: path.c:629
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2018

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

Definition at line 184 of file CRecycleBin.cpp.

185{
186 return (LPCWSTR)((BYTE*)&Data + Data.RecycledPathOffset);
187}

Referenced by CreateFileOpStrings(), FileOpCallback(), CRecycleBin::GetDisplayNameOf(), GetItemDriveNumber(), and GetItemTypeName().

◆ 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:168
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:182
WCHAR szTypeName[80]
Definition: shellapi.h:377

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 1303 of file CRecycleBin.cpp.

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}
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
#define TRACE(s)
Definition: solgame.cpp:4
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ SHEmptyRecycleBinW()

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

Definition at line 1332 of file CRecycleBin.cpp.

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}
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:3301
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 SHERB_NOSOUND
Definition: shellapi.h:399
#define SHERB_NOPROGRESSUI
Definition: shellapi.h:398
#define SHERB_NOCONFIRMATION
Definition: shellapi.h:397
#define StrRet
Definition: shellclasses.h:871
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1910
#define StrRetToBuf
Definition: shlwapi.h:1804
#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
int ret
#define S_FALSE
Definition: winerror.h:2357
#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 1433 of file CRecycleBin.cpp.

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

◆ SHQueryRecycleBinW()

HRESULT WINAPI SHQueryRecycleBinW ( LPCWSTR  pszRootPath,
LPSHQUERYRBINFO  pSHQueryRBInfo 
)

Definition at line 1462 of file CRecycleBin.cpp.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
EXTERN_C HRESULT GetDefaultRecycleBin(IN LPCWSTR pszVolume OPTIONAL, OUT IRecycleBin **pprb)
Definition: recyclebin.c:321
__int64 i64Size
Definition: shellapi.h:381
__int64 i64NumItems
Definition: shellapi.h:382
DWORD cbSize
Definition: shellapi.h:380
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

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

◆ SHUpdateRecycleBinIcon()

EXTERN_C HRESULT WINAPI SHUpdateRecycleBinIcon ( void  )

Definition at line 1288 of file CRecycleBin.cpp.

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

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 1154 of file CRecycleBin.cpp.

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}
#define RegCloseKey(hKey)
Definition: registry.h:49
wcscat
#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(LPWSTR lpszPath)
Definition: path.c:733
#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:1023
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define KEY_WRITE
Definition: nt_native.h:1031
#define REG_DWORD
Definition: sdbapi.c:596
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:278
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Referenced by delete_files().

◆ TRASH_PlayEmptyRecycleBinSound()

static void TRASH_PlayEmptyRecycleBinSound ( )
static

Definition at line 1232 of file CRecycleBin.cpp.

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}
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
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#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:1494
BOOL WINAPI PlaySoundW(LPCWSTR pszSoundW, HMODULE hmod, DWORD fdwSound)
Definition: playsound.c:709

Referenced by SHEmptyRecycleBinW().

◆ TRASH_TrashFile()

BOOL TRASH_TrashFile ( LPCWSTR  wszPath)

Definition at line 1226 of file CRecycleBin.cpp.

1227{
1228 TRACE("(%s)\n", debugstr_w(wszPath));
1229 return DeleteFileToRecycleBin(wszPath);
1230}
#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:124

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 1054 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:78
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:77
#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().