1 #include "recyclebin.h"
5 #define RECYCLEBIN_MAGIC 0x6e694252
6 #define DELETEDFILE_MAGIC 0x6e694253
8 #define RECYCLE_BIN_DIRECTORY_WITH_ACL L"RECYCLER"
9 #define RECYCLE_BIN_DIRECTORY_WITHOUT_ACL L"RECYCLED"
10 #define RECYCLE_BIN_FILE_NAME L"INFO2"
12 #define ROUND_UP(N, S) ((( (N) + (S) - 1) / (S) ) * (S) )
14 /* List manipulation */
15 #define InitializeListHead(le) (void)((le)->Flink = (le)->Blink = (le))
16 #define InsertTailList(le,e) do { PLIST_ENTRY b = (le)->Blink; (e)->Flink = (le); (e)->Blink = b; b->Flink = (e); (le)->Blink = (e); } while (0)
17 #define RemoveEntryList(Entry) { PLIST_ENTRY _EX_Blink, _EX_Flink; _EX_Flink = (Entry)->Flink; _EX_Blink = (Entry)->Blink; _EX_Blink->Flink = _EX_Flink; _EX_Flink->Blink = _EX_Blink; }
21 typedef struct _RECYCLE_BIN
*PRECYCLE_BIN
;
22 struct _REFCOUNT_DATA
;
23 typedef struct _REFCOUNT_DATA
*PREFCOUNT_DATA
;
25 typedef BOOL (*PINT_ENUMERATE_RECYCLEBIN_CALLBACK
)(IN PVOID Context OPTIONAL
, IN HANDLE hDeletedFile
);
26 typedef BOOL (*PDESTROY_DATA
) (IN PREFCOUNT_DATA pData
);
28 typedef BOOL (*PCLOSE_HANDLE
) (IN HANDLE hHandle
);
29 typedef BOOL (*PDELETE_FILE
) (IN PRECYCLE_BIN bin
, IN LPCWSTR FullPath
, IN LPCWSTR FileName
);
30 typedef BOOL (*PEMPTY_RECYCLEBIN
)(IN PRECYCLE_BIN
* bin
);
31 typedef BOOL (*PENUMERATE_FILES
) (IN PRECYCLE_BIN bin
, IN PINT_ENUMERATE_RECYCLEBIN_CALLBACK pFnCallback
, IN PVOID Context OPTIONAL
);
32 typedef BOOL (*PGET_DETAILS
) (IN PRECYCLE_BIN bin
, IN HANDLE hDeletedFile
, IN DWORD BufferSize
, IN OUT PDELETED_FILE_DETAILS_W FileDetails OPTIONAL
, OUT LPDWORD RequiredSize OPTIONAL
);
33 typedef BOOL (*PRESTORE_FILE
) (IN PRECYCLE_BIN bin
, IN HANDLE hDeletedFile
);
35 typedef struct _RECYCLEBIN_CALLBACKS
37 PCLOSE_HANDLE CloseHandle
;
38 PDELETE_FILE DeleteFile
;
39 PEMPTY_RECYCLEBIN EmptyRecycleBin
;
40 PENUMERATE_FILES EnumerateFiles
;
41 PGET_DETAILS GetDetails
;
42 PRESTORE_FILE RestoreFile
;
43 } RECYCLEBIN_CALLBACKS
, *PRECYCLEBIN_CALLBACKS
;
45 typedef struct _REFCOUNT_DATA
51 typedef struct _RECYCLE_BIN
53 DWORD magic
; /* RECYCLEBIN_MAGIC */
55 REFCOUNT_DATA refCount
;
57 RECYCLEBIN_CALLBACKS Callbacks
;
59 WCHAR Folder
[ANY_SIZE
]; /* [drive]:\[RECYCLE_BIN_DIRECTORY]\{SID} */
62 typedef struct _DELETED_FILE_HANDLE
64 DWORD magic
; /* DELETEDFILE_MAGIC */
65 REFCOUNT_DATA refCount
;
67 HANDLE hDeletedFile
; /* specific to recycle bin format */
68 } DELETED_FILE_HANDLE
, *PDELETED_FILE_HANDLE
;
70 /* Structures on disk */
74 typedef struct _INFO2_HEADER
77 DWORD dwNumberOfEntries
;
78 DWORD dwHighestRecordUniqueId
;
80 DWORD dwTotalLogicalSize
;
81 } INFO2_HEADER
, *PINFO2_HEADER
;
90 IntCheckDeletedFileHandle(
91 IN HANDLE hDeletedFile
);
94 IntReferenceRecycleBin(
95 IN WCHAR driveLetter
);
100 InitializeCallbacks5(
101 IN OUT PRECYCLEBIN_CALLBACKS Callbacks
);
107 IN PREFCOUNT_DATA pData
,
108 IN PDESTROY_DATA pFnClose OPTIONAL
);
112 IN PREFCOUNT_DATA pData
);
116 IN PREFCOUNT_DATA pData
);