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