f80bb973fe61b0ac275f6ad446aa25450a46924c
[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 #define NTFS_FILE_MFT 0
179 #define NTFS_FILE_MFTMIRR 1
180 #define NTFS_FILE_LOGFILE 2
181 #define NTFS_FILE_VOLUME 3
182 #define NTFS_FILE_ATTRDEF 4
183 #define NTFS_FILE_ROOT 5
184 #define NTFS_FILE_BITMAP 6
185 #define NTFS_FILE_BOOT 7
186 #define NTFS_FILE_BADCLUS 8
187 #define NTFS_FILE_QUOTA 9
188 #define NTFS_FILE_UPCASE 10
189 #define NTFS_FILE_EXTEND 11
190
191 #define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
192
193 #define COLLATION_BINARY 0x00
194 #define COLLATION_FILE_NAME 0x01
195 #define COLLATION_UNICODE_STRING 0x02
196 #define COLLATION_NTOFS_ULONG 0x10
197 #define COLLATION_NTOFS_SID 0x11
198 #define COLLATION_NTOFS_SECURITY_HASH 0x12
199 #define COLLATION_NTOFS_ULONGS 0x13
200
201 #define INDEX_ROOT_SMALL 0x0
202 #define INDEX_ROOT_LARGE 0x1
203
204 #define NTFS_INDEX_ENTRY_NODE 1
205 #define NTFS_INDEX_ENTRY_END 2
206
207 #define NTFS_FILE_NAME_POSIX 0
208 #define NTFS_FILE_NAME_WIN32 1
209 #define NTFS_FILE_NAME_DOS 2
210 #define NTFS_FILE_NAME_WIN32_AND_DOS 3
211
212 #define NTFS_FILE_TYPE_READ_ONLY 0x1
213 #define NTFS_FILE_TYPE_HIDDEN 0x2
214 #define NTFS_FILE_TYPE_SYSTEM 0x4
215 #define NTFS_FILE_TYPE_ARCHIVE 0x20
216 #define NTFS_FILE_TYPE_REPARSE 0x400
217 #define NTFS_FILE_TYPE_COMPRESSED 0x800
218 #define NTFS_FILE_TYPE_DIRECTORY 0x10000000
219
220 typedef struct
221 {
222 ULONG Type; /* Magic number 'FILE' */
223 USHORT UsaOffset; /* Offset to the update sequence */
224 USHORT UsaCount; /* Size in words of Update Sequence Number & Array (S) */
225 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
226 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
227
228 /* NTFS_RECORD_HEADER.Type */
229 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
230 #define NRH_INDX_TYPE 0x58444E49 /* 'INDX' */
231
232
233 typedef struct _FILE_RECORD_HEADER
234 {
235 NTFS_RECORD_HEADER Ntfs;
236 USHORT SequenceNumber; /* Sequence number */
237 USHORT LinkCount; /* Hard link count */
238 USHORT AttributeOffset; /* Offset to the first Attribute */
239 USHORT Flags; /* Flags */
240 ULONG BytesInUse; /* Real size of the FILE record */
241 ULONG BytesAllocated; /* Allocated size of the FILE record */
242 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
243 USHORT NextAttributeNumber; /* Next Attribute Id */
244 USHORT Padding; /* Align to 4 UCHAR boundary (XP) */
245 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
246 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
247
248 /* Flags in FILE_RECORD_HEADER */
249
250 #define FRH_IN_USE 0x0001 /* Record is in use */
251 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
252 #define FRH_UNKNOWN1 0x0004 /* Don't know */
253 #define FRH_UNKNOWN2 0x0008 /* Don't know */
254
255 typedef struct
256 {
257 ULONG Type;
258 ULONG Length;
259 UCHAR IsNonResident;
260 UCHAR NameLength;
261 USHORT NameOffset;
262 USHORT Flags;
263 USHORT Instance;
264 union
265 {
266 // Resident attributes
267 struct
268 {
269 ULONG ValueLength;
270 USHORT ValueOffset;
271 UCHAR Flags;
272 UCHAR Reserved;
273 } Resident;
274 // Non-resident attributes
275 struct
276 {
277 ULONGLONG LowestVCN;
278 ULONGLONG HighestVCN;
279 USHORT MappingPairsOffset;
280 USHORT CompressionUnit;
281 UCHAR Reserved[4];
282 LONGLONG AllocatedSize;
283 LONGLONG DataSize;
284 LONGLONG InitializedSize;
285 LONGLONG CompressedSize;
286 } NonResident;
287 };
288 } NTFS_ATTR_RECORD, *PNTFS_ATTR_RECORD;
289
290 typedef struct
291 {
292 ULONGLONG CreationTime;
293 ULONGLONG ChangeTime;
294 ULONGLONG LastWriteTime;
295 ULONGLONG LastAccessTime;
296 ULONG FileAttribute;
297 ULONG AlignmentOrReserved[3];
298 #if 0
299 ULONG QuotaId;
300 ULONG SecurityId;
301 ULONGLONG QuotaCharge;
302 USN Usn;
303 #endif
304 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
305
306
307 typedef struct
308 {
309 ATTRIBUTE_TYPE AttributeType;
310 USHORT Length;
311 UCHAR NameLength;
312 UCHAR NameOffset;
313 ULONGLONG StartVcn; // LowVcn
314 ULONGLONG FileReferenceNumber;
315 USHORT AttributeNumber;
316 USHORT AlignmentOrReserved[3];
317 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
318
319
320 typedef struct
321 {
322 ULONGLONG DirectoryFileReferenceNumber;
323 ULONGLONG CreationTime;
324 ULONGLONG ChangeTime;
325 ULONGLONG LastWriteTime;
326 ULONGLONG LastAccessTime;
327 ULONGLONG AllocatedSize;
328 ULONGLONG DataSize;
329 ULONG FileAttributes;
330 union
331 {
332 struct
333 {
334 USHORT PackedEaSize;
335 USHORT AlignmentOrReserved;
336 } EaInfo;
337 ULONG ReparseTag;
338 } Extended;
339 UCHAR NameLength;
340 UCHAR NameType;
341 WCHAR Name[1];
342 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
343
344 typedef struct
345 {
346 ULONG FirstEntryOffset;
347 ULONG TotalSizeOfEntries;
348 ULONG AllocatedSize;
349 UCHAR Flags;
350 UCHAR Padding[3];
351 } INDEX_HEADER_ATTRIBUTE, *PINDEX_HEADER_ATTRIBUTE;
352
353 typedef struct
354 {
355 ULONG AttributeType;
356 ULONG CollationRule;
357 ULONG SizeOfEntry;
358 UCHAR ClustersPerIndexRecord;
359 UCHAR Padding[3];
360 INDEX_HEADER_ATTRIBUTE Header;
361 } INDEX_ROOT_ATTRIBUTE, *PINDEX_ROOT_ATTRIBUTE;
362
363 typedef struct
364 {
365 NTFS_RECORD_HEADER Ntfs;
366 ULONGLONG VCN;
367 INDEX_HEADER_ATTRIBUTE Header;
368 } INDEX_BUFFER, *PINDEX_BUFFER;
369
370 typedef struct
371 {
372 union
373 {
374 struct
375 {
376 ULONGLONG IndexedFile;
377 } Directory;
378 struct
379 {
380 USHORT DataOffset;
381 USHORT DataLength;
382 ULONG Reserved;
383 } ViewIndex;
384 } Data;
385 USHORT Length;
386 USHORT KeyLength;
387 USHORT Flags;
388 USHORT Reserved;
389 FILENAME_ATTRIBUTE FileName;
390 } INDEX_ENTRY_ATTRIBUTE, *PINDEX_ENTRY_ATTRIBUTE;
391
392 typedef struct
393 {
394 ULONGLONG Unknown1;
395 UCHAR MajorVersion;
396 UCHAR MinorVersion;
397 USHORT Flags;
398 ULONG Unknown2;
399 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
400
401 typedef struct {
402 ULONG ReparseTag;
403 USHORT DataLength;
404 USHORT Reserved;
405 UCHAR Data[1];
406 } REPARSE_POINT_ATTRIBUTE, *PREPARSE_POINT_ATTRIBUTE;
407
408 #define IRPCONTEXT_CANWAIT 0x1
409 #define IRPCONTEXT_COMPLETE 0x2
410 #define IRPCONTEXT_QUEUE 0x4
411
412 typedef struct
413 {
414 NTFSIDENTIFIER Identifier;
415 ULONG Flags;
416 PIO_STACK_LOCATION Stack;
417 UCHAR MajorFunction;
418 UCHAR MinorFunction;
419 WORK_QUEUE_ITEM WorkQueueItem;
420 PIRP Irp;
421 BOOLEAN IsTopLevel;
422 PDEVICE_OBJECT DeviceObject;
423 PFILE_OBJECT FileObject;
424 NTSTATUS SavedExceptionCode;
425 CCHAR PriorityBoost;
426 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
427
428 typedef struct _NTFS_ATTR_CONTEXT
429 {
430 PUCHAR CacheRun;
431 ULONGLONG CacheRunOffset;
432 LONGLONG CacheRunStartLCN;
433 ULONGLONG CacheRunLength;
434 LONGLONG CacheRunLastLCN;
435 ULONGLONG CacheRunCurrentOffset;
436 NTFS_ATTR_RECORD Record;
437 } NTFS_ATTR_CONTEXT, *PNTFS_ATTR_CONTEXT;
438
439 #define FCB_CACHE_INITIALIZED 0x0001
440 #define FCB_IS_VOLUME_STREAM 0x0002
441 #define FCB_IS_VOLUME 0x0004
442 #define MAX_PATH 260
443
444 typedef struct _FCB
445 {
446 NTFSIDENTIFIER Identifier;
447
448 FSRTL_COMMON_FCB_HEADER RFCB;
449 SECTION_OBJECT_POINTERS SectionObjectPointers;
450
451 PFILE_OBJECT FileObject;
452 PNTFS_VCB Vcb;
453
454 WCHAR Stream[MAX_PATH];
455 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
456 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
457
458 ERESOURCE PagingIoResource;
459 ERESOURCE MainResource;
460
461 LIST_ENTRY FcbListEntry;
462 struct _FCB* ParentFcb;
463
464 ULONG DirIndex;
465
466 LONG RefCount;
467 ULONG Flags;
468 ULONG OpenHandleCount;
469
470 ULONGLONG MFTIndex;
471 USHORT LinkCount;
472
473 FILENAME_ATTRIBUTE Entry;
474
475 } NTFS_FCB, *PNTFS_FCB;
476
477 typedef struct _FIND_ATTR_CONTXT
478 {
479 PDEVICE_EXTENSION Vcb;
480 BOOLEAN OnlyResident;
481 PNTFS_ATTR_RECORD FirstAttr;
482 PNTFS_ATTR_RECORD CurrAttr;
483 PNTFS_ATTR_RECORD LastAttr;
484 PNTFS_ATTR_RECORD NonResidentStart;
485 PNTFS_ATTR_RECORD NonResidentEnd;
486 } FIND_ATTR_CONTXT, *PFIND_ATTR_CONTXT;
487
488 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
489
490 FORCEINLINE
491 NTSTATUS
492 NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext)
493 {
494 PULONG Flags = &IrpContext->Flags;
495
496 *Flags &= ~IRPCONTEXT_COMPLETE;
497 *Flags |= IRPCONTEXT_QUEUE;
498
499 return STATUS_PENDING;
500 }
501
502 /* attrib.c */
503
504 //VOID
505 //NtfsDumpAttribute(PATTRIBUTE Attribute);
506
507 PUCHAR
508 DecodeRun(PUCHAR DataRun,
509 LONGLONG *DataRunOffset,
510 ULONGLONG *DataRunLength);
511
512 VOID
513 NtfsDumpFileAttributes(PDEVICE_EXTENSION Vcb,
514 PFILE_RECORD_HEADER FileRecord);
515
516 PSTANDARD_INFORMATION
517 GetStandardInformationFromRecord(PDEVICE_EXTENSION Vcb,
518 PFILE_RECORD_HEADER FileRecord);
519
520 PFILENAME_ATTRIBUTE
521 GetFileNameFromRecord(PDEVICE_EXTENSION Vcb,
522 PFILE_RECORD_HEADER FileRecord,
523 UCHAR NameType);
524
525 PFILENAME_ATTRIBUTE
526 GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb,
527 PFILE_RECORD_HEADER FileRecord);
528
529 NTSTATUS
530 FindFirstAttribute(PFIND_ATTR_CONTXT Context,
531 PDEVICE_EXTENSION Vcb,
532 PFILE_RECORD_HEADER FileRecord,
533 BOOLEAN OnlyResident,
534 PNTFS_ATTR_RECORD * Attribute);
535
536 NTSTATUS
537 FindNextAttribute(PFIND_ATTR_CONTXT Context,
538 PNTFS_ATTR_RECORD * Attribute);
539
540 VOID
541 FindCloseAttribute(PFIND_ATTR_CONTXT Context);
542
543 /* blockdev.c */
544
545 NTSTATUS
546 NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
547 IN LONGLONG StartingOffset,
548 IN ULONG Length,
549 IN ULONG SectorSize,
550 IN OUT PUCHAR Buffer,
551 IN BOOLEAN Override);
552
553 NTSTATUS
554 NtfsWriteDisk(IN PDEVICE_OBJECT DeviceObject,
555 IN LONGLONG StartingOffset,
556 IN ULONG Length,
557 IN ULONG SectorSize,
558 IN PUCHAR Buffer);
559
560 NTSTATUS
561 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
562 IN ULONG DiskSector,
563 IN ULONG SectorCount,
564 IN ULONG SectorSize,
565 IN OUT PUCHAR Buffer,
566 IN BOOLEAN Override);
567
568 NTSTATUS
569 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
570 IN ULONG ControlCode,
571 IN PVOID InputBuffer,
572 IN ULONG InputBufferSize,
573 IN OUT PVOID OutputBuffer,
574 IN OUT PULONG OutputBufferSize,
575 IN BOOLEAN Override);
576
577
578 /* close.c */
579
580 NTSTATUS
581 NtfsCleanup(PNTFS_IRP_CONTEXT IrpContext);
582
583
584 /* close.c */
585
586 NTSTATUS
587 NtfsCloseFile(PDEVICE_EXTENSION DeviceExt,
588 PFILE_OBJECT FileObject);
589
590 NTSTATUS
591 NtfsClose(PNTFS_IRP_CONTEXT IrpContext);
592
593
594 /* create.c */
595
596 NTSTATUS
597 NtfsCreate(PNTFS_IRP_CONTEXT IrpContext);
598
599
600 /* devctl.c */
601
602 NTSTATUS
603 NtfsDeviceControl(PNTFS_IRP_CONTEXT IrpContext);
604
605
606 /* dirctl.c */
607
608 ULONGLONG
609 NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt,
610 PFILE_RECORD_HEADER FileRecord,
611 PCWSTR Stream,
612 ULONG StreamLength,
613 PULONGLONG AllocatedSize);
614
615 NTSTATUS
616 NtfsDirectoryControl(PNTFS_IRP_CONTEXT IrpContext);
617
618
619 /* dispatch.c */
620
621 DRIVER_DISPATCH NtfsFsdDispatch;
622 NTSTATUS NTAPI
623 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
624 PIRP Irp);
625
626
627 /* fastio.c */
628
629 BOOLEAN NTAPI
630 NtfsAcqLazyWrite(PVOID Context,
631 BOOLEAN Wait);
632
633 VOID NTAPI
634 NtfsRelLazyWrite(PVOID Context);
635
636 BOOLEAN NTAPI
637 NtfsAcqReadAhead(PVOID Context,
638 BOOLEAN Wait);
639
640 VOID NTAPI
641 NtfsRelReadAhead(PVOID Context);
642
643 FAST_IO_CHECK_IF_POSSIBLE NtfsFastIoCheckIfPossible;
644 FAST_IO_READ NtfsFastIoRead;
645 FAST_IO_WRITE NtfsFastIoWrite;
646
647
648 /* fcb.c */
649
650 PNTFS_FCB
651 NtfsCreateFCB(PCWSTR FileName,
652 PCWSTR Stream,
653 PNTFS_VCB Vcb);
654
655 VOID
656 NtfsDestroyFCB(PNTFS_FCB Fcb);
657
658 BOOLEAN
659 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
660
661 BOOLEAN
662 NtfsFCBIsReparsePoint(PNTFS_FCB Fcb);
663
664 BOOLEAN
665 NtfsFCBIsCompressed(PNTFS_FCB Fcb);
666
667 BOOLEAN
668 NtfsFCBIsRoot(PNTFS_FCB Fcb);
669
670 VOID
671 NtfsGrabFCB(PNTFS_VCB Vcb,
672 PNTFS_FCB Fcb);
673
674 VOID
675 NtfsReleaseFCB(PNTFS_VCB Vcb,
676 PNTFS_FCB Fcb);
677
678 VOID
679 NtfsAddFCBToTable(PNTFS_VCB Vcb,
680 PNTFS_FCB Fcb);
681
682 PNTFS_FCB
683 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
684 PCWSTR FileName);
685
686 NTSTATUS
687 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
688 PNTFS_FCB Fcb);
689
690 PNTFS_FCB
691 NtfsMakeRootFCB(PNTFS_VCB Vcb);
692
693 PNTFS_FCB
694 NtfsOpenRootFCB(PNTFS_VCB Vcb);
695
696 NTSTATUS
697 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
698 PNTFS_FCB Fcb,
699 PFILE_OBJECT FileObject);
700
701 NTSTATUS
702 NtfsGetFCBForFile(PNTFS_VCB Vcb,
703 PNTFS_FCB *pParentFCB,
704 PNTFS_FCB *pFCB,
705 const PWSTR pFileName);
706
707 NTSTATUS
708 NtfsReadFCBAttribute(PNTFS_VCB Vcb,
709 PNTFS_FCB pFCB,
710 ULONG Type,
711 PCWSTR Name,
712 ULONG NameLength,
713 PVOID * Data);
714
715 NTSTATUS
716 NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb,
717 PNTFS_FCB DirectoryFCB,
718 PUNICODE_STRING Name,
719 PCWSTR Stream,
720 PFILE_RECORD_HEADER Record,
721 ULONGLONG MFTIndex,
722 PNTFS_FCB * fileFCB);
723
724
725 /* finfo.c */
726
727 NTSTATUS
728 NtfsQueryInformation(PNTFS_IRP_CONTEXT IrpContext);
729
730
731 /* fsctl.c */
732
733 NTSTATUS
734 NtfsFileSystemControl(PNTFS_IRP_CONTEXT IrpContext);
735
736
737 /* mft.c */
738 PNTFS_ATTR_CONTEXT
739 PrepareAttributeContext(PNTFS_ATTR_RECORD AttrRecord);
740
741 VOID
742 ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context);
743
744 ULONG
745 ReadAttribute(PDEVICE_EXTENSION Vcb,
746 PNTFS_ATTR_CONTEXT Context,
747 ULONGLONG Offset,
748 PCHAR Buffer,
749 ULONG Length);
750
751 NTSTATUS
752 WriteAttribute(PDEVICE_EXTENSION Vcb,
753 PNTFS_ATTR_CONTEXT Context,
754 ULONGLONG Offset,
755 const PUCHAR Buffer,
756 ULONG Length,
757 PULONG LengthWritten);
758
759 ULONGLONG
760 AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord);
761
762 ULONG
763 AttributeAllocatedLength(PNTFS_ATTR_RECORD AttrRecord);
764
765 NTSTATUS
766 ReadFileRecord(PDEVICE_EXTENSION Vcb,
767 ULONGLONG index,
768 PFILE_RECORD_HEADER file);
769
770 NTSTATUS
771 FindAttribute(PDEVICE_EXTENSION Vcb,
772 PFILE_RECORD_HEADER MftRecord,
773 ULONG Type,
774 PCWSTR Name,
775 ULONG NameLength,
776 PNTFS_ATTR_CONTEXT * AttrCtx);
777
778 VOID
779 ReadVCN(PDEVICE_EXTENSION Vcb,
780 PFILE_RECORD_HEADER file,
781 ATTRIBUTE_TYPE type,
782 ULONGLONG vcn,
783 ULONG count,
784 PVOID buffer);
785
786 NTSTATUS
787 FixupUpdateSequenceArray(PDEVICE_EXTENSION Vcb,
788 PNTFS_RECORD_HEADER Record);
789
790 NTSTATUS
791 ReadLCN(PDEVICE_EXTENSION Vcb,
792 ULONGLONG lcn,
793 ULONG count,
794 PVOID buffer);
795
796 VOID
797 EnumerAttribute(PFILE_RECORD_HEADER file,
798 PDEVICE_EXTENSION Vcb,
799 PDEVICE_OBJECT DeviceObject);
800
801 NTSTATUS
802 NtfsLookupFile(PDEVICE_EXTENSION Vcb,
803 PUNICODE_STRING PathName,
804 PFILE_RECORD_HEADER *FileRecord,
805 PULONGLONG MFTIndex);
806
807 NTSTATUS
808 NtfsLookupFileAt(PDEVICE_EXTENSION Vcb,
809 PUNICODE_STRING PathName,
810 PFILE_RECORD_HEADER *FileRecord,
811 PULONGLONG MFTIndex,
812 ULONGLONG CurrentMFTIndex);
813
814 NTSTATUS
815 NtfsFindFileAt(PDEVICE_EXTENSION Vcb,
816 PUNICODE_STRING SearchPattern,
817 PULONG FirstEntry,
818 PFILE_RECORD_HEADER *FileRecord,
819 PULONGLONG MFTIndex,
820 ULONGLONG CurrentMFTIndex);
821
822 /* misc.c */
823
824 BOOLEAN
825 NtfsIsIrpTopLevel(PIRP Irp);
826
827 PNTFS_IRP_CONTEXT
828 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
829 PIRP Irp);
830
831 PVOID
832 NtfsGetUserBuffer(PIRP Irp,
833 BOOLEAN Paging);
834
835 NTSTATUS
836 NtfsLockUserBuffer(IN PIRP Irp,
837 IN ULONG Length,
838 IN LOCK_OPERATION Operation);
839
840 #if 0
841 BOOLEAN
842 wstrcmpjoki(PWSTR s1, PWSTR s2);
843
844 VOID
845 CdfsSwapString(PWCHAR Out,
846 PUCHAR In,
847 ULONG Count);
848 #endif
849
850 VOID
851 NtfsFileFlagsToAttributes(ULONG NtfsAttributes,
852 PULONG FileAttributes);
853
854
855 /* rw.c */
856
857 NTSTATUS
858 NtfsRead(PNTFS_IRP_CONTEXT IrpContext);
859
860 NTSTATUS
861 NtfsWrite(PNTFS_IRP_CONTEXT IrpContext);
862
863
864 /* volinfo.c */
865
866 ULONGLONG
867 NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt);
868
869 NTSTATUS
870 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
871
872 NTSTATUS
873 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
874
875
876 /* ntfs.c */
877
878 DRIVER_INITIALIZE DriverEntry;
879
880 VOID
881 NTAPI
882 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
883
884 #endif /* NTFS_H */