Add library to deal with recycle bin.
[reactos.git] / reactos / lib / recyclebin / recyclebin_private.h
1 #include "recyclebin.h"
2 #include "sddl.h"
3
4 /* Defines */
5 #define RECYCLEBIN_MAGIC 0x6e694252
6 #define DELETEDFILE_MAGIC 0x6e694253
7
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"
11
12 #define ROUND_UP(N, S) ((( (N) + (S) - 1) / (S) ) * (S) )
13
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; }
18
19 /* Typedefs */
20 struct _RECYCLE_BIN;
21 typedef struct _RECYCLE_BIN *PRECYCLE_BIN;
22 struct _REFCOUNT_DATA;
23 typedef struct _REFCOUNT_DATA *PREFCOUNT_DATA;
24
25 typedef BOOL (*PINT_ENUMERATE_RECYCLEBIN_CALLBACK)(IN PVOID Context, IN HANDLE hDeletedFile);
26 typedef BOOL (*PDESTROY_DATA) (IN PREFCOUNT_DATA pData);
27
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);
32 typedef BOOL (*PGET_DETAILS) (IN PRECYCLE_BIN bin, IN HANDLE hDeletedFile, IN DWORD BufferSize, IN OUT PDELETED_FILE_DETAILS_W FileDetails, OUT LPDWORD RequiredSize OPTIONAL);
33 typedef BOOL (*PRESTORE_FILE) (IN PRECYCLE_BIN bin, IN HANDLE hDeletedFile);
34
35 typedef struct _RECYCLEBIN_CALLBACKS
36 {
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;
44
45 typedef struct _REFCOUNT_DATA
46 {
47 DWORD ReferenceCount;
48 PDESTROY_DATA Close;
49 } REFCOUNT_DATA;
50
51 typedef struct _RECYCLE_BIN
52 {
53 DWORD magic; /* RECYCLEBIN_MAGIC */
54 LIST_ENTRY ListEntry;
55 REFCOUNT_DATA refCount;
56 HANDLE hInfo;
57 RECYCLEBIN_CALLBACKS Callbacks;
58 LPWSTR InfoFile;
59 WCHAR Folder[ANY_SIZE]; /* [drive]:\[RECYCLE_BIN_DIRECTORY]\{SID} */
60 } RECYCLE_BIN;
61
62 typedef struct _DELETED_FILE_HANDLE
63 {
64 DWORD magic; /* DELETEDFILE_MAGIC */
65 REFCOUNT_DATA refCount;
66 PRECYCLE_BIN bin;
67 HANDLE hDeletedFile; /* specific to recycle bin format */
68 } DELETED_FILE_HANDLE, *PDELETED_FILE_HANDLE;
69
70 /* Structures on disk */
71
72 #include <pshpack1.h>
73
74 typedef struct _INFO2_HEADER
75 {
76 DWORD dwVersion;
77 DWORD dwNumberOfEntries;
78 DWORD dwHighestRecordUniqueId;
79 DWORD dwRecordSize;
80 DWORD dwTotalLogicalSize;
81 } INFO2_HEADER, *PINFO2_HEADER;
82
83 #include <poppack.h>
84
85 /* Prototypes */
86
87 /* openclose.c */
88
89 BOOL
90 IntCheckDeletedFileHandle(
91 IN HANDLE hDeletedFile);
92
93 PRECYCLE_BIN
94 IntReferenceRecycleBin(
95 IN WCHAR driveLetter);
96
97 /* recyclebin_v5.c */
98
99 VOID
100 InitializeCallbacks5(
101 IN OUT PRECYCLEBIN_CALLBACKS Callbacks);
102
103 /* refcount.c */
104
105 BOOL
106 InitializeHandle(
107 IN PREFCOUNT_DATA pData,
108 IN PDESTROY_DATA pFnClose OPTIONAL);
109
110 BOOL
111 ReferenceHandle(
112 IN PREFCOUNT_DATA pData);
113
114 BOOL
115 DereferenceHandle(
116 IN PREFCOUNT_DATA pData);