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