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 BOOL WINAPI 135 GetDeletedFileTypeNameW( 136 IN HANDLE hDeletedFile, 137 OUT LPWSTR pTypeName, 138 IN DWORD BufferSize, 139 OUT LPDWORD RequiredSize OPTIONAL); 140 141 /* Gets details about a deleted file 142 * hDeletedFile: handle of the deleted file to get details about 143 * BufferSize: size of the 'FileDetails' buffer, in bytes 144 * FileDetails: if the function succeeded, contains details about the deleted file 145 * RequiredSize: contains the minimal buffer size required to get file information details 146 * Returns TRUE if operation succeeded, FALSE otherwise. 147 * Remark: The handle is obtained in the PENUMERATE_RECYCLEBIN_CALLBACK callback 148 */ 149 BOOL WINAPI 150 GetDeletedFileDetailsA( 151 IN HANDLE hDeletedFile, 152 IN DWORD BufferSize, 153 IN OUT PDELETED_FILE_DETAILS_A FileDetails OPTIONAL, 154 OUT LPDWORD RequiredSize OPTIONAL); 155 BOOL WINAPI 156 GetDeletedFileDetailsW( 157 IN HANDLE hDeletedFile, 158 IN DWORD BufferSize, 159 IN OUT PDELETED_FILE_DETAILS_W FileDetails OPTIONAL, 160 OUT LPDWORD RequiredSize OPTIONAL); 161 #ifdef UNICODE 162 #define GetDeletedFileDetails GetDeletedFileDetailsW 163 #else 164 #define GetDeletedFileDetails GetDeletedFileDetailsA 165 #endif 166 167 /* Restores a deleted file 168 * hDeletedFile: handle of the deleted file to restore 169 * Returns TRUE if operation succeeded, FALSE otherwise. 170 * Remarks: if the function succeeds, the handle is not valid anymore. 171 */ 172 BOOL WINAPI 173 RestoreFile( 174 IN HANDLE hDeletedFile); 175 176 /* COM interface */ 177 178 #define INTERFACE IRecycleBinFile 179 DECLARE_INTERFACE_(IRecycleBinFile, IUnknown) 180 { 181 BEGIN_INTERFACE 182 183 /* IUnknown methods */ 184 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 185 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 186 STDMETHOD_(ULONG, Release)(THIS) PURE; 187 188 /* IRecycleBinFile methods */ 189 STDMETHOD(GetLastModificationTime)(THIS_ FILETIME *pLastModificationTime) PURE; 190 STDMETHOD(GetDeletionTime)(THIS_ FILETIME *pDeletionTime) PURE; 191 STDMETHOD(GetFileSize)(THIS_ ULARGE_INTEGER *pFileSize) PURE; 192 STDMETHOD(GetPhysicalFileSize)(THIS_ ULARGE_INTEGER *pPhysicalFileSize) PURE; 193 STDMETHOD(GetAttributes)(THIS_ DWORD *pAttributes) PURE; 194 STDMETHOD(GetFileName)(THIS_ SIZE_T BufferSize, LPWSTR Buffer, SIZE_T *RequiredSize) PURE; 195 STDMETHOD(GetTypeName)(THIS_ SIZE_T BufferSize, LPWSTR Buffer, SIZE_T *RequiredSize) PURE; 196 STDMETHOD(Delete)(THIS) PURE; 197 STDMETHOD(Restore)(THIS) PURE; 198 199 END_INTERFACE 200 }; 201 #undef INTERFACE 202 203 #define INTERFACE IRecycleBinEnumList 204 DECLARE_INTERFACE_(IRecycleBinEnumList, IUnknown) 205 { 206 BEGIN_INTERFACE 207 208 /* IUnknown methods */ 209 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 210 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 211 STDMETHOD_(ULONG, Release)(THIS) PURE; 212 213 /* IRecycleBinEnumList methods */ 214 STDMETHOD(Next)(THIS_ DWORD celt, IRecycleBinFile **rgelt, DWORD *pceltFetched); 215 STDMETHOD(Skip)(THIS_ DWORD celt) PURE; 216 STDMETHOD(Reset)(THIS) PURE; 217 218 END_INTERFACE 219 }; 220 #undef INTERFACE 221 222 #define INTERFACE IRecycleBin 223 DECLARE_INTERFACE_(IRecycleBin, IUnknown) 224 { 225 BEGIN_INTERFACE 226 227 /* IUnknown methods */ 228 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE; 229 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 230 STDMETHOD_(ULONG, Release)(THIS) PURE; 231 232 /* IRecycleBin methods */ 233 STDMETHOD(DeleteFile)(THIS_ LPCWSTR szFileName); 234 STDMETHOD(EmptyRecycleBin)(THIS); 235 STDMETHOD(EnumObjects)(THIS_ IRecycleBinEnumList **ppEnumList); 236 237 END_INTERFACE 238 }; 239 #undef INTERFACE 240 241 EXTERN_C const IID IID_IRecycleBinFile; 242 EXTERN_C const IID IID_IRecycleBinEnumList; 243 EXTERN_C const IID IID_IRecycleBin; 244 245 #if (!defined(__cplusplus) || defined(CINTERFACE)) && defined(COBJMACROS) 246 #define IRecycleBinFile_QueryInterface(This, riid, ppvObject) \ 247 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 248 #define IRecycleBinFile_AddRef(This) \ 249 (This)->lpVtbl->AddRef(This) 250 #define IRecycleBinFile_Release(This) \ 251 (This)->lpVtbl->Release(This) 252 #define IRecycleBinFile_GetLastModificationTime(This, pLastModificationTime) \ 253 (This)->lpVtbl->GetLastModificationTime(This, pLastModificationTime) 254 #define IRecycleBinFile_GetDeletionTime(This, pDeletionTime) \ 255 (This)->lpVtbl->GetDeletionTime(This, pDeletionTime) 256 #define IRecycleBinFile_GetFileSize(This, pFileSize) \ 257 (This)->lpVtbl->GetFileSize(This, pFileSize) 258 #define IRecycleBinFile_GetPhysicalFileSize(This, pPhysicalFileSize) \ 259 (This)->lpVtbl->GetPhysicalFileSize(This, pPhysicalFileSize) 260 #define IRecycleBinFile_GetAttributes(This, pAttributes) \ 261 (This)->lpVtbl->GetAttributes(This, pAttributes) 262 #define IRecycleBinFile_GetFileName(This, BufferSize, Buffer, RequiredSize) \ 263 (This)->lpVtbl->GetFileName(This, BufferSize, Buffer, RequiredSize) 264 #define IRecycleBinFile_GetTypeName(This, BufferSize, Buffer, RequiredSize) \ 265 (This)->lpVtbl->GetTypeName(This, BufferSize, Buffer, RequiredSize) 266 #define IRecycleBinFile_Delete(This) \ 267 (This)->lpVtbl->Delete(This) 268 #define IRecycleBinFile_Restore(This) \ 269 (This)->lpVtbl->Restore(This) 270 271 #define IRecycleBinEnumList_QueryInterface(This, riid, ppvObject) \ 272 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 273 #define IRecycleBinEnumList_AddRef(This) \ 274 (This)->lpVtbl->AddRef(This) 275 #define IRecycleBinEnumList_Release(This) \ 276 (This)->lpVtbl->Release(This) 277 #define IRecycleBinEnumList_Next(This, celt, rgelt, pceltFetched) \ 278 (This)->lpVtbl->Next(This, celt, rgelt, pceltFetched) 279 #define IRecycleBinEnumList_Skip(This, celt) \ 280 (This)->lpVtbl->Skip(This, celt) 281 #define IRecycleBinEnumList_Reset(This) \ 282 (This)->lpVtbl->Reset(This) 283 284 #define IRecycleBin_QueryInterface(This, riid, ppvObject) \ 285 (This)->lpVtbl->QueryInterface(This, riid, ppvObject) 286 #define IRecycleBin_AddRef(This) \ 287 (This)->lpVtbl->AddRef(This) 288 #define IRecycleBin_Release(This) \ 289 (This)->lpVtbl->Release(This) 290 #define IRecycleBin_DeleteFile(This, szFileName) \ 291 (This)->lpVtbl->DeleteFile(This, szFileName) 292 #define IRecycleBin_EmptyRecycleBin(This) \ 293 (This)->lpVtbl->EmptyRecycleBin(This) 294 #define IRecycleBin_EnumObjects(This, ppEnumList) \ 295 (This)->lpVtbl->EnumObjects(This, ppEnumList) 296 #endif 297 298 HRESULT WINAPI 299 GetDefaultRecycleBin( 300 IN LPCWSTR pszVolume OPTIONAL, 301 OUT IRecycleBin **pprb); 302 303 #ifdef __cplusplus 304 } 305 #endif 306