[NTFS]
[reactos.git] / reactos / drivers / filesystems / ntfs / ntfs.h
1 #ifndef NTFS_H
2 #define NTFS_H
3
4 #include <ntifs.h>
5
6 #define CACHEPAGESIZE(pDeviceExt) \
7 ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
8 (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
9
10 #define TAG_NTFS 'SFTN'
11
12 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
13
14 #define DEVICE_NAME L"\\Ntfs"
15
16 #include <pshpack1.h>
17 typedef struct _BIOS_PARAMETERS_BLOCK
18 {
19 USHORT BytesPerSector; // 0x0B
20 UCHAR SectorsPerCluster; // 0x0D
21 UCHAR Unused0[7]; // 0x0E, checked when volume is mounted
22 UCHAR MediaId; // 0x15
23 UCHAR Unused1[2]; // 0x16
24 USHORT SectorsPerTrack; // 0x18
25 USHORT Heads; // 0x1A
26 UCHAR Unused2[4]; // 0x1C
27 UCHAR Unused3[4]; // 0x20, checked when volume is mounted
28 } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK;
29
30 typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
31 {
32 USHORT Unknown[2]; // 0x24, always 80 00 80 00
33 ULONGLONG SectorCount; // 0x28
34 ULONGLONG MftLocation; // 0x30
35 ULONGLONG MftMirrLocation; // 0x38
36 CHAR ClustersPerMftRecord; // 0x40
37 UCHAR Unused4[3]; // 0x41
38 CHAR ClustersPerIndexRecord; // 0x44
39 UCHAR Unused5[3]; // 0x45
40 ULONGLONG SerialNumber; // 0x48
41 UCHAR Checksum[4]; // 0x50
42 } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK;
43
44 typedef struct _BOOT_SECTOR
45 {
46 UCHAR Jump[3]; // 0x00
47 UCHAR OEMID[8]; // 0x03
48 BIOS_PARAMETERS_BLOCK BPB;
49 EXTENDED_BIOS_PARAMETERS_BLOCK EBPB;
50 UCHAR BootStrap[426]; // 0x54
51 USHORT EndSector; // 0x1FE
52 } BOOT_SECTOR, *PBOOT_SECTOR;
53 #include <poppack.h>
54
55 //typedef struct _BootSector BootSector;
56
57 typedef struct _NTFS_INFO
58 {
59 ULONG BytesPerSector;
60 ULONG SectorsPerCluster;
61 ULONG BytesPerCluster;
62 ULONGLONG SectorCount;
63 ULARGE_INTEGER MftStart;
64 ULARGE_INTEGER MftMirrStart;
65 ULONG BytesPerFileRecord;
66 ULONG BytesPerIndexRecord;
67
68 ULONGLONG SerialNumber;
69 USHORT VolumeLabelLength;
70 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
71 UCHAR MajorVersion;
72 UCHAR MinorVersion;
73 USHORT Flags;
74
75 } NTFS_INFO, *PNTFS_INFO;
76
77 #define NTFS_TYPE_CCB '20SF'
78 #define NTFS_TYPE_FCB '30SF'
79 #define NTFS_TYPE_VCB '50SF'
80 #define NTFS_TYPE_IRP_CONTEST '60SF'
81 #define NTFS_TYPE_GLOBAL_DATA '70SF'
82
83 typedef struct
84 {
85 ULONG Type;
86 ULONG Size;
87 } NTFSIDENTIFIER, *PNTFSIDENTIFIER;
88
89
90 typedef struct
91 {
92 NTFSIDENTIFIER Identifier;
93
94 ERESOURCE DirResource;
95 // ERESOURCE FatResource;
96
97 KSPIN_LOCK FcbListLock;
98 LIST_ENTRY FcbListHead;
99
100 PVPB Vpb;
101 PDEVICE_OBJECT StorageDevice;
102 PFILE_OBJECT StreamFileObject;
103
104 NTFS_INFO NtfsInfo;
105
106 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, NTFS_VCB, *PNTFS_VCB;
107
108
109 #define FCB_CACHE_INITIALIZED 0x0001
110 #define FCB_IS_VOLUME_STREAM 0x0002
111 #define FCB_IS_VOLUME 0x0004
112 #define MAX_PATH 260
113
114 typedef struct _FCB
115 {
116 NTFSIDENTIFIER Identifier;
117
118 FSRTL_COMMON_FCB_HEADER RFCB;
119 SECTION_OBJECT_POINTERS SectionObjectPointers;
120
121 PFILE_OBJECT FileObject;
122 PNTFS_VCB Vcb;
123
124 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
125 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
126
127 ERESOURCE PagingIoResource;
128 ERESOURCE MainResource;
129
130 LIST_ENTRY FcbListEntry;
131 struct _FCB* ParentFcb;
132
133 ULONG DirIndex;
134
135 LONG RefCount;
136 ULONG Flags;
137
138 // DIR_RECORD Entry;
139
140 } NTFS_FCB, *PNTFS_FCB;
141
142
143 typedef struct
144 {
145 NTFSIDENTIFIER Identifier;
146 LIST_ENTRY NextCCB;
147 PFILE_OBJECT PtrFileObject;
148 LARGE_INTEGER CurrentByteOffset;
149 /* for DirectoryControl */
150 ULONG Entry;
151 /* for DirectoryControl */
152 PWCHAR DirectorySearchPattern;
153 ULONG LastCluster;
154 ULONG LastOffset;
155 } NTFS_CCB, *PNTFS_CCB;
156
157 #define TAG_CCB 'BCCI'
158
159 typedef struct
160 {
161 NTFSIDENTIFIER Identifier;
162 ERESOURCE Resource;
163 PDRIVER_OBJECT DriverObject;
164 PDEVICE_OBJECT DeviceObject;
165 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
166 ULONG Flags;
167 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
168
169
170 typedef enum
171 {
172 AttributeStandardInformation = 0x10,
173 AttributeAttributeList = 0x20,
174 AttributeFileName = 0x30,
175 AttributeObjectId = 0x40,
176 AttributeSecurityDescriptor = 0x50,
177 AttributeVolumeName = 0x60,
178 AttributeVolumeInformation = 0x70,
179 AttributeData = 0x80,
180 AttributeIndexRoot = 0x90,
181 AttributeIndexAllocation = 0xA0,
182 AttributeBitmap = 0xB0,
183 AttributeReparsePoint = 0xC0,
184 AttributeEAInformation = 0xD0,
185 AttributeEA = 0xE0,
186 AttributePropertySet = 0xF0,
187 AttributeLoggedUtilityStream = 0x100
188 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
189
190 #define COLLATION_BINARY 0x00
191 #define COLLATION_FILE_NAME 0x01
192 #define COLLATION_UNICODE_STRING 0x02
193 #define COLLATION_NTOFS_ULONG 0x10
194 #define COLLATION_NTOFS_SID 0x11
195 #define COLLATION_NTOFS_SECURITY_HASH 0x12
196 #define COLLATION_NTOFS_ULONGS 0x13
197
198 #define INDEX_ROOT_SMALL 0x0
199 #define INDEX_ROOT_LARGE 0x1
200
201 typedef struct
202 {
203 ULONG Type; /* Magic number 'FILE' */
204 USHORT UsaOffset; /* Offset to the update sequence */
205 USHORT UsaCount; /* Size in words of Update Sequence Number & Array (S) */
206 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
207 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
208
209 /* NTFS_RECORD_HEADER.Type */
210 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
211
212
213 typedef struct
214 {
215 NTFS_RECORD_HEADER Ntfs;
216 USHORT SequenceNumber; /* Sequence number */
217 USHORT LinkCount; /* Hard link count */
218 USHORT AttributeOffset; /* Offset to the first Attribute */
219 USHORT Flags; /* Flags */
220 ULONG BytesInUse; /* Real size of the FILE record */
221 ULONG BytesAllocated; /* Allocated size of the FILE record */
222 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
223 USHORT NextAttributeNumber; /* Next Attribute Id */
224 USHORT Pading; /* Align to 4 UCHAR boundary (XP) */
225 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
226 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
227
228 /* Flags in FILE_RECORD_HEADER */
229
230 #define FRH_IN_USE 0x0001 /* Record is in use */
231 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
232 #define FRH_UNKNOWN1 0x0004 /* Don't know */
233 #define FRH_UNKNOWN2 0x0008 /* Don't know */
234
235 typedef struct
236 {
237 ATTRIBUTE_TYPE AttributeType;
238 ULONG Length;
239 BOOLEAN Nonresident;
240 UCHAR NameLength;
241 USHORT NameOffset;
242 USHORT Flags;
243 USHORT AttributeNumber;
244 } ATTRIBUTE, *PATTRIBUTE;
245
246 typedef struct
247 {
248 ATTRIBUTE Attribute;
249 ULONG ValueLength;
250 USHORT ValueOffset;
251 UCHAR Flags;
252 // UCHAR Padding0;
253 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
254
255 typedef struct
256 {
257 ATTRIBUTE Attribute;
258 ULONGLONG StartVcn; // LowVcn
259 ULONGLONG LastVcn; // HighVcn
260 USHORT RunArrayOffset;
261 USHORT CompressionUnit;
262 ULONG Padding0;
263 UCHAR IndexedFlag;
264 ULONGLONG AllocatedSize;
265 ULONGLONG DataSize;
266 ULONGLONG InitializedSize;
267 ULONGLONG CompressedSize;
268 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
269
270
271 typedef struct
272 {
273 ULONGLONG CreationTime;
274 ULONGLONG ChangeTime;
275 ULONGLONG LastWriteTime;
276 ULONGLONG LastAccessTime;
277 ULONG FileAttribute;
278 ULONG AlignmentOrReserved[3];
279 #if 0
280 ULONG QuotaId;
281 ULONG SecurityId;
282 ULONGLONG QuotaCharge;
283 USN Usn;
284 #endif
285 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
286
287
288 typedef struct
289 {
290 ATTRIBUTE_TYPE AttributeType;
291 USHORT Length;
292 UCHAR NameLength;
293 UCHAR NameOffset;
294 ULONGLONG StartVcn; // LowVcn
295 ULONGLONG FileReferenceNumber;
296 USHORT AttributeNumber;
297 USHORT AlignmentOrReserved[3];
298 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
299
300
301 typedef struct
302 {
303 ULONGLONG DirectoryFileReferenceNumber;
304 ULONGLONG CreationTime;
305 ULONGLONG ChangeTime;
306 ULONGLONG LastWriteTime;
307 ULONGLONG LastAccessTime;
308 ULONGLONG AllocatedSize;
309 ULONGLONG DataSize;
310 ULONG FileAttributes;
311 ULONG AlignmentOrReserved;
312 UCHAR NameLength;
313 UCHAR NameType;
314 WCHAR Name[1];
315 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
316
317 typedef struct
318 {
319 ULONG FirstEntryOffset;
320 ULONG TotalSizeOfEntries;
321 ULONG AllocatedSize;
322 UCHAR Flags;
323 UCHAR Padding[3];
324 } INDEX_HEADER_ATTRIBUTE, *PINDEX_HEADER_ATTRIBUTE;
325
326 typedef struct
327 {
328 ULONG AttributeType;
329 ULONG CollationRule;
330 ULONG SizeOfEntry;
331 UCHAR ClustersPerIndexRecord;
332 UCHAR Padding[3];
333 INDEX_HEADER_ATTRIBUTE Header;
334 } INDEX_ROOT_ATTRIBUTE, *PINDEX_ROOT_ATTRIBUTE;
335
336 typedef struct
337 {
338 ULONGLONG Unknown1;
339 UCHAR MajorVersion;
340 UCHAR MinorVersion;
341 USHORT Flags;
342 ULONG Unknown2;
343 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
344
345 typedef struct
346 {
347 NTFSIDENTIFIER Identifier;
348 ULONG Flags;
349 UCHAR MajorFunction;
350 UCHAR MinorFunction;
351 WORK_QUEUE_ITEM WorkQueueItem;
352 PIRP Irp;
353 BOOLEAN IsTopLevel;
354 PDEVICE_OBJECT DeviceObject;
355 NTSTATUS SavedExceptionCode;
356 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
357
358
359 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
360
361 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
362 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
363
364
365 /* attrib.c */
366
367 //VOID
368 //NtfsDumpAttribute(PATTRIBUTE Attribute);
369
370 //LONGLONG RunLCN(PUCHAR run);
371
372 //ULONG RunLength(PUCHAR run);
373
374 BOOLEAN
375 FindRun(PNONRESIDENT_ATTRIBUTE NresAttr,
376 ULONGLONG vcn,
377 PULONGLONG lcn,
378 PULONGLONG count);
379
380 VOID
381 NtfsDumpFileAttributes(PFILE_RECORD_HEADER FileRecord);
382
383
384 /* blockdev.c */
385
386 NTSTATUS
387 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
388 IN ULONG DiskSector,
389 IN ULONG SectorCount,
390 IN ULONG SectorSize,
391 IN OUT PUCHAR Buffer,
392 IN BOOLEAN Override);
393
394 NTSTATUS
395 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
396 IN ULONG ControlCode,
397 IN PVOID InputBuffer,
398 IN ULONG InputBufferSize,
399 IN OUT PVOID OutputBuffer,
400 IN OUT PULONG OutputBufferSize,
401 IN BOOLEAN Override);
402
403
404 /* close.c */
405
406 DRIVER_DISPATCH NtfsFsdClose;
407 NTSTATUS NTAPI
408 NtfsFsdClose(PDEVICE_OBJECT DeviceObject,
409 PIRP Irp);
410
411
412 /* create.c */
413
414 DRIVER_DISPATCH NtfsFsdCreate;
415 NTSTATUS NTAPI
416 NtfsFsdCreate(PDEVICE_OBJECT DeviceObject,
417 PIRP Irp);
418
419
420 /* dirctl.c */
421
422 DRIVER_DISPATCH NtfsFsdDirectoryControl;
423 NTSTATUS NTAPI
424 NtfsFsdDirectoryControl(PDEVICE_OBJECT DeviceObject,
425 PIRP Irp);
426
427
428 /* dispatch.c */
429
430 DRIVER_DISPATCH NtfsFsdDispatch;
431 NTSTATUS NTAPI
432 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
433 PIRP Irp);
434
435
436 /* fastio.c */
437
438 BOOLEAN NTAPI
439 NtfsAcqLazyWrite(PVOID Context,
440 BOOLEAN Wait);
441
442 VOID NTAPI
443 NtfsRelLazyWrite(PVOID Context);
444
445 BOOLEAN NTAPI
446 NtfsAcqReadAhead(PVOID Context,
447 BOOLEAN Wait);
448
449 VOID NTAPI
450 NtfsRelReadAhead(PVOID Context);
451
452
453 /* fcb.c */
454
455 PNTFS_FCB
456 NtfsCreateFCB(PCWSTR FileName,
457 PNTFS_VCB Vcb);
458
459 VOID
460 NtfsDestroyFCB(PNTFS_FCB Fcb);
461
462 BOOLEAN
463 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
464
465 BOOLEAN
466 NtfsFCBIsRoot(PNTFS_FCB Fcb);
467
468 VOID
469 NtfsGrabFCB(PNTFS_VCB Vcb,
470 PNTFS_FCB Fcb);
471
472 VOID
473 NtfsReleaseFCB(PNTFS_VCB Vcb,
474 PNTFS_FCB Fcb);
475
476 VOID
477 NtfsAddFCBToTable(PNTFS_VCB Vcb,
478 PNTFS_FCB Fcb);
479
480 PNTFS_FCB
481 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
482 PCWSTR FileName);
483
484 NTSTATUS
485 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
486 PNTFS_FCB Fcb);
487
488 PNTFS_FCB
489 NtfsMakeRootFCB(PNTFS_VCB Vcb);
490
491 PNTFS_FCB
492 NtfsOpenRootFCB(PNTFS_VCB Vcb);
493
494 NTSTATUS
495 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
496 PNTFS_FCB Fcb,
497 PFILE_OBJECT FileObject);
498
499 NTSTATUS
500 NtfsGetFCBForFile(PNTFS_VCB Vcb,
501 PNTFS_FCB *pParentFCB,
502 PNTFS_FCB *pFCB,
503 const PWSTR pFileName);
504
505
506 /* finfo.c */
507
508 DRIVER_DISPATCH NtfsFsdQueryInformation;
509 NTSTATUS NTAPI
510 NtfsFsdQueryInformation(PDEVICE_OBJECT DeviceObject,
511 PIRP Irp);
512
513
514 /* fsctl.c */
515
516 DRIVER_DISPATCH NtfsFsdFileSystemControl;
517 NTSTATUS NTAPI
518 NtfsFsdFileSystemControl(PDEVICE_OBJECT DeviceObject,
519 PIRP Irp);
520
521
522 /* mft.c */
523 NTSTATUS
524 NtfsOpenMft(PDEVICE_EXTENSION Vcb);
525
526
527 VOID
528 ReadAttribute(PATTRIBUTE attr,
529 PVOID buffer,
530 PDEVICE_EXTENSION Vcb,
531 PDEVICE_OBJECT DeviceObject);
532
533 ULONG
534 AttributeDataLength(PATTRIBUTE attr);
535
536 ULONG
537 AttributeAllocatedLength(PATTRIBUTE Attribute);
538
539 NTSTATUS
540 ReadFileRecord(PDEVICE_EXTENSION Vcb,
541 ULONG index,
542 PFILE_RECORD_HEADER file,
543 PFILE_RECORD_HEADER Mft);
544
545 PATTRIBUTE
546 FindAttribute(PFILE_RECORD_HEADER file,
547 ATTRIBUTE_TYPE type,
548 PWSTR name);
549
550 ULONG
551 AttributeLengthAllocated(PATTRIBUTE attr);
552
553 VOID
554 ReadVCN(PDEVICE_EXTENSION Vcb,
555 PFILE_RECORD_HEADER file,
556 ATTRIBUTE_TYPE type,
557 ULONGLONG vcn,
558 ULONG count,
559 PVOID buffer);
560
561 VOID
562 FixupUpdateSequenceArray(PFILE_RECORD_HEADER file);
563
564 VOID
565 ReadExternalAttribute(PDEVICE_EXTENSION Vcb,
566 PNONRESIDENT_ATTRIBUTE NresAttr,
567 ULONGLONG vcn,
568 ULONG count,
569 PVOID buffer);
570
571 NTSTATUS
572 ReadLCN(PDEVICE_EXTENSION Vcb,
573 ULONGLONG lcn,
574 ULONG count,
575 PVOID buffer);
576
577 VOID
578 EnumerAttribute(PFILE_RECORD_HEADER file,
579 PDEVICE_EXTENSION Vcb,
580 PDEVICE_OBJECT DeviceObject);
581
582
583 /* misc.c */
584
585 BOOLEAN
586 NtfsIsIrpTopLevel(PIRP Irp);
587
588 PNTFS_IRP_CONTEXT
589 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
590 PIRP Irp);
591
592 #if 0
593 BOOLEAN
594 wstrcmpjoki(PWSTR s1, PWSTR s2);
595
596 VOID
597 CdfsSwapString(PWCHAR Out,
598 PUCHAR In,
599 ULONG Count);
600
601 VOID
602 CdfsDateTimeToFileTime(PFCB Fcb,
603 TIME *FileTime);
604
605 VOID
606 CdfsFileFlagsToAttributes(PFCB Fcb,
607 PULONG FileAttributes);
608 #endif
609
610
611 /* rw.c */
612
613 DRIVER_DISPATCH NtfsFsdRead;
614 NTSTATUS NTAPI
615 NtfsFsdRead(PDEVICE_OBJECT DeviceObject,
616 PIRP Irp);
617
618 DRIVER_DISPATCH NtfsFsdWrite;
619 NTSTATUS NTAPI
620 NtfsFsdWrite(PDEVICE_OBJECT DeviceObject,
621 PIRP Irp);
622
623
624 /* volinfo.c */
625
626 NTSTATUS
627 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
628
629 NTSTATUS
630 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
631
632
633 /* ntfs.c */
634
635 DRIVER_INITIALIZE DriverEntry;
636
637 VOID
638 NTAPI
639 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
640
641 #endif /* NTFS_H */