5a36bcc9fe9a6f29c16a58113745c1c67b4d8f8d
[reactos.git] / drivers / filesystems / ntfs / ntfs.h
1 #ifndef NTFS_H
2 #define NTFS_H
3
4 #include <ntifs.h>
5 #include <pseh/pseh2.h>
6
7 #ifdef __GNUC__
8 #define INIT_SECTION __attribute__((section ("INIT")))
9 #else
10 #define INIT_SECTION /* Done via alloc_text for MSC */
11 #endif
12
13 #define CACHEPAGESIZE(pDeviceExt) \
14 ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
15 (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
16
17 #define TAG_NTFS 'SFTN'
18
19 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
20 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
21
22 #define DEVICE_NAME L"\\Ntfs"
23
24 #include <pshpack1.h>
25 typedef struct _BIOS_PARAMETERS_BLOCK
26 {
27 USHORT BytesPerSector; // 0x0B
28 UCHAR SectorsPerCluster; // 0x0D
29 UCHAR Unused0[7]; // 0x0E, checked when volume is mounted
30 UCHAR MediaId; // 0x15
31 UCHAR Unused1[2]; // 0x16
32 USHORT SectorsPerTrack; // 0x18
33 USHORT Heads; // 0x1A
34 UCHAR Unused2[4]; // 0x1C
35 UCHAR Unused3[4]; // 0x20, checked when volume is mounted
36 } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK;
37
38 typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
39 {
40 USHORT Unknown[2]; // 0x24, always 80 00 80 00
41 ULONGLONG SectorCount; // 0x28
42 ULONGLONG MftLocation; // 0x30
43 ULONGLONG MftMirrLocation; // 0x38
44 CHAR ClustersPerMftRecord; // 0x40
45 UCHAR Unused4[3]; // 0x41
46 CHAR ClustersPerIndexRecord; // 0x44
47 UCHAR Unused5[3]; // 0x45
48 ULONGLONG SerialNumber; // 0x48
49 UCHAR Checksum[4]; // 0x50
50 } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK;
51
52 typedef struct _BOOT_SECTOR
53 {
54 UCHAR Jump[3]; // 0x00
55 UCHAR OEMID[8]; // 0x03
56 BIOS_PARAMETERS_BLOCK BPB;
57 EXTENDED_BIOS_PARAMETERS_BLOCK EBPB;
58 UCHAR BootStrap[426]; // 0x54
59 USHORT EndSector; // 0x1FE
60 } BOOT_SECTOR, *PBOOT_SECTOR;
61 #include <poppack.h>
62
63 //typedef struct _BootSector BootSector;
64
65 typedef struct _NTFS_INFO
66 {
67 ULONG BytesPerSector;
68 ULONG SectorsPerCluster;
69 ULONG BytesPerCluster;
70 ULONGLONG SectorCount;
71 ULONGLONG ClusterCount;
72 ULARGE_INTEGER MftStart;
73 ULARGE_INTEGER MftMirrStart;
74 ULONG BytesPerFileRecord;
75 ULONG BytesPerIndexRecord;
76
77 ULONGLONG SerialNumber;
78 USHORT VolumeLabelLength;
79 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
80 UCHAR MajorVersion;
81 UCHAR MinorVersion;
82 USHORT Flags;
83
84 ULONG MftZoneReservation;
85 } NTFS_INFO, *PNTFS_INFO;
86
87 #define NTFS_TYPE_CCB '20SF'
88 #define NTFS_TYPE_FCB '30SF'
89 #define NTFS_TYPE_VCB '50SF'
90 #define NTFS_TYPE_IRP_CONTEXT '60SF'
91 #define NTFS_TYPE_GLOBAL_DATA '70SF'
92
93 typedef struct
94 {
95 ULONG Type;
96 ULONG Size;
97 } NTFSIDENTIFIER, *PNTFSIDENTIFIER;
98
99 typedef struct
100 {
101 NTFSIDENTIFIER Identifier;
102
103 ERESOURCE DirResource;
104 // ERESOURCE FatResource;
105
106 KSPIN_LOCK FcbListLock;
107 LIST_ENTRY FcbListHead;
108
109 PVPB Vpb;
110 PDEVICE_OBJECT StorageDevice;
111 PFILE_OBJECT StreamFileObject;
112
113 struct _NTFS_ATTR_CONTEXT* MFTContext;
114 struct _FILE_RECORD_HEADER* MasterFileTable;
115 struct _FCB *VolumeFcb;
116
117 NTFS_INFO NtfsInfo;
118
119 ULONG Flags;
120 ULONG OpenHandleCount;
121
122 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, NTFS_VCB, *PNTFS_VCB;
123
124 #define VCB_VOLUME_LOCKED 0x0001
125
126 typedef struct
127 {
128 NTFSIDENTIFIER Identifier;
129 LIST_ENTRY NextCCB;
130 PFILE_OBJECT PtrFileObject;
131 LARGE_INTEGER CurrentByteOffset;
132 /* for DirectoryControl */
133 ULONG Entry;
134 /* for DirectoryControl */
135 PWCHAR DirectorySearchPattern;
136 ULONG LastCluster;
137 ULONG LastOffset;
138 } NTFS_CCB, *PNTFS_CCB;
139
140 #define TAG_CCB 'BCCI'
141 #define TAG_FCB 'BCFI'
142
143 typedef struct
144 {
145 NTFSIDENTIFIER Identifier;
146 ERESOURCE Resource;
147 PDRIVER_OBJECT DriverObject;
148 PDEVICE_OBJECT DeviceObject;
149 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
150 ULONG Flags;
151 FAST_IO_DISPATCH FastIoDispatch;
152 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
153 NPAGED_LOOKASIDE_LIST FcbLookasideList;
154 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
155
156
157 typedef enum
158 {
159 AttributeStandardInformation = 0x10,
160 AttributeAttributeList = 0x20,
161 AttributeFileName = 0x30,
162 AttributeObjectId = 0x40,
163 AttributeSecurityDescriptor = 0x50,
164 AttributeVolumeName = 0x60,
165 AttributeVolumeInformation = 0x70,
166 AttributeData = 0x80,
167 AttributeIndexRoot = 0x90,
168 AttributeIndexAllocation = 0xA0,
169 AttributeBitmap = 0xB0,
170 AttributeReparsePoint = 0xC0,
171 AttributeEAInformation = 0xD0,
172 AttributeEA = 0xE0,
173 AttributePropertySet = 0xF0,
174 AttributeLoggedUtilityStream = 0x100,
175 AttributeEnd = 0xFFFFFFFF
176 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
177
178 // FILE_RECORD_END seems to follow AttributeEnd in every file record starting with $Quota.
179 // No clue what data is being represented here.
180 #define FILE_RECORD_END 0x11477982
181
182 #define NTFS_FILE_MFT 0
183 #define NTFS_FILE_MFTMIRR 1
184 #define NTFS_FILE_LOGFILE 2
185 #define NTFS_FILE_VOLUME 3
186 #define NTFS_FILE_ATTRDEF 4
187 #define NTFS_FILE_ROOT 5
188 #define NTFS_FILE_BITMAP 6
189 #define NTFS_FILE_BOOT 7
190 #define NTFS_FILE_BADCLUS 8
191 #define NTFS_FILE_QUOTA 9
192 #define NTFS_FILE_UPCASE 10
193 #define NTFS_FILE_EXTEND 11
194
195 #define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
196
197 #define COLLATION_BINARY 0x00
198 #define COLLATION_FILE_NAME 0x01
199 #define COLLATION_UNICODE_STRING 0x02
200 #define COLLATION_NTOFS_ULONG 0x10
201 #define COLLATION_NTOFS_SID 0x11
202 #define COLLATION_NTOFS_SECURITY_HASH 0x12
203 #define COLLATION_NTOFS_ULONGS 0x13
204
205 #define INDEX_ROOT_SMALL 0x0
206 #define INDEX_ROOT_LARGE 0x1
207
208 #define NTFS_INDEX_ENTRY_NODE 1
209 #define NTFS_INDEX_ENTRY_END 2
210
211 #define NTFS_FILE_NAME_POSIX 0
212 #define NTFS_FILE_NAME_WIN32 1
213 #define NTFS_FILE_NAME_DOS 2
214 #define NTFS_FILE_NAME_WIN32_AND_DOS 3
215
216 #define NTFS_FILE_TYPE_READ_ONLY 0x1
217 #define NTFS_FILE_TYPE_HIDDEN 0x2
218 #define NTFS_FILE_TYPE_SYSTEM 0x4
219 #define NTFS_FILE_TYPE_ARCHIVE 0x20
220 #define NTFS_FILE_TYPE_REPARSE 0x400
221 #define NTFS_FILE_TYPE_COMPRESSED 0x800
222 #define NTFS_FILE_TYPE_DIRECTORY 0x10000000
223
224 typedef struct
225 {
226 ULONG Type; /* Magic number 'FILE' */
227 USHORT UsaOffset; /* Offset to the update sequence */
228 USHORT UsaCount; /* Size in words of Update Sequence Number & Array (S) */
229 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
230 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
231
232 /* NTFS_RECORD_HEADER.Type */
233 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
234 #define NRH_INDX_TYPE 0x58444E49 /* 'INDX' */
235
236
237 typedef struct _FILE_RECORD_HEADER
238 {
239 NTFS_RECORD_HEADER Ntfs;
240 USHORT SequenceNumber; /* Sequence number */
241 USHORT LinkCount; /* Hard link count */
242 USHORT AttributeOffset; /* Offset to the first Attribute */
243 USHORT Flags; /* Flags */
244 ULONG BytesInUse; /* Real size of the FILE record */
245 ULONG BytesAllocated; /* Allocated size of the FILE record */
246 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
247 USHORT NextAttributeNumber; /* Next Attribute Id */
248 USHORT Padding; /* Align to 4 UCHAR boundary (XP) */
249 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
250 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
251
252 /* Flags in FILE_RECORD_HEADER */
253
254 #define FRH_IN_USE 0x0001 /* Record is in use */
255 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
256 #define FRH_UNKNOWN1 0x0004 /* Don't know */
257 #define FRH_UNKNOWN2 0x0008 /* Don't know */
258
259 typedef struct
260 {
261 ULONG Type;
262 ULONG Length;
263 UCHAR IsNonResident;
264 UCHAR NameLength;
265 USHORT NameOffset;
266 USHORT Flags;
267 USHORT Instance;
268 union
269 {
270 // Resident attributes
271 struct
272 {
273 ULONG ValueLength;
274 USHORT ValueOffset;
275 UCHAR Flags;
276 UCHAR Reserved;
277 } Resident;
278 // Non-resident attributes
279 struct
280 {
281 ULONGLONG LowestVCN;
282 ULONGLONG HighestVCN;
283 USHORT MappingPairsOffset;
284 USHORT CompressionUnit;
285 UCHAR Reserved[4];
286 LONGLONG AllocatedSize;
287 LONGLONG DataSize;
288 LONGLONG InitializedSize;
289 LONGLONG CompressedSize;
290 } NonResident;
291 };
292 } NTFS_ATTR_RECORD, *PNTFS_ATTR_RECORD;
293
294 typedef struct
295 {
296 ULONGLONG CreationTime;
297 ULONGLONG ChangeTime;
298 ULONGLONG LastWriteTime;
299 ULONGLONG LastAccessTime;
300 ULONG FileAttribute;
301 ULONG AlignmentOrReserved[3];
302 #if 0
303 ULONG QuotaId;
304 ULONG SecurityId;
305 ULONGLONG QuotaCharge;
306 USN Usn;
307 #endif
308 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
309
310
311 typedef struct
312 {
313 ATTRIBUTE_TYPE AttributeType;
314 USHORT Length;
315 UCHAR NameLength;
316 UCHAR NameOffset;
317 ULONGLONG StartVcn; // LowVcn
318 ULONGLONG FileReferenceNumber;
319 USHORT AttributeNumber;
320 USHORT AlignmentOrReserved[3];
321 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
322
323
324 typedef struct
325 {
326 ULONGLONG DirectoryFileReferenceNumber;
327 ULONGLONG CreationTime;
328 ULONGLONG ChangeTime;
329 ULONGLONG LastWriteTime;
330 ULONGLONG LastAccessTime;
331 ULONGLONG AllocatedSize;
332 ULONGLONG DataSize;
333 ULONG FileAttributes;
334 union
335 {
336 struct
337 {
338 USHORT PackedEaSize;
339 USHORT AlignmentOrReserved;
340 } EaInfo;
341 ULONG ReparseTag;
342 } Extended;
343 UCHAR NameLength;
344 UCHAR NameType;
345 WCHAR Name[1];
346 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
347
348 typedef struct
349 {
350 ULONG FirstEntryOffset;
351 ULONG TotalSizeOfEntries;
352 ULONG AllocatedSize;
353 UCHAR Flags;
354 UCHAR Padding[3];
355 } INDEX_HEADER_ATTRIBUTE, *PINDEX_HEADER_ATTRIBUTE;
356
357 typedef struct
358 {
359 ULONG AttributeType;
360 ULONG CollationRule;
361 ULONG SizeOfEntry;
362 UCHAR ClustersPerIndexRecord;
363 UCHAR Padding[3];
364 INDEX_HEADER_ATTRIBUTE Header;
365 } INDEX_ROOT_ATTRIBUTE, *PINDEX_ROOT_ATTRIBUTE;
366
367 typedef struct
368 {
369 NTFS_RECORD_HEADER Ntfs;
370 ULONGLONG VCN;
371 INDEX_HEADER_ATTRIBUTE Header;
372 } INDEX_BUFFER, *PINDEX_BUFFER;
373
374 typedef struct
375 {
376 union
377 {
378 struct
379 {
380 ULONGLONG IndexedFile;
381 } Directory;
382 struct
383 {
384 USHORT DataOffset;
385 USHORT DataLength;
386 ULONG Reserved;
387 } ViewIndex;
388 } Data;
389 USHORT Length;
390 USHORT KeyLength;
391 USHORT Flags;
392 USHORT Reserved;
393 FILENAME_ATTRIBUTE FileName;
394 } INDEX_ENTRY_ATTRIBUTE, *PINDEX_ENTRY_ATTRIBUTE;
395
396 typedef struct
397 {
398 ULONGLONG Unknown1;
399 UCHAR MajorVersion;
400 UCHAR MinorVersion;
401 USHORT Flags;
402 ULONG Unknown2;
403 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
404
405 typedef struct {
406 ULONG ReparseTag;
407 USHORT DataLength;
408 USHORT Reserved;
409 UCHAR Data[1];
410 } REPARSE_POINT_ATTRIBUTE, *PREPARSE_POINT_ATTRIBUTE;
411
412 #define IRPCONTEXT_CANWAIT 0x1
413 #define IRPCONTEXT_COMPLETE 0x2
414 #define IRPCONTEXT_QUEUE 0x4
415
416 typedef struct
417 {
418 NTFSIDENTIFIER Identifier;
419 ULONG Flags;
420 PIO_STACK_LOCATION Stack;
421 UCHAR MajorFunction;
422 UCHAR MinorFunction;
423 WORK_QUEUE_ITEM WorkQueueItem;
424 PIRP Irp;
425 BOOLEAN IsTopLevel;
426 PDEVICE_OBJECT DeviceObject;
427 PFILE_OBJECT FileObject;
428 NTSTATUS SavedExceptionCode;
429 CCHAR PriorityBoost;
430 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
431
432 typedef struct _NTFS_ATTR_CONTEXT
433 {
434 PUCHAR CacheRun;
435 ULONGLONG CacheRunOffset;
436 LONGLONG CacheRunStartLCN;
437 ULONGLONG CacheRunLength;
438 LONGLONG CacheRunLastLCN;
439 ULONGLONG CacheRunCurrentOffset;
440 ULONGLONG FileMFTIndex;
441 NTFS_ATTR_RECORD Record;
442 } NTFS_ATTR_CONTEXT, *PNTFS_ATTR_CONTEXT;
443
444 #define FCB_CACHE_INITIALIZED 0x0001
445 #define FCB_IS_VOLUME_STREAM 0x0002
446 #define FCB_IS_VOLUME 0x0004
447 #define MAX_PATH 260
448
449 typedef struct _FCB
450 {
451 NTFSIDENTIFIER Identifier;
452
453 FSRTL_COMMON_FCB_HEADER RFCB;
454 SECTION_OBJECT_POINTERS SectionObjectPointers;
455
456 PFILE_OBJECT FileObject;
457 PNTFS_VCB Vcb;
458
459 WCHAR Stream[MAX_PATH];
460 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
461 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
462
463 ERESOURCE PagingIoResource;
464 ERESOURCE MainResource;
465
466 LIST_ENTRY FcbListEntry;
467 struct _FCB* ParentFcb;
468
469 ULONG DirIndex;
470
471 LONG RefCount;
472 ULONG Flags;
473 ULONG OpenHandleCount;
474
475 ULONGLONG MFTIndex;
476 USHORT LinkCount;
477
478 FILENAME_ATTRIBUTE Entry;
479
480 } NTFS_FCB, *PNTFS_FCB;
481
482 typedef struct _FIND_ATTR_CONTXT
483 {
484 PDEVICE_EXTENSION Vcb;
485 BOOLEAN OnlyResident;
486 PNTFS_ATTR_RECORD FirstAttr;
487 PNTFS_ATTR_RECORD CurrAttr;
488 PNTFS_ATTR_RECORD LastAttr;
489 PNTFS_ATTR_RECORD NonResidentStart;
490 PNTFS_ATTR_RECORD NonResidentEnd;
491 ULONG Offset;
492 } FIND_ATTR_CONTXT, *PFIND_ATTR_CONTXT;
493
494 typedef struct
495 {
496 USHORT USN;
497 USHORT Array[];
498 } FIXUP_ARRAY, *PFIXUP_ARRAY;
499
500 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
501
502 FORCEINLINE
503 NTSTATUS
504 NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext)
505 {
506 PULONG Flags = &IrpContext->Flags;
507
508 *Flags &= ~IRPCONTEXT_COMPLETE;
509 *Flags |= IRPCONTEXT_QUEUE;
510
511 return STATUS_PENDING;
512 }
513
514 /* attrib.c */
515
516 //VOID
517 //NtfsDumpAttribute(PATTRIBUTE Attribute);
518
519 NTSTATUS
520 AddData(PFILE_RECORD_HEADER FileRecord,
521 PNTFS_ATTR_RECORD AttributeAddress);
522
523 NTSTATUS
524 AddRun(PNTFS_VCB Vcb,
525 PNTFS_ATTR_CONTEXT AttrContext,
526 ULONG AttrOffset,
527 PFILE_RECORD_HEADER FileRecord,
528 ULONGLONG NextAssignedCluster,
529 ULONG RunLength);
530
531 NTSTATUS
532 AddFileName(PFILE_RECORD_HEADER FileRecord,
533 PNTFS_ATTR_RECORD AttributeAddress,
534 PDEVICE_EXTENSION DeviceExt,
535 PFILE_OBJECT FileObject);
536
537 NTSTATUS
538 AddStandardInformation(PFILE_RECORD_HEADER FileRecord,
539 PNTFS_ATTR_RECORD AttributeAddress);
540
541 NTSTATUS
542 ConvertDataRunsToLargeMCB(PUCHAR DataRun,
543 PLARGE_MCB DataRunsMCB,
544 PULONGLONG pNextVBN);
545
546 NTSTATUS
547 ConvertLargeMCBToDataRuns(PLARGE_MCB DataRunsMCB,
548 PUCHAR RunBuffer,
549 ULONG MaxBufferSize,
550 PULONG UsedBufferSize);
551
552 PUCHAR
553 DecodeRun(PUCHAR DataRun,
554 LONGLONG *DataRunOffset,
555 ULONGLONG *DataRunLength);
556
557 VOID
558 NtfsDumpDataRuns(PVOID StartOfRun,
559 ULONGLONG CurrentLCN);
560
561 VOID
562 NtfsDumpFileAttributes(PDEVICE_EXTENSION Vcb,
563 PFILE_RECORD_HEADER FileRecord);
564
565 PSTANDARD_INFORMATION
566 GetStandardInformationFromRecord(PDEVICE_EXTENSION Vcb,
567 PFILE_RECORD_HEADER FileRecord);
568
569 PFILENAME_ATTRIBUTE
570 GetFileNameFromRecord(PDEVICE_EXTENSION Vcb,
571 PFILE_RECORD_HEADER FileRecord,
572 UCHAR NameType);
573
574 UCHAR
575 GetPackedByteCount(LONGLONG NumberToPack,
576 BOOLEAN IsSigned);
577
578 NTSTATUS
579 GetLastClusterInDataRun(PDEVICE_EXTENSION Vcb,
580 PNTFS_ATTR_RECORD Attribute,
581 PULONGLONG LastCluster);
582
583 PFILENAME_ATTRIBUTE
584 GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb,
585 PFILE_RECORD_HEADER FileRecord);
586
587 NTSTATUS
588 FindFirstAttribute(PFIND_ATTR_CONTXT Context,
589 PDEVICE_EXTENSION Vcb,
590 PFILE_RECORD_HEADER FileRecord,
591 BOOLEAN OnlyResident,
592 PNTFS_ATTR_RECORD * Attribute);
593
594 NTSTATUS
595 FindNextAttribute(PFIND_ATTR_CONTXT Context,
596 PNTFS_ATTR_RECORD * Attribute);
597
598 VOID
599 FindCloseAttribute(PFIND_ATTR_CONTXT Context);
600
601 NTSTATUS
602 FreeClusters(PNTFS_VCB Vcb,
603 PNTFS_ATTR_CONTEXT AttrContext,
604 ULONG AttrOffset,
605 PFILE_RECORD_HEADER FileRecord,
606 ULONG ClustersToFree);
607
608 /* blockdev.c */
609
610 NTSTATUS
611 NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
612 IN LONGLONG StartingOffset,
613 IN ULONG Length,
614 IN ULONG SectorSize,
615 IN OUT PUCHAR Buffer,
616 IN BOOLEAN Override);
617
618 NTSTATUS
619 NtfsWriteDisk(IN PDEVICE_OBJECT DeviceObject,
620 IN LONGLONG StartingOffset,
621 IN ULONG Length,
622 IN ULONG SectorSize,
623 IN const PUCHAR Buffer);
624
625 NTSTATUS
626 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
627 IN ULONG DiskSector,
628 IN ULONG SectorCount,
629 IN ULONG SectorSize,
630 IN OUT PUCHAR Buffer,
631 IN BOOLEAN Override);
632
633 NTSTATUS
634 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
635 IN ULONG ControlCode,
636 IN PVOID InputBuffer,
637 IN ULONG InputBufferSize,
638 IN OUT PVOID OutputBuffer,
639 IN OUT PULONG OutputBufferSize,
640 IN BOOLEAN Override);
641
642
643 /* close.c */
644
645 NTSTATUS
646 NtfsCleanup(PNTFS_IRP_CONTEXT IrpContext);
647
648
649 /* close.c */
650
651 NTSTATUS
652 NtfsCloseFile(PDEVICE_EXTENSION DeviceExt,
653 PFILE_OBJECT FileObject);
654
655 NTSTATUS
656 NtfsClose(PNTFS_IRP_CONTEXT IrpContext);
657
658
659 /* create.c */
660
661 NTSTATUS
662 NtfsCreate(PNTFS_IRP_CONTEXT IrpContext);
663
664 NTSTATUS
665 NtfsCreateFileRecord(PDEVICE_EXTENSION DeviceExt,
666 PFILE_OBJECT FileObject);
667
668 /* devctl.c */
669
670 NTSTATUS
671 NtfsDeviceControl(PNTFS_IRP_CONTEXT IrpContext);
672
673
674 /* dirctl.c */
675
676 ULONGLONG
677 NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt,
678 PFILE_RECORD_HEADER FileRecord,
679 PCWSTR Stream,
680 ULONG StreamLength,
681 PULONGLONG AllocatedSize);
682
683 NTSTATUS
684 NtfsDirectoryControl(PNTFS_IRP_CONTEXT IrpContext);
685
686
687 /* dispatch.c */
688
689 DRIVER_DISPATCH NtfsFsdDispatch;
690 NTSTATUS NTAPI
691 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
692 PIRP Irp);
693
694
695 /* fastio.c */
696
697 BOOLEAN NTAPI
698 NtfsAcqLazyWrite(PVOID Context,
699 BOOLEAN Wait);
700
701 VOID NTAPI
702 NtfsRelLazyWrite(PVOID Context);
703
704 BOOLEAN NTAPI
705 NtfsAcqReadAhead(PVOID Context,
706 BOOLEAN Wait);
707
708 VOID NTAPI
709 NtfsRelReadAhead(PVOID Context);
710
711 FAST_IO_CHECK_IF_POSSIBLE NtfsFastIoCheckIfPossible;
712 FAST_IO_READ NtfsFastIoRead;
713 FAST_IO_WRITE NtfsFastIoWrite;
714
715
716 /* fcb.c */
717
718 PNTFS_FCB
719 NtfsCreateFCB(PCWSTR FileName,
720 PCWSTR Stream,
721 PNTFS_VCB Vcb);
722
723 VOID
724 NtfsDestroyFCB(PNTFS_FCB Fcb);
725
726 BOOLEAN
727 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
728
729 BOOLEAN
730 NtfsFCBIsReparsePoint(PNTFS_FCB Fcb);
731
732 BOOLEAN
733 NtfsFCBIsCompressed(PNTFS_FCB Fcb);
734
735 BOOLEAN
736 NtfsFCBIsRoot(PNTFS_FCB Fcb);
737
738 VOID
739 NtfsGrabFCB(PNTFS_VCB Vcb,
740 PNTFS_FCB Fcb);
741
742 VOID
743 NtfsReleaseFCB(PNTFS_VCB Vcb,
744 PNTFS_FCB Fcb);
745
746 VOID
747 NtfsAddFCBToTable(PNTFS_VCB Vcb,
748 PNTFS_FCB Fcb);
749
750 PNTFS_FCB
751 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
752 PCWSTR FileName);
753
754 NTSTATUS
755 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
756 PNTFS_FCB Fcb);
757
758 PNTFS_FCB
759 NtfsMakeRootFCB(PNTFS_VCB Vcb);
760
761 PNTFS_FCB
762 NtfsOpenRootFCB(PNTFS_VCB Vcb);
763
764 NTSTATUS
765 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
766 PNTFS_FCB Fcb,
767 PFILE_OBJECT FileObject);
768
769 NTSTATUS
770 NtfsGetFCBForFile(PNTFS_VCB Vcb,
771 PNTFS_FCB *pParentFCB,
772 PNTFS_FCB *pFCB,
773 const PWSTR pFileName);
774
775 NTSTATUS
776 NtfsReadFCBAttribute(PNTFS_VCB Vcb,
777 PNTFS_FCB pFCB,
778 ULONG Type,
779 PCWSTR Name,
780 ULONG NameLength,
781 PVOID * Data);
782
783 NTSTATUS
784 NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb,
785 PNTFS_FCB DirectoryFCB,
786 PUNICODE_STRING Name,
787 PCWSTR Stream,
788 PFILE_RECORD_HEADER Record,
789 ULONGLONG MFTIndex,
790 PNTFS_FCB * fileFCB);
791
792
793 /* finfo.c */
794
795 NTSTATUS
796 NtfsQueryInformation(PNTFS_IRP_CONTEXT IrpContext);
797
798
799 /* fsctl.c */
800
801 NTSTATUS
802 NtfsFileSystemControl(PNTFS_IRP_CONTEXT IrpContext);
803
804
805 /* mft.c */
806 NTSTATUS
807 AddNewMftEntry(PFILE_RECORD_HEADER FileRecord,
808 PDEVICE_EXTENSION DeviceExt);
809
810 PNTFS_ATTR_CONTEXT
811 PrepareAttributeContext(PNTFS_ATTR_RECORD AttrRecord);
812
813 VOID
814 ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context);
815
816 ULONG
817 ReadAttribute(PDEVICE_EXTENSION Vcb,
818 PNTFS_ATTR_CONTEXT Context,
819 ULONGLONG Offset,
820 PCHAR Buffer,
821 ULONG Length);
822
823 NTSTATUS
824 WriteAttribute(PDEVICE_EXTENSION Vcb,
825 PNTFS_ATTR_CONTEXT Context,
826 ULONGLONG Offset,
827 const PUCHAR Buffer,
828 ULONG Length,
829 PULONG LengthWritten);
830
831 ULONGLONG
832 AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord);
833
834 NTSTATUS
835 SetAttributeDataLength(PFILE_OBJECT FileObject,
836 PNTFS_FCB Fcb,
837 PNTFS_ATTR_CONTEXT AttrContext,
838 ULONG AttrOffset,
839 PFILE_RECORD_HEADER FileRecord,
840 PLARGE_INTEGER DataSize);
841
842 VOID
843 SetFileRecordEnd(PFILE_RECORD_HEADER FileRecord,
844 PNTFS_ATTR_RECORD AttrEnd,
845 ULONG EndMarker);
846
847 ULONGLONG
848 AttributeAllocatedLength(PNTFS_ATTR_RECORD AttrRecord);
849
850 BOOLEAN
851 CompareFileName(PUNICODE_STRING FileName,
852 PINDEX_ENTRY_ATTRIBUTE IndexEntry,
853 BOOLEAN DirSearch);
854
855 NTSTATUS
856 ReadFileRecord(PDEVICE_EXTENSION Vcb,
857 ULONGLONG index,
858 PFILE_RECORD_HEADER file);
859
860 NTSTATUS
861 UpdateIndexEntryFileNameSize(PDEVICE_EXTENSION Vcb,
862 PFILE_RECORD_HEADER MftRecord,
863 PCHAR IndexRecord,
864 ULONG IndexBlockSize,
865 PINDEX_ENTRY_ATTRIBUTE FirstEntry,
866 PINDEX_ENTRY_ATTRIBUTE LastEntry,
867 PUNICODE_STRING FileName,
868 PULONG StartEntry,
869 PULONG CurrentEntry,
870 BOOLEAN DirSearch,
871 ULONGLONG NewDataSize,
872 ULONGLONG NewAllocatedSize);
873
874 NTSTATUS
875 UpdateFileNameRecord(PDEVICE_EXTENSION Vcb,
876 ULONGLONG ParentMFTIndex,
877 PUNICODE_STRING FileName,
878 BOOLEAN DirSearch,
879 ULONGLONG NewDataSize,
880 ULONGLONG NewAllocationSize);
881
882 NTSTATUS
883 UpdateFileRecord(PDEVICE_EXTENSION Vcb,
884 ULONGLONG MftIndex,
885 PFILE_RECORD_HEADER FileRecord);
886
887 NTSTATUS
888 FindAttribute(PDEVICE_EXTENSION Vcb,
889 PFILE_RECORD_HEADER MftRecord,
890 ULONG Type,
891 PCWSTR Name,
892 ULONG NameLength,
893 PNTFS_ATTR_CONTEXT * AttrCtx,
894 PULONG Offset);
895
896 VOID
897 ReadVCN(PDEVICE_EXTENSION Vcb,
898 PFILE_RECORD_HEADER file,
899 ATTRIBUTE_TYPE type,
900 ULONGLONG vcn,
901 ULONG count,
902 PVOID buffer);
903
904 NTSTATUS
905 FixupUpdateSequenceArray(PDEVICE_EXTENSION Vcb,
906 PNTFS_RECORD_HEADER Record);
907
908 NTSTATUS
909 AddFixupArray(PDEVICE_EXTENSION Vcb,
910 PNTFS_RECORD_HEADER Record);
911
912 NTSTATUS
913 ReadLCN(PDEVICE_EXTENSION Vcb,
914 ULONGLONG lcn,
915 ULONG count,
916 PVOID buffer);
917
918 VOID
919 EnumerAttribute(PFILE_RECORD_HEADER file,
920 PDEVICE_EXTENSION Vcb,
921 PDEVICE_OBJECT DeviceObject);
922
923 NTSTATUS
924 NtfsLookupFile(PDEVICE_EXTENSION Vcb,
925 PUNICODE_STRING PathName,
926 PFILE_RECORD_HEADER *FileRecord,
927 PULONGLONG MFTIndex);
928
929 NTSTATUS
930 NtfsLookupFileAt(PDEVICE_EXTENSION Vcb,
931 PUNICODE_STRING PathName,
932 PFILE_RECORD_HEADER *FileRecord,
933 PULONGLONG MFTIndex,
934 ULONGLONG CurrentMFTIndex);
935
936 VOID
937 NtfsDumpFileRecord(PDEVICE_EXTENSION Vcb,
938 PFILE_RECORD_HEADER FileRecord);
939
940 NTSTATUS
941 NtfsFindFileAt(PDEVICE_EXTENSION Vcb,
942 PUNICODE_STRING SearchPattern,
943 PULONG FirstEntry,
944 PFILE_RECORD_HEADER *FileRecord,
945 PULONGLONG MFTIndex,
946 ULONGLONG CurrentMFTIndex);
947
948 NTSTATUS
949 NtfsFindMftRecord(PDEVICE_EXTENSION Vcb,
950 ULONGLONG MFTIndex,
951 PUNICODE_STRING FileName,
952 PULONG FirstEntry,
953 BOOLEAN DirSearch,
954 ULONGLONG *OutMFTIndex);
955
956 /* misc.c */
957
958 BOOLEAN
959 NtfsIsIrpTopLevel(PIRP Irp);
960
961 PNTFS_IRP_CONTEXT
962 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
963 PIRP Irp);
964
965 PVOID
966 NtfsGetUserBuffer(PIRP Irp,
967 BOOLEAN Paging);
968
969 NTSTATUS
970 NtfsLockUserBuffer(IN PIRP Irp,
971 IN ULONG Length,
972 IN LOCK_OPERATION Operation);
973
974 #if 0
975 BOOLEAN
976 wstrcmpjoki(PWSTR s1, PWSTR s2);
977
978 VOID
979 CdfsSwapString(PWCHAR Out,
980 PUCHAR In,
981 ULONG Count);
982 #endif
983
984 VOID
985 NtfsFileFlagsToAttributes(ULONG NtfsAttributes,
986 PULONG FileAttributes);
987
988
989 /* rw.c */
990
991 NTSTATUS
992 NtfsRead(PNTFS_IRP_CONTEXT IrpContext);
993
994 NTSTATUS
995 NtfsWrite(PNTFS_IRP_CONTEXT IrpContext);
996
997
998 /* volinfo.c */
999
1000 NTSTATUS
1001 NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
1002 ULONG FirstDesiredCluster,
1003 ULONG DesiredClusters,
1004 PULONG FirstAssignedCluster,
1005 PULONG AssignedClusters);
1006
1007 ULONGLONG
1008 NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt);
1009
1010 NTSTATUS
1011 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
1012
1013 NTSTATUS
1014 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
1015
1016
1017 /* ntfs.c */
1018
1019 DRIVER_INITIALIZE DriverEntry;
1020
1021 VOID
1022 NTAPI
1023 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
1024
1025 #endif /* NTFS_H */