4b67eb7e131b598f9a2e8b0c565765268866bcc7
[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   FSRTL_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   LIST_ENTRY     NextCCB;
110   PFILE_OBJECT   PtrFileObject;
111   LARGE_INTEGER  CurrentByteOffset;
112   /* for DirectoryControl */
113   ULONG Entry;
114   /* for DirectoryControl */
115   PWCHAR DirectorySearchPattern;
116   ULONG LastCluster;
117   ULONG LastOffset;
118 } CCB, *PCCB;
119
120 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
121
122 #define TAG_CCB TAG('I', 'C', 'C', 'B')
123
124 typedef struct
125 {
126   PDRIVER_OBJECT DriverObject;
127   PDEVICE_OBJECT DeviceObject;
128   ULONG Flags;
129 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
130
131
132 typedef enum
133 {
134   AttributeStandardInformation = 0x10,
135   AttributeAttributeList = 0x20,
136   AttributeFileName = 0x30,
137   AttributeObjectId = 0x40,
138   AttributeSecurityDescriptor = 0x50,
139   AttributeVolumeName = 0x60,
140   AttributeVolumeInformation = 0x70,
141   AttributeData = 0x80,
142   AttributeIndexRoot = 0x90,
143   AttributeIndexAllocation = 0xA0,
144   AttributeBitmap = 0xB0,
145   AttributeReparsePoint = 0xC0,
146   AttributeEAInformation = 0xD0,
147   AttributeEA = 0xE0,
148   AttributePropertySet = 0xF0,
149   AttributeLoggedUtilityStream = 0x100
150 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
151
152
153 typedef struct
154 {
155   ULONG Type;             /* Magic number 'FILE' */
156   USHORT UsnOffset;       /* Offset to the update sequence */
157   USHORT UsnSize;         /* Size in words of Update Sequence Number & Array (S) */
158   ULONGLONG Lsn;          /* $LogFile Sequence Number (LSN) */
159 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
160
161 typedef struct
162 {
163   NTFS_RECORD_HEADER Ntfs;
164   USHORT SequenceNumber;        /* Sequence number */
165   USHORT LinkCount;             /* Hard link count */
166   USHORT AttributeOffset;       /* Offset to the first Attribute */
167   USHORT Flags;                 /* Flags */
168   ULONG BytesInUse;             /* Real size of the FILE record */
169   ULONG BytesAllocated;         /* Allocated size of the FILE record */
170   ULONGLONG BaseFileRecord;     /* File reference to the base FILE record */
171   USHORT NextAttributeNumber;   /* Next Attribute Id */
172   USHORT Pading;                /* Align to 4 byte boundary (XP) */
173   ULONG MFTRecordNumber;        /* Number of this MFT Record (XP) */
174 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
175
176 /* Flags in FILE_RECORD_HEADER */
177
178 #define FRH_IN_USE    0x01    /* Record is in use */
179 #define FRH_DIRECTORY 0x02    /* Record is a directory */
180 #define FRH_UNKNOWN1  0x04    /* Don't know */
181 #define FRH_UNKNOWN2  0x08    /* Don't know */
182
183 typedef struct
184 {
185   ATTRIBUTE_TYPE AttributeType;
186   ULONG Length;
187   BOOLEAN Nonresident;
188   UCHAR NameLength;
189   USHORT NameOffset;
190   USHORT Flags;
191   USHORT AttributeNumber;
192 } ATTRIBUTE, *PATTRIBUTE;
193
194 typedef struct
195 {
196   ATTRIBUTE Attribute;
197   ULONG ValueLength;
198   USHORT ValueOffset;
199   UCHAR Flags;
200 //  UCHAR Padding0;
201 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
202
203 typedef struct
204 {
205   ATTRIBUTE Attribute;
206   ULONGLONG StartVcn; // LowVcn
207   ULONGLONG LastVcn; // HighVcn
208   USHORT RunArrayOffset;
209   USHORT CompressionUnit;
210   ULONG  Padding0;
211   UCHAR  IndexedFlag;
212   ULONGLONG AllocatedSize;
213   ULONGLONG DataSize;
214   ULONGLONG InitializedSize;
215   ULONGLONG CompressedSize;
216 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
217
218
219 typedef struct
220 {
221   ULONGLONG CreationTime;
222   ULONGLONG ChangeTime;
223   ULONGLONG LastWriteTime;
224   ULONGLONG LastAccessTime;
225   ULONG FileAttribute;
226   ULONG AlignmentOrReserved[3];
227 #if 0
228   ULONG QuotaId;
229   ULONG SecurityId;
230   ULONGLONG QuotaCharge;
231   USN Usn;
232 #endif
233 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
234
235
236 typedef struct
237 {
238   ATTRIBUTE_TYPE AttributeType;
239   USHORT Length;
240   UCHAR NameLength;
241   UCHAR NameOffset;
242   ULONGLONG StartVcn; // LowVcn
243   ULONGLONG FileReferenceNumber;
244   USHORT AttributeNumber;
245   USHORT AlignmentOrReserved[3];
246 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
247
248
249 typedef struct
250 {
251   ULONGLONG DirectoryFileReferenceNumber;
252   ULONGLONG CreationTime;
253   ULONGLONG ChangeTime;
254   ULONGLONG LastWriteTime;
255   ULONGLONG LastAccessTime;
256   ULONGLONG AllocatedSize;
257   ULONGLONG DataSize;
258   ULONG FileAttributes;
259   ULONG AlignmentOrReserved;
260   UCHAR NameLength;
261   UCHAR NameType;
262   WCHAR Name[1];
263 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
264
265 typedef struct
266 {
267   ULONGLONG Unknown1;
268   UCHAR MajorVersion;
269   UCHAR MinorVersion;
270   USHORT Flags;
271   ULONG Unknown2;
272 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
273
274
275 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
276
277 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
278 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
279
280
281 /* attrib.c */
282
283 VOID
284 NtfsDumpAttribute(PATTRIBUTE Attribute);
285
286
287 /* blockdev.c */
288
289 NTSTATUS
290 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
291                 IN ULONG DiskSector,
292                 IN ULONG SectorCount,
293                 IN ULONG SectorSize,
294                 IN OUT PUCHAR Buffer);
295
296 NTSTATUS
297 NtfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
298                    IN ULONG DiskSector,
299                    IN ULONG SectorCount,
300                    IN ULONG SectorSize,
301                    IN OUT PUCHAR Buffer);
302
303 NTSTATUS
304 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
305                     IN ULONG ControlCode,
306                     IN PVOID InputBuffer,
307                     IN ULONG InputBufferSize,
308                     IN OUT PVOID OutputBuffer,
309                     IN OUT PULONG OutputBufferSize);
310
311 /* close.c */
312
313 NTSTATUS STDCALL
314 NtfsClose(PDEVICE_OBJECT DeviceObject,
315           PIRP Irp);
316
317 /* create.c */
318
319 NTSTATUS STDCALL
320 NtfsCreate(PDEVICE_OBJECT DeviceObject,
321            PIRP Irp);
322
323
324 /* dirctl.c */
325
326 NTSTATUS STDCALL
327 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
328                      PIRP Irp);
329
330 /* fcb.c */
331
332 PFCB
333 NtfsCreateFCB(PWCHAR FileName);
334
335 VOID
336 NtfsDestroyFCB(PFCB Fcb);
337
338 BOOLEAN
339 NtfsFCBIsDirectory(PFCB Fcb);
340
341 BOOLEAN
342 NtfsFCBIsRoot(PFCB Fcb);
343
344 VOID
345 NtfsGrabFCB(PDEVICE_EXTENSION Vcb,
346             PFCB Fcb);
347
348 VOID
349 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb,
350                PFCB Fcb);
351
352 VOID
353 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
354                   PFCB Fcb);
355
356 PFCB
357 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
358                      PWSTR FileName);
359
360 NTSTATUS
361 NtfsFCBInitializeCache(PVCB Vcb,
362                        PFCB Fcb);
363
364 PFCB
365 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
366
367 PFCB
368 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
369
370 NTSTATUS
371 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
372                           PFCB Fcb,
373                           PFILE_OBJECT FileObject);
374
375 NTSTATUS
376 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
377                   PFCB *pParentFCB,
378                   PFCB *pFCB,
379                   const PWSTR pFileName);
380
381
382 /* finfo.c */
383
384 NTSTATUS STDCALL
385 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject,
386                      PIRP Irp);
387
388
389 /* fsctl.c */
390
391 NTSTATUS STDCALL
392 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
393                       PIRP Irp);
394
395
396 /* mft.c */
397 NTSTATUS
398 NtfsOpenMft(PDEVICE_OBJECT DeviceObject,
399             PDEVICE_EXTENSION Vcb);
400
401
402 #if 0
403 /* misc.c */
404
405 BOOLEAN
406 wstrcmpjoki(PWSTR s1, PWSTR s2);
407
408 VOID
409 CdfsSwapString(PWCHAR Out,
410                PUCHAR In,
411                ULONG Count);
412
413 VOID
414 CdfsDateTimeToFileTime(PFCB Fcb,
415                        TIME *FileTime);
416
417 VOID
418 CdfsFileFlagsToAttributes(PFCB Fcb,
419                           PULONG FileAttributes);
420 #endif
421
422 /* rw.c */
423
424 NTSTATUS STDCALL
425 NtfsRead(PDEVICE_OBJECT DeviceObject,
426         PIRP Irp);
427
428 NTSTATUS STDCALL
429 NtfsWrite(PDEVICE_OBJECT DeviceObject,
430           PIRP Irp);
431
432
433 /* volinfo.c */
434
435 NTSTATUS STDCALL
436 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
437                            PIRP Irp);
438
439 NTSTATUS STDCALL
440 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
441                          PIRP Irp);
442
443 #endif /* NTFS_H */