:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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
258
259 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
260
261 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
262 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
263
264
265 /* attrib.c */
266
267 VOID
268 NtfsDumpAttribute(PATTRIBUTE Attribute);
269
270
271 /* blockdev.c */
272
273 NTSTATUS
274 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
275                 IN ULONG DiskSector,
276                 IN ULONG SectorCount,
277                 IN ULONG SectorSize,
278                 IN OUT PUCHAR Buffer);
279
280 NTSTATUS
281 NtfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
282                    IN ULONG DiskSector,
283                    IN ULONG SectorCount,
284                    IN ULONG SectorSize,
285                    IN OUT PUCHAR Buffer);
286
287 NTSTATUS
288 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
289                     IN ULONG ControlCode,
290                     IN PVOID InputBuffer,
291                     IN ULONG InputBufferSize,
292                     IN OUT PVOID OutputBuffer,
293                     IN OUT PULONG OutputBufferSize);
294
295 #if 0
296 /* close.c */
297
298 NTSTATUS STDCALL
299 CdfsClose(PDEVICE_OBJECT DeviceObject,
300           PIRP Irp);
301 #endif
302
303 /* create.c */
304
305 NTSTATUS STDCALL
306 NtfsCreate(PDEVICE_OBJECT DeviceObject,
307            PIRP Irp);
308
309
310 /* dirctl.c */
311
312 NTSTATUS STDCALL
313 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
314                      PIRP Irp);
315
316
317 /* fcb.c */
318
319 PFCB
320 NtfsCreateFCB(PWCHAR FileName);
321
322 VOID
323 NtfsDestroyFCB(PFCB Fcb);
324
325 BOOLEAN
326 NtfsFCBIsDirectory(PFCB Fcb);
327
328 BOOLEAN
329 NtfsFCBIsRoot(PFCB Fcb);
330
331 VOID
332 NtfsGrabFCB(PDEVICE_EXTENSION Vcb,
333             PFCB Fcb);
334
335 VOID
336 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb,
337                PFCB Fcb);
338
339 VOID
340 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
341                   PFCB Fcb);
342
343 PFCB
344 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
345                      PWSTR FileName);
346
347 NTSTATUS
348 NtfsFCBInitializeCache(PVCB Vcb,
349                        PFCB Fcb);
350
351 PFCB
352 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
353
354 PFCB
355 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
356
357 NTSTATUS
358 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
359                           PFCB Fcb,
360                           PFILE_OBJECT FileObject);
361
362 NTSTATUS
363 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
364                   PFCB *pParentFCB,
365                   PFCB *pFCB,
366                   const PWSTR pFileName);
367
368
369 /* finfo.c */
370
371 NTSTATUS STDCALL
372 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject,
373                      PIRP Irp);
374
375
376 /* fsctl.c */
377
378 NTSTATUS STDCALL
379 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
380                       PIRP Irp);
381
382
383 /* mft.c */
384 NTSTATUS
385 NtfsOpenMft(PDEVICE_OBJECT DeviceObject,
386             PDEVICE_EXTENSION Vcb);
387
388
389 #if 0
390 /* misc.c */
391
392 BOOLEAN
393 wstrcmpjoki(PWSTR s1, PWSTR s2);
394
395 VOID
396 CdfsSwapString(PWCHAR Out,
397                PUCHAR In,
398                ULONG Count);
399
400 VOID
401 CdfsDateTimeToFileTime(PFCB Fcb,
402                        TIME *FileTime);
403
404 VOID
405 CdfsFileFlagsToAttributes(PFCB Fcb,
406                           PULONG FileAttributes);
407
408 /* rw.c */
409
410 NTSTATUS STDCALL
411 CdfsRead(PDEVICE_OBJECT DeviceObject,
412         PIRP Irp);
413
414 NTSTATUS STDCALL
415 CdfsWrite(PDEVICE_OBJECT DeviceObject,
416           PIRP Irp);
417 #endif
418
419
420 /* volinfo.c */
421
422 NTSTATUS STDCALL
423 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
424                            PIRP Irp);
425
426 NTSTATUS STDCALL
427 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
428                          PIRP Irp);
429
430 #endif /* NTFS_H */