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