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