branch update for HEAD-2003021201
[reactos.git] / drivers / fs / ntfs / ntfs.h
1 #ifndef NTFS_H
2 #define NTFS_H
3
4 #include <ddk/ntifs.h>
5
6
7 #define CACHEPAGESIZE(pDeviceExt) \
8         ((pDeviceExt)->NtfsInfo.BytesPerCluster > PAGE_SIZE ? \
9          (pDeviceExt)->NtfsInfo.BytesPerCluster : PAGE_SIZE)
10
11 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
12
13 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
14
15
16 typedef struct _BOOT_SECTOR
17 {
18   UCHAR     Magic[3];                           // 0x00
19   UCHAR     OemName[8];                         // 0x03
20   USHORT    BytesPerSector;                     // 0x0B
21   UCHAR     SectorsPerCluster;                  // 0x0D
22   UCHAR     Unused0[7];                         // 0x0E
23   UCHAR     MediaId;                            // 0x15
24   UCHAR     Unused1[2];                         // 0x16
25   USHORT    SectorsPerTrack;
26   USHORT    Heads;
27   UCHAR     Unused2[8];
28   UCHAR     Unknown0[4]; /* always 80 00 80 00 */
29   ULONGLONG SectorCount;
30   ULONGLONG MftLocation;
31   ULONGLONG MftMirrLocation;
32   ULONG     ClustersPerMftRecord;
33   ULONG     ClustersPerIndexRecord;
34   ULONGLONG SerialNumber;                       // 0x48
35   UCHAR     BootCode[432];                      // 0x50
36 } __attribute__((packed)) BOOT_SECTOR, *PBOOT_SECTOR;
37
38 //typedef struct _BootSector BootSector;
39
40
41
42
43
44 typedef struct _NTFS_INFO
45 {
46   ULONG BytesPerSector;
47   ULONG SectorsPerCluster;
48   ULONG BytesPerCluster;
49   ULONGLONG SectorCount;
50   ULARGE_INTEGER MftStart;
51   ULARGE_INTEGER MftMirrStart;
52   ULONGLONG SerialNumber;
53
54 } NTFS_INFO, *PNTFS_INFO;
55
56
57 typedef struct
58 {
59   ERESOURCE DirResource;
60 //  ERESOURCE FatResource;
61
62   KSPIN_LOCK FcbListLock;
63   LIST_ENTRY FcbListHead;
64
65   PVPB Vpb;
66   PDEVICE_OBJECT StorageDevice;
67   PFILE_OBJECT StreamFileObject;
68
69   NTFS_INFO NtfsInfo;
70
71
72 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
73
74
75 #define FCB_CACHE_INITIALIZED   0x0001
76 #define FCB_IS_VOLUME_STREAM    0x0002
77 #define FCB_IS_VOLUME           0x0004
78
79 typedef struct _FCB
80 {
81   REACTOS_COMMON_FCB_HEADER RFCB;
82   SECTION_OBJECT_POINTERS SectionObjectPointers;
83
84   PFILE_OBJECT FileObject;
85   PDEVICE_EXTENSION DevExt;
86
87   WCHAR *ObjectName;            /* point on filename (250 chars max) in PathName */
88   WCHAR PathName[MAX_PATH];     /* path+filename 260 max */
89
90   ERESOURCE PagingIoResource;
91   ERESOURCE MainResource;
92
93   LIST_ENTRY FcbListEntry;
94   struct _FCB* ParentFcb;
95
96   ULONG DirIndex;
97
98   LONG RefCount;
99   ULONG Flags;
100
101 //  DIR_RECORD Entry;
102
103
104 } FCB, *PFCB;
105
106
107 typedef struct _CCB
108 {
109   PFCB           Fcb;
110   LIST_ENTRY     NextCCB;
111   PFILE_OBJECT   PtrFileObject;
112   LARGE_INTEGER  CurrentByteOffset;
113   /* for DirectoryControl */
114   ULONG Entry;
115   /* for DirectoryControl */
116   PWCHAR DirectorySearchPattern;
117   ULONG LastCluster;
118   ULONG LastOffset;
119 } CCB, *PCCB;
120
121 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
122
123 #define TAG_CCB TAG('I', 'C', 'C', 'B')
124
125 typedef struct
126 {
127   PDRIVER_OBJECT DriverObject;
128   PDEVICE_OBJECT DeviceObject;
129   ULONG Flags;
130 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
131
132
133 typedef enum
134 {
135   AttributeStandardInformation = 0x10,
136   AttributeAttributeList = 0x20,
137   AttributeFileName = 0x30,
138   AttributeObjectId = 0x40,
139   AttributeSecurityDescriptor = 0x50,
140   AttributeVolumeName = 0x60,
141   AttributeVolumeInformation = 0x70,
142   AttributeData = 0x80,
143   AttributeIndexRoot = 0x90,
144   AttributeIndexAllocation = 0xA0,
145   AttributeBitmap = 0xB0,
146   AttributeReparsePoint = 0xC0,
147   AttributeEAInformation = 0xD0,
148   AttributeEA = 0xE0,
149   AttributePropertySet = 0xF0,
150   AttributeLoggedUtilityStream = 0x100
151 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
152
153
154 typedef struct
155 {
156   ULONG Type;
157   USHORT UsnOffset;
158   USHORT UsnSize;
159   ULONGLONG Usn;
160 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
161
162 typedef struct
163 {
164   NTFS_RECORD_HEADER Ntfs;
165   USHORT SequenceNumber;
166   USHORT LinkCount;
167   USHORT AttributeOffset;
168   USHORT Flags;
169   ULONG BytesInUse;
170   ULONG BytesAllocated;
171   ULONGLONG BaseFileRecord;
172   USHORT NextAttributeNumber;
173 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
174
175 typedef struct
176 {
177   ATTRIBUTE_TYPE AttributeType;
178   ULONG Length;
179   BOOLEAN Nonresident;
180   UCHAR NameLength;
181   USHORT NameOffset;
182   USHORT Flags;
183   USHORT AttributeNumber;
184 } ATTRIBUTE, *PATTRIBUTE;
185
186 typedef struct
187 {
188   ATTRIBUTE Attribute;
189   ULONG ValueLength;
190   USHORT ValueOffset;
191   UCHAR Flags;
192 //  UCHAR Padding0;
193 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
194
195 typedef struct
196 {
197   ATTRIBUTE Attribute;
198   ULONGLONG StartVcn; // LowVcn
199   ULONGLONG LastVcn; // HighVcn
200   USHORT RunArrayOffset;
201   USHORT CompressionUnit;
202   ULONG  Padding0;
203   UCHAR  IndexedFlag;
204   ULONGLONG AllocatedSize;
205   ULONGLONG DataSize;
206   ULONGLONG InitializedSize;
207   ULONGLONG CompressedSize;
208 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
209
210
211 typedef struct
212 {
213   ULONGLONG CreationTime;
214   ULONGLONG ChangeTime;
215   ULONGLONG LastWriteTime;
216   ULONGLONG LastAccessTime;
217   ULONG FileAttribute;
218   ULONG AlignmentOrReserved[3];
219 #if 0
220   ULONG QuotaId;
221   ULONG SecurityId;
222   ULONGLONG QuotaCharge;
223   USN Usn;
224 #endif
225 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
226
227
228 typedef struct
229 {
230   ATTRIBUTE_TYPE AttributeType;
231   USHORT Length;
232   UCHAR NameLength;
233   UCHAR NameOffset;
234   ULONGLONG StartVcn; // LowVcn
235   ULONGLONG FileReferenceNumber;
236   USHORT AttributeNumber;
237   USHORT AlignmentOrReserved[3];
238 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
239
240
241 typedef struct
242 {
243   ULONGLONG DirectoryFileReferenceNumber;
244   ULONGLONG CreationTime;
245   ULONGLONG ChangeTime;
246   ULONGLONG LastWriteTime;
247   ULONGLONG LastAccessTime;
248   ULONGLONG AllocatedSize;
249   ULONGLONG DataSize;
250   ULONG FileAttributes;
251   ULONG AlignmentOrReserved;
252   UCHAR NameLength;
253   UCHAR NameType;
254   WCHAR Name[1];
255 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
256
257 typedef struct
258 {
259   ULONGLONG Unknown1;
260   UCHAR MajorVersion;
261   UCHAR MinorVersion;
262   USHORT Flags;
263   ULONG Unknown2;
264 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
265
266
267 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
268
269 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
270 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
271
272
273 /* attrib.c */
274
275 VOID
276 NtfsDumpAttribute(PATTRIBUTE Attribute);
277
278
279 /* blockdev.c */
280
281 NTSTATUS
282 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
283                 IN ULONG DiskSector,
284                 IN ULONG SectorCount,
285                 IN ULONG SectorSize,
286                 IN OUT PUCHAR Buffer);
287
288 NTSTATUS
289 NtfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
290                    IN ULONG DiskSector,
291                    IN ULONG SectorCount,
292                    IN ULONG SectorSize,
293                    IN OUT PUCHAR Buffer);
294
295 NTSTATUS
296 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
297                     IN ULONG ControlCode,
298                     IN PVOID InputBuffer,
299                     IN ULONG InputBufferSize,
300                     IN OUT PVOID OutputBuffer,
301                     IN OUT PULONG OutputBufferSize);
302
303 #if 0
304 /* close.c */
305
306 NTSTATUS STDCALL
307 CdfsClose(PDEVICE_OBJECT DeviceObject,
308           PIRP Irp);
309 #endif
310
311 /* create.c */
312
313 NTSTATUS STDCALL
314 NtfsCreate(PDEVICE_OBJECT DeviceObject,
315            PIRP Irp);
316
317
318 /* dirctl.c */
319
320 NTSTATUS STDCALL
321 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
322                      PIRP Irp);
323
324
325 /* fcb.c */
326
327 PFCB
328 NtfsCreateFCB(PWCHAR FileName);
329
330 VOID
331 NtfsDestroyFCB(PFCB Fcb);
332
333 BOOLEAN
334 NtfsFCBIsDirectory(PFCB Fcb);
335
336 BOOLEAN
337 NtfsFCBIsRoot(PFCB Fcb);
338
339 VOID
340 NtfsGrabFCB(PDEVICE_EXTENSION Vcb,
341             PFCB Fcb);
342
343 VOID
344 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb,
345                PFCB Fcb);
346
347 VOID
348 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
349                   PFCB Fcb);
350
351 PFCB
352 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
353                      PWSTR FileName);
354
355 NTSTATUS
356 NtfsFCBInitializeCache(PVCB Vcb,
357                        PFCB Fcb);
358
359 PFCB
360 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
361
362 PFCB
363 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
364
365 NTSTATUS
366 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
367                           PFCB Fcb,
368                           PFILE_OBJECT FileObject);
369
370 NTSTATUS
371 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
372                   PFCB *pParentFCB,
373                   PFCB *pFCB,
374                   const PWSTR pFileName);
375
376
377 /* finfo.c */
378
379 NTSTATUS STDCALL
380 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject,
381                      PIRP Irp);
382
383
384 /* fsctl.c */
385
386 NTSTATUS STDCALL
387 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
388                       PIRP Irp);
389
390
391 /* mft.c */
392 NTSTATUS
393 NtfsOpenMft(PDEVICE_OBJECT DeviceObject,
394             PDEVICE_EXTENSION Vcb);
395
396
397 #if 0
398 /* misc.c */
399
400 BOOLEAN
401 wstrcmpjoki(PWSTR s1, PWSTR s2);
402
403 VOID
404 CdfsSwapString(PWCHAR Out,
405                PUCHAR In,
406                ULONG Count);
407
408 VOID
409 CdfsDateTimeToFileTime(PFCB Fcb,
410                        TIME *FileTime);
411
412 VOID
413 CdfsFileFlagsToAttributes(PFCB Fcb,
414                           PULONG FileAttributes);
415
416 /* rw.c */
417
418 NTSTATUS STDCALL
419 CdfsRead(PDEVICE_OBJECT DeviceObject,
420         PIRP Irp);
421
422 NTSTATUS STDCALL
423 CdfsWrite(PDEVICE_OBJECT DeviceObject,
424           PIRP Irp);
425 #endif
426
427
428 /* volinfo.c */
429
430 NTSTATUS STDCALL
431 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
432                            PIRP Irp);
433
434 NTSTATUS STDCALL
435 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
436                          PIRP Irp);
437
438 #endif /* NTFS_H */