Partially fixed up tree after merge from HEAD. More to do.
[reactos.git] / reactos / lib / cmlib / cmlib.h
1 /*
2 * PROJECT: registry manipulation library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
5 * Copyright 2001 - 2005 Eric Kohl
6 */
7
8 #ifndef CMLIB_H
9 #define CMLIB_H
10
11 #define WIN32_NO_STATUS
12 #include <ntddk.h>
13 #include "hivedata.h"
14 #include "cmdata.h"
15
16 #ifndef ROUND_UP
17 #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
18 #define ROUND_DOWN(a,b) (((a)/(b))*(b))
19 #endif
20
21 #define CMAPI NTAPI
22
23 struct _HHIVE;
24
25 typedef PVOID (CMAPI *PGET_CELL_ROUTINE)(
26 struct _HHIVE *Hive,
27 HCELL_INDEX Cell);
28
29 typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)(
30 struct _HHIVE *Hive,
31 HCELL_INDEX Cell);
32
33 typedef PVOID (CMAPI *PALLOCATE_ROUTINE)(
34 SIZE_T Size,
35 BOOLEAN Paged);
36
37 typedef VOID (CMAPI *PFREE_ROUTINE)(
38 PVOID Ptr);
39
40 typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)(
41 struct _HHIVE *RegistryHive,
42 ULONG FileType,
43 ULONGLONG FileOffset,
44 PVOID Buffer,
45 SIZE_T BufferLength);
46
47 typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)(
48 struct _HHIVE *RegistryHive,
49 ULONG FileType,
50 ULONGLONG FileOffset,
51 PVOID Buffer,
52 SIZE_T BufferLength);
53
54 typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)(
55 struct _HHIVE *RegistryHive,
56 ULONG FileType,
57 ULONGLONG FileSize);
58
59 typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)(
60 struct _HHIVE *RegistryHive,
61 ULONG FileType);
62
63 typedef struct _HMAP_ENTRY
64 {
65 ULONG_PTR Bin;
66 ULONG_PTR Block;
67 struct _CM_VIEW_OF_FILE *CmHive;
68 ULONG MemAlloc;
69 } HMAP_ENTRY, *PHMAP_ENTRY;
70
71 typedef struct _HMAP_TABLE
72 {
73 HMAP_ENTRY Table[512];
74 } HMAP_TABLE, *PHMAP_TABLE;
75
76 typedef struct _HMAP_DIRECTORY
77 {
78 PHMAP_TABLE Directory[2048];
79 } HMAP_DIRECTORY, *PHMAP_DIRECTORY;
80
81 typedef struct _DUAL
82 {
83 ULONG Length;
84 PHMAP_DIRECTORY Map;
85 PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir;
86 ULONG Guard;
87 HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24];
88 ULONG FreeSummary;
89 LIST_ENTRY FreeBins;
90 } DUAL, *PDUAL;
91
92 typedef struct _HHIVE
93 {
94 ULONG Signature;
95 PGET_CELL_ROUTINE GetCellRoutine;
96 PRELEASE_CELL_ROUTINE ReleaseCellRoutine;
97 PALLOCATE_ROUTINE Allocate;
98 PFREE_ROUTINE Free;
99 PFILE_READ_ROUTINE FileRead;
100 PFILE_WRITE_ROUTINE FileWrite;
101 PFILE_SET_SIZE_ROUTINE FileSetSize;
102 PFILE_FLUSH_ROUTINE FileFlush;
103 PHBASE_BLOCK HiveHeader;
104 RTL_BITMAP DirtyVector;
105 ULONG DirtyCount;
106 ULONG DirtyAlloc;
107 ULONG BaseBlockAlloc;
108 ULONG Cluster;
109 BOOLEAN Flat;
110 BOOLEAN ReadOnly;
111 BOOLEAN Log;
112 BOOLEAN DirtyFlag;
113 ULONG HvBinHeadersUse;
114 ULONG HvFreeCellsUse;
115 ULONG HvUsedcellsUse;
116 ULONG CmUsedCellsUse;
117 ULONG HiveFlags;
118 ULONG LogSize;
119 ULONG RefreshCount;
120 ULONG StorageTypeCount;
121 ULONG Version;
122 DUAL Storage[HvMaxStorageType];
123 } HHIVE, *PHHIVE;
124
125 #ifndef _CM_
126 typedef struct _EREGISTRY_HIVE
127 {
128 HHIVE Hive;
129 LIST_ENTRY HiveList;
130 UNICODE_STRING HiveFileName;
131 UNICODE_STRING LogFileName;
132 PCM_KEY_SECURITY RootSecurityCell;
133 ULONG Flags;
134 HANDLE HiveHandle;
135 HANDLE LogHandle;
136 } EREGISTRY_HIVE, *PEREGISTRY_HIVE;
137 #endif
138
139 /*
140 * Public functions.
141 */
142
143 #define HV_OPERATION_CREATE_HIVE 0
144 #define HV_OPERATION_MEMORY 1
145 #define HV_OPERATION_MEMORY_INPLACE 3
146
147 NTSTATUS CMAPI
148 HvInitialize(
149 PHHIVE RegistryHive,
150 ULONG Operation,
151 ULONG_PTR HiveData OPTIONAL,
152 ULONG Cluster OPTIONAL,
153 ULONG Flags,
154 ULONG FileType,
155 PALLOCATE_ROUTINE Allocate,
156 PFREE_ROUTINE Free,
157 PFILE_READ_ROUTINE FileRead,
158 PFILE_WRITE_ROUTINE FileWrite,
159 PFILE_SET_SIZE_ROUTINE FileSetSize,
160 PFILE_FLUSH_ROUTINE FileFlush,
161 IN PUNICODE_STRING FileName);
162
163 VOID CMAPI
164 HvFree(
165 PHHIVE RegistryHive);
166
167 PVOID CMAPI
168 HvGetCell(
169 PHHIVE RegistryHive,
170 HCELL_INDEX CellOffset);
171
172 #define HvReleaseCell(h, c) \
173 if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
174
175 LONG CMAPI
176 HvGetCellSize(
177 PHHIVE RegistryHive,
178 PVOID Cell);
179
180 HCELL_INDEX CMAPI
181 HvAllocateCell(
182 PHHIVE RegistryHive,
183 SIZE_T Size,
184 HV_STORAGE_TYPE Storage);
185
186 HCELL_INDEX CMAPI
187 HvReallocateCell(
188 PHHIVE RegistryHive,
189 HCELL_INDEX CellOffset,
190 ULONG Size);
191
192 VOID CMAPI
193 HvFreeCell(
194 PHHIVE RegistryHive,
195 HCELL_INDEX CellOffset);
196
197 VOID CMAPI
198 HvMarkCellDirty(
199 PHHIVE RegistryHive,
200 HCELL_INDEX CellOffset);
201
202 BOOLEAN CMAPI
203 HvSyncHive(
204 PHHIVE RegistryHive);
205
206 BOOLEAN CMAPI
207 HvWriteHive(
208 PHHIVE RegistryHive);
209
210 BOOLEAN CMAPI
211 CmCreateRootNode(
212 PHHIVE Hive,
213 PCWSTR Name);
214
215 VOID CMAPI
216 CmPrepareHive(
217 PHHIVE RegistryHive);
218
219 /*
220 * Private functions.
221 */
222
223 PHBIN CMAPI
224 HvpAddBin(
225 PHHIVE RegistryHive,
226 ULONG Size,
227 HV_STORAGE_TYPE Storage);
228
229 NTSTATUS CMAPI
230 HvpCreateHiveFreeCellList(
231 PHHIVE Hive);
232
233 ULONG CMAPI
234 HvpHiveHeaderChecksum(
235 PHBASE_BLOCK HiveHeader);
236
237 #endif /* CMLIB_H */