1 #pragma once 2 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 7 #include <stdarg.h> 8 9 #define WIN32_NO_STATUS 10 #define _INC_WINDOWS 11 #define COM_NO_WINDOWS_H 12 13 #include <windef.h> 14 #include <winbase.h> 15 #include <winnls.h> 16 #include <winver.h> 17 #include <shellapi.h> 18 #include <objbase.h> 19 20 #define RECYCLEBINMAXDRIVECOUNT 26 21 22 /* Structures used by the API Interface */ 23 24 typedef UINT RECYCLEBINFILESIZETYPE; 25 26 typedef struct _RECYCLEBINFILEIDENTITY 27 { 28 FILETIME DeletionTime; 29 LPCWSTR RecycledFullPath; /* "C:\Recycled\Dc1.ext" etc. */ 30 } RECYCLEBINFILEIDENTITY, *PRECYCLEBINFILEIDENTITY; 31 32 typedef struct _RECYCLEBINSTRING 33 { 34 LPCWSTR String; 35 LPWSTR Alloc; 36 } RECYCLEBINSTRING, *PRECYCLEBINSTRING; 37 38 typedef struct _DELETED_FILE_INFO 39 { 40 FILETIME LastModification; 41 FILETIME DeletionTime; 42 RECYCLEBINFILESIZETYPE FileSize; 43 DWORD Attributes; 44 RECYCLEBINSTRING OriginalFullPath; 45 RECYCLEBINSTRING RecycledFullPath; 46 } DELETED_FILE_INFO, *PDELETED_FILE_INFO; 47 48 /* Distinct handle type for deleted file/folder */ 49 DECLARE_HANDLE(HDELFILE); 50 #define IRecycleBinFileFromHDELFILE(hDF) ( (IRecycleBinFile*)(hDF) ) 51 52 /* API Interface */ 53 54 static inline void 55 FreeRecycleBinString(PRECYCLEBINSTRING pRBS) 56 { 57 SHFree(pRBS->Alloc); 58 pRBS->String = pRBS->Alloc = NULL; 59 } 60 61 static inline void 62 InitializeRecycleBinStringRef(PRECYCLEBINSTRING pRBS, LPCWSTR String) 63 { 64 pRBS->String = String; 65 pRBS->Alloc = NULL; 66 } 67 68 EXTERN_C HRESULT 69 GetRecycleBinPathFromDriveNumber(UINT Drive, LPWSTR Path); 70 71 /* Function called for each deleted file in the recycle bin 72 * Context: value given by the caller of the EnumerateRecycleBin function 73 * hDeletedFile: a handle to the deleted file 74 * Returning FALSE stops the enumeration. 75 * Remarks: the handle must be closed with the CloseRecycleBinHandle function 76 */ 77 typedef BOOL (CALLBACK *PENUMERATE_RECYCLEBIN_CALLBACK)(IN PVOID Context, IN HDELFILE hDeletedFile); 78 79 /* Closes a file deleted handle. 80 * hDeletedFile: the handle to close 81 * Returns TRUE if operation succeeded, FALSE otherwise. 82 * Remark: The handle is obtained in the PENUMERATE_RECYCLEBIN_CALLBACK callback 83 */ 84 BOOL WINAPI 85 CloseRecycleBinHandle( 86 IN HDELFILE hDeletedFile); 87 88 /* Moves a file to the recycle bin. 89 * FileName: the name of the file to move the recycle bin 90 * Returns TRUE if operation succeeded, FALSE otherwise. 91 */ 92 BOOL WINAPI 93 DeleteFileToRecycleBinA( 94 IN LPCSTR FileName); 95 BOOL WINAPI 96 DeleteFileToRecycleBinW( 97 IN LPCWSTR FileName); 98 #ifdef UNICODE 99 #define DeleteFileToRecycleBin DeleteFileToRecycleBinW 100 #else 101 #define DeleteFileToRecycleBin DeleteFileToRecycleBinA 102 #endif 103 104 /* Deletes a file in the recycle bin. 105 * hDeletedFile: handle of the deleted file to delete 106 * Returns TRUE if operation succeeded, FALSE otherwise. 107 * Remark: The handle is obtained in the PENUMERATE_RECYCLEBIN_CALLBACK callback 108 */ 109 BOOL WINAPI 110 DeleteFileInRecycleBin( 111 IN HDELFILE hDeletedFile); 112 113 /* Removes all elements contained in a recycle bin 114 * pszRoot: the name of the drive containing the recycle bin 115 * Returns TRUE if operation succeeded, FALSE otherwise. 116 * Remarks: 'pszRoot' can be NULL to mean 'all recycle bins'. 117 */ 118 BOOL WINAPI 119 EmptyRecycleBinA( 120 IN LPCSTR pszRoot OPTIONAL); 121 BOOL WINAPI 122 EmptyRecycleBinW( 123 IN LPCWSTR pszRoot OPTIONAL); 124 #ifdef UNICODE 125 #define EmptyRecycleBin EmptyRecycleBinW 126 #else 127 #define EmptyRecycleBin EmptyRecycleBinA 128 #endif 129 130 /* Enumerate contents of a recycle bin. 131 * pszRoot: the name of the drive containing the recycle bin 132 * pFnCallback: callback function to be called for each deleted item found 133 * Context: some value which will be given back in the callback function 134 * Returns TRUE if operation succeeded, FALSE otherwise. 135 * Remarks: 'pszRoot' can be NULL to mean 'all recycle bins'. 136 */ 137 BOOL WINAPI 138 EnumerateRecycleBinA( 139 IN LPCSTR pszRoot OPTIONAL, 140 IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, 141 IN PVOID Context OPTIONAL); 142 BOOL WINAPI 143 EnumerateRecycleBinW( 144 IN LPCWSTR pszRoot OPTIONAL, 145 IN PENUMERATE_RECYCLEBIN_CALLBACK pFnCallback, 146 IN PVOID Context OPTIONAL); 147 #ifdef UNICODE 148 #define EnumerateRecycleBin EnumerateRecycleBinW 149 #else 150 #define EnumerateRecycleBin EnumerateRecycleBinA 151 #endif 152 153 EXTERN_C HDELFILE 154 GetRecycleBinFileHandle( 155 IN LPCWSTR pszRoot OPTIONAL, 156 IN const RECYCLEBINFILEIDENTITY *pFI); 157 158 /* Restores a deleted file 159 * hDeletedFile: handle of the deleted file to restore 160 * Returns TRUE if operation succeeded, FALSE otherwise. 161 * Remarks: if the function succeeds, the handle is not valid anymore. 162 */ 163 BOOL WINAPI 164 RestoreFileFromRecycleBin( 165 IN HDELFILE hDeletedFile); 166 167 /* COM interface */ 168 169 #define INTERFACE IRecycleBinFile 170 DECLARE_INTERFACE_(IRecycleBinFile, IUnknown) 171 { 172 BEGIN_INTERFACE 173 174 /* IUnknown methods */ 175 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 176 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 177 STDMETHOD_(ULONG, Release)(THIS) PURE; 178 179 /* IRecycleBinFile methods */ 180 STDMETHOD(IsEqualIdentity)(THIS_ const RECYCLEBINFILEIDENTITY *pFI) PURE; 181 STDMETHOD(GetInfo)(THIS_ PDELETED_FILE_INFO pInfo) PURE; 182 STDMETHOD(GetLastModificationTime)(THIS_ FILETIME *pLastModificationTime) PURE; 183 STDMETHOD(GetDeletionTime)(THIS_ FILETIME *pDeletionTime) PURE; 184 STDMETHOD(GetFileSize)(THIS_ ULARGE_INTEGER *pFileSize) PURE; 185 STDMETHOD(GetPhysicalFileSize)(THIS_ ULARGE_INTEGER *pPhysicalFileSize) PURE; 186 STDMETHOD(GetAttributes)(THIS_ DWORD *pAttributes) PURE; 187 STDMETHOD(GetFileName)(THIS_ SIZE_T BufferSize, LPWSTR Buffer, SIZE_T *RequiredSize) PURE; 188 STDMETHOD(Delete)(THIS) PURE; 189 STDMETHOD(Restore)(THIS) PURE; 190 191 END_INTERFACE 192 }; 193 #undef INTERFACE 194 195 #define INTERFACE IRecycleBinEnumList 196 DECLARE_INTERFACE_(IRecycleBinEnumList, IUnknown) 197 { 198 BEGIN_INTERFACE 199 200 /* IUnknown methods */ 201 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 202 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 203 STDMETHOD_(ULONG, Release)(THIS) PURE; 204 205 /* IRecycleBinEnumList methods */ 206 STDMETHOD(Next)(THIS_ DWORD celt, IRecycleBinFile **rgelt, DWORD *pceltFetched) PURE; 207 STDMETHOD(Skip)(THIS_ DWORD celt) PURE; 208 STDMETHOD(Reset)(THIS) PURE; 209 210 END_INTERFACE 211 }; 212 #undef INTERFACE 213 214 #define INTERFACE IRecycleBin 215 DECLARE_INTERFACE_(IRecycleBin, IUnknown) 216 { 217 BEGIN_INTERFACE 218 219 /* IUnknown methods */ 220 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 221 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 222 STDMETHOD_(ULONG, Release)(THIS) PURE; 223 224 /* IRecycleBin methods */ 225 STDMETHOD(DeleteFile)(THIS_ LPCWSTR szFileName) PURE; 226 STDMETHOD(EmptyRecycleBin)(THIS) PURE; 227 STDMETHOD(EnumObjects)(THIS_ IRecycleBinEnumList **ppEnumList) PURE; 228 STDMETHOD(GetDirectory)(THIS_ LPWSTR szPath) PURE; 229 230 END_INTERFACE 231 }; 232 #undef INTERFACE 233 234 EXTERN_C const IID IID_IRecycleBinFile; 235 EXTERN_C const IID IID_IRecycleBinEnumList; 236 EXTERN_C const IID IID_IRecycleBin; 237 238 #if (!defined(__cplusplus) || defined(CINTERFACE)) && defined(COBJMACROS) 239 #define IRecycleBinFile_QueryInterface(This, riid, ppvObject) \ 240 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 241 #define IRecycleBinFile_AddRef(This) \ 242 (This)->lpVtbl->AddRef(This) 243 #define IRecycleBinFile_Release(This) \ 244 (This)->lpVtbl->Release(This) 245 #define IRecycleBinFile_IsEqualIdentity(This, pFI) \ 246 (This)->lpVtbl->IsEqualIdentity(This, pFI) 247 #define IRecycleBinFile_GetInfo(This, pInfo) \ 248 (This)->lpVtbl->GetInfo(This, pInfo) 249 #define IRecycleBinFile_GetLastModificationTime(This, pLastModificationTime) \ 250 (This)->lpVtbl->GetLastModificationTime(This, pLastModificationTime) 251 #define IRecycleBinFile_GetDeletionTime(This, pDeletionTime) \ 252 (This)->lpVtbl->GetDeletionTime(This, pDeletionTime) 253 #define IRecycleBinFile_GetFileSize(This, pFileSize) \ 254 (This)->lpVtbl->GetFileSize(This, pFileSize) 255 #define IRecycleBinFile_GetPhysicalFileSize(This, pPhysicalFileSize) \ 256 (This)->lpVtbl->GetPhysicalFileSize(This, pPhysicalFileSize) 257 #define IRecycleBinFile_GetAttributes(This, pAttributes) \ 258 (This)->lpVtbl->GetAttributes(This, pAttributes) 259 #define IRecycleBinFile_GetFileName(This, BufferSize, Buffer, RequiredSize) \ 260 (This)->lpVtbl->GetFileName(This, BufferSize, Buffer, RequiredSize) 261 #define IRecycleBinFile_Delete(This) \ 262 (This)->lpVtbl->Delete(This) 263 #define IRecycleBinFile_Restore(This) \ 264 (This)->lpVtbl->Restore(This) 265 266 #define IRecycleBinEnumList_QueryInterface(This, riid, ppvObject) \ 267 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 268 #define IRecycleBinEnumList_AddRef(This) \ 269 (This)->lpVtbl->AddRef(This) 270 #define IRecycleBinEnumList_Release(This) \ 271 (This)->lpVtbl->Release(This) 272 #define IRecycleBinEnumList_Next(This, celt, rgelt, pceltFetched) \ 273 (This)->lpVtbl->Next(This, celt, rgelt, pceltFetched) 274 #define IRecycleBinEnumList_Skip(This, celt) \ 275 (This)->lpVtbl->Skip(This, celt) 276 #define IRecycleBinEnumList_Reset(This) \ 277 (This)->lpVtbl->Reset(This) 278 279 #define IRecycleBin_QueryInterface(This, riid, ppvObject) \ 280 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 281 #define IRecycleBin_AddRef(This) \ 282 (This)->lpVtbl->AddRef(This) 283 #define IRecycleBin_Release(This) \ 284 (This)->lpVtbl->Release(This) 285 #define IRecycleBin_DeleteFile(This, szFileName) \ 286 (This)->lpVtbl->DeleteFile(This, szFileName) 287 #define IRecycleBin_EmptyRecycleBin(This) \ 288 (This)->lpVtbl->EmptyRecycleBin(This) 289 #define IRecycleBin_EnumObjects(This, ppEnumList) \ 290 (This)->lpVtbl->EnumObjects(This, ppEnumList) 291 #define IRecycleBin_GetDirectory(This, szPath) \ 292 (This)->lpVtbl->GetDirectory(This, szPath) 293 #endif 294 295 EXTERN_C HRESULT 296 GetDefaultRecycleBin( 297 IN LPCWSTR pszVolume OPTIONAL, 298 OUT IRecycleBin **pprb); 299 300 /* Recycle Bin shell folder internal API */ 301 void CRecycleBin_NotifyRecycled(LPCWSTR OrigPath, const WIN32_FIND_DATAW *pFind, 302 const RECYCLEBINFILEIDENTITY *pFI); 303 304 305 #ifdef __cplusplus 306 } 307 #endif 308