44b8874706e9ffd89e038bd6842dd0e77e182fc7
[reactos.git] / reactos / 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 #define CACHEPAGESIZE(pDeviceExt) \
8 ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
9 (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
10
11 #define TAG_NTFS 'SFTN'
12
13 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
14 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
15
16 #define DEVICE_NAME L"\\Ntfs"
17
18 #include <pshpack1.h>
19 typedef struct _BIOS_PARAMETERS_BLOCK
20 {
21 USHORT BytesPerSector; // 0x0B
22 UCHAR SectorsPerCluster; // 0x0D
23 UCHAR Unused0[7]; // 0x0E, checked when volume is mounted
24 UCHAR MediaId; // 0x15
25 UCHAR Unused1[2]; // 0x16
26 USHORT SectorsPerTrack; // 0x18
27 USHORT Heads; // 0x1A
28 UCHAR Unused2[4]; // 0x1C
29 UCHAR Unused3[4]; // 0x20, checked when volume is mounted
30 } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK;
31
32 typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
33 {
34 USHORT Unknown[2]; // 0x24, always 80 00 80 00
35 ULONGLONG SectorCount; // 0x28
36 ULONGLONG MftLocation; // 0x30
37 ULONGLONG MftMirrLocation; // 0x38
38 CHAR ClustersPerMftRecord; // 0x40
39 UCHAR Unused4[3]; // 0x41
40 CHAR ClustersPerIndexRecord; // 0x44
41 UCHAR Unused5[3]; // 0x45
42 ULONGLONG SerialNumber; // 0x48
43 UCHAR Checksum[4]; // 0x50
44 } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK;
45
46 typedef struct _BOOT_SECTOR
47 {
48 UCHAR Jump[3]; // 0x00
49 UCHAR OEMID[8]; // 0x03
50 BIOS_PARAMETERS_BLOCK BPB;
51 EXTENDED_BIOS_PARAMETERS_BLOCK EBPB;
52 UCHAR BootStrap[426]; // 0x54
53 USHORT EndSector; // 0x1FE
54 } BOOT_SECTOR, *PBOOT_SECTOR;
55 #include <poppack.h>
56
57 //typedef struct _BootSector BootSector;
58
59 typedef struct _NTFS_INFO
60 {
61 ULONG BytesPerSector;
62 ULONG SectorsPerCluster;
63 ULONG BytesPerCluster;
64 ULONGLONG SectorCount;
65 ULONGLONG ClusterCount;
66 ULARGE_INTEGER MftStart;
67 ULARGE_INTEGER MftMirrStart;
68 ULONG BytesPerFileRecord;
69 ULONG BytesPerIndexRecord;
70
71 ULONGLONG SerialNumber;
72 USHORT VolumeLabelLength;
73 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
74 UCHAR MajorVersion;
75 UCHAR MinorVersion;
76 USHORT Flags;
77
78 ULONG MftZoneReservation;
79 } NTFS_INFO, *PNTFS_INFO;
80
81 #define NTFS_TYPE_CCB '20SF'
82 #define NTFS_TYPE_FCB '30SF'
83 #define NTFS_TYPE_VCB '50SF'
84 #define NTFS_TYPE_IRP_CONTEST '60SF'
85 #define NTFS_TYPE_GLOBAL_DATA '70SF'
86
87 typedef struct
88 {
89 ULONG Type;
90 ULONG Size;
91 } NTFSIDENTIFIER, *PNTFSIDENTIFIER;
92
93 typedef struct
94 {
95 NTFSIDENTIFIER Identifier;
96
97 ERESOURCE DirResource;
98 // ERESOURCE FatResource;
99
100 KSPIN_LOCK FcbListLock;
101 LIST_ENTRY FcbListHead;
102
103 PVPB Vpb;
104 PDEVICE_OBJECT StorageDevice;
105 PFILE_OBJECT StreamFileObject;
106
107 struct _NTFS_ATTR_CONTEXT* MFTContext;
108 struct _FILE_RECORD_HEADER* MasterFileTable;
109 struct _FCB *VolumeFcb;
110
111 NTFS_INFO NtfsInfo;
112
113 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, NTFS_VCB, *PNTFS_VCB;
114
115 typedef struct
116 {
117 NTFSIDENTIFIER Identifier;
118 LIST_ENTRY NextCCB;
119 PFILE_OBJECT PtrFileObject;
120 LARGE_INTEGER CurrentByteOffset;
121 /* for DirectoryControl */
122 ULONG Entry;
123 /* for DirectoryControl */
124 PWCHAR DirectorySearchPattern;
125 ULONG LastCluster;
126 ULONG LastOffset;
127 } NTFS_CCB, *PNTFS_CCB;
128
129 #define TAG_CCB 'BCCI'
130
131 typedef struct
132 {
133 NTFSIDENTIFIER Identifier;
134 ERESOURCE Resource;
135 PDRIVER_OBJECT DriverObject;
136 PDEVICE_OBJECT DeviceObject;
137 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
138 ULONG Flags;
139 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
140
141
142 typedef enum
143 {
144 AttributeStandardInformation = 0x10,
145 AttributeAttributeList = 0x20,
146 AttributeFileName = 0x30,
147 AttributeObjectId = 0x40,
148 AttributeSecurityDescriptor = 0x50,
149 AttributeVolumeName = 0x60,
150 AttributeVolumeInformation = 0x70,
151 AttributeData = 0x80,
152 AttributeIndexRoot = 0x90,
153 AttributeIndexAllocation = 0xA0,
154 AttributeBitmap = 0xB0,
155 AttributeReparsePoint = 0xC0,
156 AttributeEAInformation = 0xD0,
157 AttributeEA = 0xE0,
158 AttributePropertySet = 0xF0,
159 AttributeLoggedUtilityStream = 0x100,
160 AttributeEnd = 0xFFFFFFFF
161 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
162
163 #define NTFS_FILE_MFT 0
164 #define NTFS_FILE_MFTMIRR 1
165 #define NTFS_FILE_LOGFILE 2
166 #define NTFS_FILE_VOLUME 3
167 #define NTFS_FILE_ATTRDEF 4
168 #define NTFS_FILE_ROOT 5
169 #define NTFS_FILE_BITMAP 6
170 #define NTFS_FILE_BOOT 7
171 #define NTFS_FILE_BADCLUS 8
172 #define NTFS_FILE_QUOTA 9
173 #define NTFS_FILE_UPCASE 10
174 #define NTFS_FILE_EXTEND 11
175
176 #define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
177
178 #define COLLATION_BINARY 0x00
179 #define COLLATION_FILE_NAME 0x01
180 #define COLLATION_UNICODE_STRING 0x02
181 #define COLLATION_NTOFS_ULONG 0x10
182 #define COLLATION_NTOFS_SID 0x11
183 #define COLLATION_NTOFS_SECURITY_HASH 0x12
184 #define COLLATION_NTOFS_ULONGS 0x13
185
186 #define INDEX_ROOT_SMALL 0x0
187 #define INDEX_ROOT_LARGE 0x1
188
189 #define NTFS_INDEX_ENTRY_NODE 1
190 #define NTFS_INDEX_ENTRY_END 2
191
192 #define NTFS_FILE_NAME_POSIX 0
193 #define NTFS_FILE_NAME_WIN32 1
194 #define NTFS_FILE_NAME_DOS 2
195 #define NTFS_FILE_NAME_WIN32_AND_DOS 3
196
197 #define NTFS_FILE_TYPE_READ_ONLY 0x1
198 #define NTFS_FILE_TYPE_HIDDEN 0x2
199 #define NTFS_FILE_TYPE_SYSTEM 0x4
200 #define NTFS_FILE_TYPE_ARCHIVE 0x20
201 #define NTFS_FILE_TYPE_REPARSE 0x400
202 #define NTFS_FILE_TYPE_COMPRESSED 0x800
203 #define NTFS_FILE_TYPE_DIRECTORY 0x10000000
204
205 typedef struct
206 {
207 ULONG Type; /* Magic number 'FILE' */
208 USHORT UsaOffset; /* Offset to the update sequence */
209 USHORT UsaCount; /* Size in words of Update Sequence Number & Array (S) */
210 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
211 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
212
213 /* NTFS_RECORD_HEADER.Type */
214 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
215 #define NRH_INDX_TYPE 0x58444E49 /* 'INDX' */
216
217
218 typedef struct _FILE_RECORD_HEADER
219 {
220 NTFS_RECORD_HEADER Ntfs;
221 USHORT SequenceNumber; /* Sequence number */
222 USHORT LinkCount; /* Hard link count */
223 USHORT AttributeOffset; /* Offset to the first Attribute */
224 USHORT Flags; /* Flags */
225 ULONG BytesInUse; /* Real size of the FILE record */
226 ULONG BytesAllocated; /* Allocated size of the FILE record */
227 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
228 USHORT NextAttributeNumber; /* Next Attribute Id */
229 USHORT Pading; /* Align to 4 UCHAR boundary (XP) */
230 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
231 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
232
233 /* Flags in FILE_RECORD_HEADER */
234
235 #define FRH_IN_USE 0x0001 /* Record is in use */
236 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
237 #define FRH_UNKNOWN1 0x0004 /* Don't know */
238 #define FRH_UNKNOWN2 0x0008 /* Don't know */
239
240 typedef struct
241 {
242 ULONG Type;
243 ULONG Length;
244 UCHAR IsNonResident;
245 UCHAR NameLength;
246 USHORT NameOffset;
247 USHORT Flags;
248 USHORT Instance;
249 union
250 {
251 // Resident attributes
252 struct
253 {
254 ULONG ValueLength;
255 USHORT ValueOffset;
256 UCHAR Flags;
257 UCHAR Reserved;
258 } Resident;
259 // Non-resident attributes
260 struct
261 {
262 ULONGLONG LowestVCN;
263 ULONGLONG HighestVCN;
264 USHORT MappingPairsOffset;
265 USHORT CompressionUnit;
266 UCHAR Reserved[4];
267 LONGLONG AllocatedSize;
268 LONGLONG DataSize;
269 LONGLONG InitializedSize;
270 LONGLONG CompressedSize;
271 } NonResident;
272 };
273 } NTFS_ATTR_RECORD, *PNTFS_ATTR_RECORD;
274
275 typedef struct
276 {
277 ULONGLONG CreationTime;
278 ULONGLONG ChangeTime;
279 ULONGLONG LastWriteTime;
280 ULONGLONG LastAccessTime;
281 ULONG FileAttribute;
282 ULONG AlignmentOrReserved[3];
283 #if 0
284 ULONG QuotaId;
285 ULONG SecurityId;
286 ULONGLONG QuotaCharge;
287 USN Usn;
288 #endif
289 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
290
291
292 typedef struct
293 {
294 ATTRIBUTE_TYPE AttributeType;
295 USHORT Length;
296 UCHAR NameLength;
297 UCHAR NameOffset;
298 ULONGLONG StartVcn; // LowVcn
299 ULONGLONG FileReferenceNumber;
300 USHORT AttributeNumber;
301 USHORT AlignmentOrReserved[3];
302 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
303
304
305 typedef struct
306 {
307 ULONGLONG DirectoryFileReferenceNumber;
308 ULONGLONG CreationTime;
309 ULONGLONG ChangeTime;
310 ULONGLONG LastWriteTime;
311 ULONGLONG LastAccessTime;
312 ULONGLONG AllocatedSize;
313 ULONGLONG DataSize;
314 ULONG FileAttributes;
315 union
316 {
317 struct
318 {
319 USHORT PackedEaSize;
320 USHORT AlignmentOrReserved;
321 } EaInfo;
322 ULONG ReparseTag;
323 } Extended;
324 UCHAR NameLength;
325 UCHAR NameType;
326 WCHAR Name[1];
327 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
328
329 typedef struct
330 {
331 ULONG FirstEntryOffset;
332 ULONG TotalSizeOfEntries;
333 ULONG AllocatedSize;
334 UCHAR Flags;
335 UCHAR Padding[3];
336 } INDEX_HEADER_ATTRIBUTE, *PINDEX_HEADER_ATTRIBUTE;
337
338 typedef struct
339 {
340 ULONG AttributeType;
341 ULONG CollationRule;
342 ULONG SizeOfEntry;
343 UCHAR ClustersPerIndexRecord;
344 UCHAR Padding[3];
345 INDEX_HEADER_ATTRIBUTE Header;
346 } INDEX_ROOT_ATTRIBUTE, *PINDEX_ROOT_ATTRIBUTE;
347
348 typedef struct
349 {
350 NTFS_RECORD_HEADER Ntfs;
351 ULONGLONG VCN;
352 INDEX_HEADER_ATTRIBUTE Header;
353 } INDEX_BUFFER, *PINDEX_BUFFER;
354
355 typedef struct
356 {
357 union
358 {
359 struct
360 {
361 ULONGLONG IndexedFile;
362 } Directory;
363 struct
364 {
365 USHORT DataOffset;
366 USHORT DataLength;
367 ULONG Reserved;
368 } ViewIndex;
369 } Data;
370 USHORT Length;
371 USHORT KeyLength;
372 USHORT Flags;
373 USHORT Reserved;
374 FILENAME_ATTRIBUTE FileName;
375 } INDEX_ENTRY_ATTRIBUTE, *PINDEX_ENTRY_ATTRIBUTE;
376
377 typedef struct
378 {
379 ULONGLONG Unknown1;
380 UCHAR MajorVersion;
381 UCHAR MinorVersion;
382 USHORT Flags;
383 ULONG Unknown2;
384 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
385
386 typedef struct {
387 ULONG ReparseTag;
388 USHORT DataLength;
389 USHORT Reserved;
390 UCHAR Data[1];
391 } REPARSE_POINT_ATTRIBUTE, *PREPARSE_POINT_ATTRIBUTE;
392
393 typedef struct
394 {
395 NTFSIDENTIFIER Identifier;
396 ULONG Flags;
397 UCHAR MajorFunction;
398 UCHAR MinorFunction;
399 WORK_QUEUE_ITEM WorkQueueItem;
400 PIRP Irp;
401 BOOLEAN IsTopLevel;
402 PDEVICE_OBJECT DeviceObject;
403 NTSTATUS SavedExceptionCode;
404 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
405
406 typedef struct _NTFS_ATTR_CONTEXT
407 {
408 PUCHAR CacheRun;
409 ULONGLONG CacheRunOffset;
410 LONGLONG CacheRunStartLCN;
411 ULONGLONG CacheRunLength;
412 LONGLONG CacheRunLastLCN;
413 ULONGLONG CacheRunCurrentOffset;
414 NTFS_ATTR_RECORD Record;
415 } NTFS_ATTR_CONTEXT, *PNTFS_ATTR_CONTEXT;
416
417 #define FCB_CACHE_INITIALIZED 0x0001
418 #define FCB_IS_VOLUME_STREAM 0x0002
419 #define FCB_IS_VOLUME 0x0004
420 #define MAX_PATH 260
421
422 typedef struct _FCB
423 {
424 NTFSIDENTIFIER Identifier;
425
426 FSRTL_COMMON_FCB_HEADER RFCB;
427 SECTION_OBJECT_POINTERS SectionObjectPointers;
428
429 PFILE_OBJECT FileObject;
430 PNTFS_VCB Vcb;
431
432 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
433 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
434
435 ERESOURCE PagingIoResource;
436 ERESOURCE MainResource;
437
438 LIST_ENTRY FcbListEntry;
439 struct _FCB* ParentFcb;
440
441 ULONG DirIndex;
442
443 LONG RefCount;
444 ULONG Flags;
445
446 ULONGLONG MFTIndex;
447 USHORT LinkCount;
448
449 FILENAME_ATTRIBUTE Entry;
450
451 } NTFS_FCB, *PNTFS_FCB;
452
453 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
454
455 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
456 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
457
458
459 /* attrib.c */
460
461 //VOID
462 //NtfsDumpAttribute(PATTRIBUTE Attribute);
463
464 PUCHAR
465 DecodeRun(PUCHAR DataRun,
466 LONGLONG *DataRunOffset,
467 ULONGLONG *DataRunLength);
468
469 VOID
470 NtfsDumpFileAttributes(PFILE_RECORD_HEADER FileRecord);
471
472 PSTANDARD_INFORMATION
473 GetStandardInformationFromRecord(PFILE_RECORD_HEADER FileRecord);
474
475 PFILENAME_ATTRIBUTE
476 GetFileNameFromRecord(PFILE_RECORD_HEADER FileRecord, UCHAR NameType);
477
478 PFILENAME_ATTRIBUTE
479 GetBestFileNameFromRecord(PFILE_RECORD_HEADER FileRecord);
480
481 /* blockdev.c */
482
483 NTSTATUS
484 NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
485 IN LONGLONG StartingOffset,
486 IN ULONG Length,
487 IN ULONG SectorSize,
488 IN OUT PUCHAR Buffer,
489 IN BOOLEAN Override);
490
491 NTSTATUS
492 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
493 IN ULONG DiskSector,
494 IN ULONG SectorCount,
495 IN ULONG SectorSize,
496 IN OUT PUCHAR Buffer,
497 IN BOOLEAN Override);
498
499 NTSTATUS
500 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
501 IN ULONG ControlCode,
502 IN PVOID InputBuffer,
503 IN ULONG InputBufferSize,
504 IN OUT PVOID OutputBuffer,
505 IN OUT PULONG OutputBufferSize,
506 IN BOOLEAN Override);
507
508
509 /* close.c */
510
511 NTSTATUS
512 NtfsCloseFile(PDEVICE_EXTENSION DeviceExt,
513 PFILE_OBJECT FileObject);
514
515 DRIVER_DISPATCH NtfsFsdClose;
516 NTSTATUS NTAPI
517 NtfsFsdClose(PDEVICE_OBJECT DeviceObject,
518 PIRP Irp);
519
520
521 /* create.c */
522
523 DRIVER_DISPATCH NtfsFsdCreate;
524 NTSTATUS NTAPI
525 NtfsFsdCreate(PDEVICE_OBJECT DeviceObject,
526 PIRP Irp);
527
528
529 /* devctl.c */
530
531 DRIVER_DISPATCH NtfsFsdDeviceControl;
532 NTSTATUS NTAPI
533 NtfsFsdDeviceControl(PDEVICE_OBJECT DeviceObject,
534 PIRP Irp);
535
536
537 /* dirctl.c */
538
539 DRIVER_DISPATCH NtfsFsdDirectoryControl;
540 NTSTATUS NTAPI
541 NtfsFsdDirectoryControl(PDEVICE_OBJECT DeviceObject,
542 PIRP Irp);
543
544
545 /* dispatch.c */
546
547 DRIVER_DISPATCH NtfsFsdDispatch;
548 NTSTATUS NTAPI
549 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
550 PIRP Irp);
551
552
553 /* fastio.c */
554
555 BOOLEAN NTAPI
556 NtfsAcqLazyWrite(PVOID Context,
557 BOOLEAN Wait);
558
559 VOID NTAPI
560 NtfsRelLazyWrite(PVOID Context);
561
562 BOOLEAN NTAPI
563 NtfsAcqReadAhead(PVOID Context,
564 BOOLEAN Wait);
565
566 VOID NTAPI
567 NtfsRelReadAhead(PVOID Context);
568
569
570 /* fcb.c */
571
572 PNTFS_FCB
573 NtfsCreateFCB(PCWSTR FileName,
574 PNTFS_VCB Vcb);
575
576 VOID
577 NtfsDestroyFCB(PNTFS_FCB Fcb);
578
579 BOOLEAN
580 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
581
582 BOOLEAN
583 NtfsFCBIsReparsePoint(PNTFS_FCB Fcb);
584
585 BOOLEAN
586 NtfsFCBIsRoot(PNTFS_FCB Fcb);
587
588 VOID
589 NtfsGrabFCB(PNTFS_VCB Vcb,
590 PNTFS_FCB Fcb);
591
592 VOID
593 NtfsReleaseFCB(PNTFS_VCB Vcb,
594 PNTFS_FCB Fcb);
595
596 VOID
597 NtfsAddFCBToTable(PNTFS_VCB Vcb,
598 PNTFS_FCB Fcb);
599
600 PNTFS_FCB
601 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
602 PCWSTR FileName);
603
604 NTSTATUS
605 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
606 PNTFS_FCB Fcb);
607
608 PNTFS_FCB
609 NtfsMakeRootFCB(PNTFS_VCB Vcb);
610
611 PNTFS_FCB
612 NtfsOpenRootFCB(PNTFS_VCB Vcb);
613
614 NTSTATUS
615 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
616 PNTFS_FCB Fcb,
617 PFILE_OBJECT FileObject);
618
619 NTSTATUS
620 NtfsGetFCBForFile(PNTFS_VCB Vcb,
621 PNTFS_FCB *pParentFCB,
622 PNTFS_FCB *pFCB,
623 const PWSTR pFileName);
624
625 NTSTATUS
626 NtfsReadFCBAttribute(PNTFS_VCB Vcb,
627 PNTFS_FCB pFCB,
628 ULONG Type,
629 PCWSTR Name,
630 ULONG NameLength,
631 PVOID * Data);
632
633
634 /* finfo.c */
635
636 DRIVER_DISPATCH NtfsFsdQueryInformation;
637 NTSTATUS NTAPI
638 NtfsFsdQueryInformation(PDEVICE_OBJECT DeviceObject,
639 PIRP Irp);
640
641
642 /* fsctl.c */
643
644 DRIVER_DISPATCH NtfsFsdFileSystemControl;
645 NTSTATUS NTAPI
646 NtfsFsdFileSystemControl(PDEVICE_OBJECT DeviceObject,
647 PIRP Irp);
648
649
650 /* mft.c */
651 VOID
652 ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context);
653
654 ULONG
655 ReadAttribute(PDEVICE_EXTENSION Vcb,
656 PNTFS_ATTR_CONTEXT Context,
657 ULONGLONG Offset,
658 PCHAR Buffer,
659 ULONG Length);
660
661 ULONGLONG
662 AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord);
663
664 ULONG
665 AttributeAllocatedLength(PNTFS_ATTR_RECORD AttrRecord);
666
667 NTSTATUS
668 ReadFileRecord(PDEVICE_EXTENSION Vcb,
669 ULONGLONG index,
670 PFILE_RECORD_HEADER file);
671
672 NTSTATUS
673 FindAttribute(PDEVICE_EXTENSION Vcb,
674 PFILE_RECORD_HEADER MftRecord,
675 ULONG Type,
676 PCWSTR Name,
677 ULONG NameLength,
678 PNTFS_ATTR_CONTEXT * AttrCtx);
679
680 VOID
681 ReadVCN(PDEVICE_EXTENSION Vcb,
682 PFILE_RECORD_HEADER file,
683 ATTRIBUTE_TYPE type,
684 ULONGLONG vcn,
685 ULONG count,
686 PVOID buffer);
687
688 NTSTATUS
689 FixupUpdateSequenceArray(PDEVICE_EXTENSION Vcb,
690 PNTFS_RECORD_HEADER Record);
691
692 NTSTATUS
693 ReadLCN(PDEVICE_EXTENSION Vcb,
694 ULONGLONG lcn,
695 ULONG count,
696 PVOID buffer);
697
698 VOID
699 EnumerAttribute(PFILE_RECORD_HEADER file,
700 PDEVICE_EXTENSION Vcb,
701 PDEVICE_OBJECT DeviceObject);
702
703 NTSTATUS
704 NtfsLookupFile(PDEVICE_EXTENSION Vcb,
705 PUNICODE_STRING PathName,
706 PFILE_RECORD_HEADER *FileRecord,
707 PNTFS_ATTR_CONTEXT *DataContext,
708 PULONGLONG MFTIndex);
709
710 NTSTATUS
711 NtfsLookupFileAt(PDEVICE_EXTENSION Vcb,
712 PUNICODE_STRING PathName,
713 PFILE_RECORD_HEADER *FileRecord,
714 PNTFS_ATTR_CONTEXT *DataContext,
715 PULONGLONG MFTIndex,
716 ULONGLONG CurrentMFTIndex);
717
718 NTSTATUS
719 NtfsFindFileAt(PDEVICE_EXTENSION Vcb,
720 PUNICODE_STRING SearchPattern,
721 PULONG FirstEntry,
722 PFILE_RECORD_HEADER *FileRecord,
723 PNTFS_ATTR_CONTEXT *DataContext,
724 PULONGLONG MFTIndex,
725 ULONGLONG CurrentMFTIndex);
726
727 /* misc.c */
728
729 BOOLEAN
730 NtfsIsIrpTopLevel(PIRP Irp);
731
732 PNTFS_IRP_CONTEXT
733 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
734 PIRP Irp);
735
736 PVOID
737 NtfsGetUserBuffer(PIRP Irp);
738
739 #if 0
740 BOOLEAN
741 wstrcmpjoki(PWSTR s1, PWSTR s2);
742
743 VOID
744 CdfsSwapString(PWCHAR Out,
745 PUCHAR In,
746 ULONG Count);
747 #endif
748
749 VOID
750 NtfsFileFlagsToAttributes(ULONG NtfsAttributes,
751 PULONG FileAttributes);
752
753
754 /* rw.c */
755
756 DRIVER_DISPATCH NtfsFsdRead;
757 NTSTATUS NTAPI
758 NtfsFsdRead(PDEVICE_OBJECT DeviceObject,
759 PIRP Irp);
760
761 DRIVER_DISPATCH NtfsFsdWrite;
762 NTSTATUS NTAPI
763 NtfsFsdWrite(PDEVICE_OBJECT DeviceObject,
764 PIRP Irp);
765
766
767 /* volinfo.c */
768
769 ULONGLONG
770 NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt);
771
772 NTSTATUS
773 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
774
775 NTSTATUS
776 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
777
778
779 /* ntfs.c */
780
781 DRIVER_INITIALIZE DriverEntry;
782
783 VOID
784 NTAPI
785 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
786
787 #endif /* NTFS_H */