5 #include <pseh/pseh2.h>
8 #define INIT_SECTION __attribute__((section ("INIT")))
10 #define INIT_SECTION /* Done via alloc_text for MSC */
13 #define CACHEPAGESIZE(pDeviceExt) \
14 ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
15 (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
17 #define TAG_NTFS 'SFTN'
19 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
20 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
22 #define DEVICE_NAME L"\\Ntfs"
25 typedef struct _BIOS_PARAMETERS_BLOCK
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
34 UCHAR Unused2
[4]; // 0x1C
35 UCHAR Unused3
[4]; // 0x20, checked when volume is mounted
36 } BIOS_PARAMETERS_BLOCK
, *PBIOS_PARAMETERS_BLOCK
;
38 typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
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
;
52 typedef struct _BOOT_SECTOR
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
;
63 //typedef struct _BootSector BootSector;
65 typedef struct _NTFS_INFO
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
;
77 ULONGLONG SerialNumber
;
78 USHORT VolumeLabelLength
;
79 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
];
84 ULONG MftZoneReservation
;
85 } NTFS_INFO
, *PNTFS_INFO
;
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'
97 } NTFSIDENTIFIER
, *PNTFSIDENTIFIER
;
101 NTFSIDENTIFIER Identifier
;
103 ERESOURCE DirResource
;
104 // ERESOURCE FatResource;
106 KSPIN_LOCK FcbListLock
;
107 LIST_ENTRY FcbListHead
;
110 PDEVICE_OBJECT StorageDevice
;
111 PFILE_OBJECT StreamFileObject
;
113 struct _NTFS_ATTR_CONTEXT
* MFTContext
;
114 struct _FILE_RECORD_HEADER
* MasterFileTable
;
115 struct _FCB
*VolumeFcb
;
119 NPAGED_LOOKASIDE_LIST FileRecLookasideList
;
123 ULONG OpenHandleCount
;
125 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, NTFS_VCB
, *PNTFS_VCB
;
127 #define VCB_VOLUME_LOCKED 0x0001
131 NTFSIDENTIFIER Identifier
;
133 PFILE_OBJECT PtrFileObject
;
134 LARGE_INTEGER CurrentByteOffset
;
135 /* for DirectoryControl */
137 /* for DirectoryControl */
138 PWCHAR DirectorySearchPattern
;
141 } NTFS_CCB
, *PNTFS_CCB
;
143 #define TAG_CCB 'BCCI'
144 #define TAG_FCB 'BCFI'
148 NTFSIDENTIFIER Identifier
;
150 PDRIVER_OBJECT DriverObject
;
151 PDEVICE_OBJECT DeviceObject
;
152 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
154 FAST_IO_DISPATCH FastIoDispatch
;
155 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
156 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
157 NPAGED_LOOKASIDE_LIST AttrCtxtLookasideList
;
158 BOOLEAN EnableWriteSupport
;
159 } NTFS_GLOBAL_DATA
, *PNTFS_GLOBAL_DATA
;
164 AttributeStandardInformation
= 0x10,
165 AttributeAttributeList
= 0x20,
166 AttributeFileName
= 0x30,
167 AttributeObjectId
= 0x40,
168 AttributeSecurityDescriptor
= 0x50,
169 AttributeVolumeName
= 0x60,
170 AttributeVolumeInformation
= 0x70,
171 AttributeData
= 0x80,
172 AttributeIndexRoot
= 0x90,
173 AttributeIndexAllocation
= 0xA0,
174 AttributeBitmap
= 0xB0,
175 AttributeReparsePoint
= 0xC0,
176 AttributeEAInformation
= 0xD0,
178 AttributePropertySet
= 0xF0,
179 AttributeLoggedUtilityStream
= 0x100,
180 AttributeEnd
= 0xFFFFFFFF
181 } ATTRIBUTE_TYPE
, *PATTRIBUTE_TYPE
;
183 // FILE_RECORD_END seems to follow AttributeEnd in every file record starting with $Quota.
184 // No clue what data is being represented here.
185 #define FILE_RECORD_END 0x11477982
187 #define NTFS_FILE_MFT 0
188 #define NTFS_FILE_MFTMIRR 1
189 #define NTFS_FILE_LOGFILE 2
190 #define NTFS_FILE_VOLUME 3
191 #define NTFS_FILE_ATTRDEF 4
192 #define NTFS_FILE_ROOT 5
193 #define NTFS_FILE_BITMAP 6
194 #define NTFS_FILE_BOOT 7
195 #define NTFS_FILE_BADCLUS 8
196 #define NTFS_FILE_QUOTA 9
197 #define NTFS_FILE_UPCASE 10
198 #define NTFS_FILE_EXTEND 11
199 #define NTFS_FILE_FIRST_USER_FILE 16
201 #define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
203 #define COLLATION_BINARY 0x00
204 #define COLLATION_FILE_NAME 0x01
205 #define COLLATION_UNICODE_STRING 0x02
206 #define COLLATION_NTOFS_ULONG 0x10
207 #define COLLATION_NTOFS_SID 0x11
208 #define COLLATION_NTOFS_SECURITY_HASH 0x12
209 #define COLLATION_NTOFS_ULONGS 0x13
211 #define INDEX_ROOT_SMALL 0x0
212 #define INDEX_ROOT_LARGE 0x1
214 #define INDEX_NODE_SMALL 0x0
215 #define INDEX_NODE_LARGE 0x1
217 #define NTFS_INDEX_ENTRY_NODE 1
218 #define NTFS_INDEX_ENTRY_END 2
220 #define NTFS_FILE_NAME_POSIX 0
221 #define NTFS_FILE_NAME_WIN32 1
222 #define NTFS_FILE_NAME_DOS 2
223 #define NTFS_FILE_NAME_WIN32_AND_DOS 3
225 #define NTFS_FILE_TYPE_READ_ONLY 0x1
226 #define NTFS_FILE_TYPE_HIDDEN 0x2
227 #define NTFS_FILE_TYPE_SYSTEM 0x4
228 #define NTFS_FILE_TYPE_ARCHIVE 0x20
229 #define NTFS_FILE_TYPE_REPARSE 0x400
230 #define NTFS_FILE_TYPE_COMPRESSED 0x800
231 #define NTFS_FILE_TYPE_DIRECTORY 0x10000000
233 /* Indexed Flag in Resident attributes - still somewhat speculative */
234 #define RA_INDEXED 0x01
238 ULONG Type
; /* Magic number 'FILE' */
239 USHORT UsaOffset
; /* Offset to the update sequence */
240 USHORT UsaCount
; /* Size in words of Update Sequence Number & Array (S) */
241 ULONGLONG Lsn
; /* $LogFile Sequence Number (LSN) */
242 } NTFS_RECORD_HEADER
, *PNTFS_RECORD_HEADER
;
244 /* NTFS_RECORD_HEADER.Type */
245 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
246 #define NRH_INDX_TYPE 0x58444E49 /* 'INDX' */
249 typedef struct _FILE_RECORD_HEADER
251 NTFS_RECORD_HEADER Ntfs
;
252 USHORT SequenceNumber
; /* Sequence number */
253 USHORT LinkCount
; /* Hard link count */
254 USHORT AttributeOffset
; /* Offset to the first Attribute */
255 USHORT Flags
; /* Flags */
256 ULONG BytesInUse
; /* Real size of the FILE record */
257 ULONG BytesAllocated
; /* Allocated size of the FILE record */
258 ULONGLONG BaseFileRecord
; /* File reference to the base FILE record */
259 USHORT NextAttributeNumber
; /* Next Attribute Id */
260 USHORT Padding
; /* Align to 4 UCHAR boundary (XP) */
261 ULONG MFTRecordNumber
; /* Number of this MFT Record (XP) */
262 } FILE_RECORD_HEADER
, *PFILE_RECORD_HEADER
;
264 /* Flags in FILE_RECORD_HEADER */
266 #define FRH_IN_USE 0x0001 /* Record is in use */
267 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
268 #define FRH_UNKNOWN1 0x0004 /* Don't know */
269 #define FRH_UNKNOWN2 0x0008 /* Don't know */
282 // Resident attributes
290 // Non-resident attributes
294 ULONGLONG HighestVCN
;
295 USHORT MappingPairsOffset
;
296 USHORT CompressionUnit
;
298 LONGLONG AllocatedSize
;
300 LONGLONG InitializedSize
;
301 LONGLONG CompressedSize
;
304 } NTFS_ATTR_RECORD
, *PNTFS_ATTR_RECORD
;
306 // The beginning and length of an attribute record are always aligned to an 8-byte boundary,
307 // relative to the beginning of the file record.
308 #define ATTR_RECORD_ALIGNMENT 8
310 // Data runs are aligned to a 4-byte boundary, relative to the start of the attribute record
311 #define DATA_RUN_ALIGNMENT 4
313 // Value offset is aligned to a 4-byte boundary, relative to the start of the attribute record
314 #define VALUE_OFFSET_ALIGNMENT 4
318 ULONGLONG CreationTime
;
319 ULONGLONG ChangeTime
;
320 ULONGLONG LastWriteTime
;
321 ULONGLONG LastAccessTime
;
323 ULONG AlignmentOrReserved
[3];
327 ULONGLONG QuotaCharge
;
330 } STANDARD_INFORMATION
, *PSTANDARD_INFORMATION
;
335 ATTRIBUTE_TYPE AttributeType
;
339 ULONGLONG StartVcn
; // LowVcn
340 ULONGLONG FileReferenceNumber
;
341 USHORT AttributeNumber
;
342 USHORT AlignmentOrReserved
[3];
343 } ATTRIBUTE_LIST
, *PATTRIBUTE_LIST
;
348 ULONGLONG DirectoryFileReferenceNumber
;
349 ULONGLONG CreationTime
;
350 ULONGLONG ChangeTime
;
351 ULONGLONG LastWriteTime
;
352 ULONGLONG LastAccessTime
;
353 ULONGLONG AllocatedSize
;
355 ULONG FileAttributes
;
361 USHORT AlignmentOrReserved
;
368 } FILENAME_ATTRIBUTE
, *PFILENAME_ATTRIBUTE
;
372 ULONG FirstEntryOffset
;
373 ULONG TotalSizeOfEntries
;
377 } INDEX_HEADER_ATTRIBUTE
, *PINDEX_HEADER_ATTRIBUTE
;
384 UCHAR ClustersPerIndexRecord
;
386 INDEX_HEADER_ATTRIBUTE Header
;
387 } INDEX_ROOT_ATTRIBUTE
, *PINDEX_ROOT_ATTRIBUTE
;
391 NTFS_RECORD_HEADER Ntfs
;
393 INDEX_HEADER_ATTRIBUTE Header
;
394 } INDEX_BUFFER
, *PINDEX_BUFFER
;
402 ULONGLONG IndexedFile
;
415 FILENAME_ATTRIBUTE FileName
;
416 } INDEX_ENTRY_ATTRIBUTE
, *PINDEX_ENTRY_ATTRIBUTE
;
418 struct _B_TREE_FILENAME_NODE
;
419 typedef struct _B_TREE_FILENAME_NODE B_TREE_FILENAME_NODE
;
421 // Keys are arranged in nodes as an ordered, linked list
422 typedef struct _B_TREE_KEY
424 struct _B_TREE_KEY
*NextKey
;
425 B_TREE_FILENAME_NODE
*LesserChild
; // Child-Node. All the keys in this node will be sorted before IndexEntry
426 PINDEX_ENTRY_ATTRIBUTE IndexEntry
; // must be last member for FIELD_OFFSET
427 }B_TREE_KEY
, *PB_TREE_KEY
;
429 // Every Node is just an ordered list of keys.
430 // Sub-nodes can be found attached to a key (if they exist).
431 // A key's sub-node precedes that key in the ordered list.
432 typedef struct _B_TREE_FILENAME_NODE
436 BOOLEAN DiskNeedsUpdating
;
438 PB_TREE_KEY FirstKey
;
439 } B_TREE_FILENAME_NODE
, *PB_TREE_FILENAME_NODE
;
443 PB_TREE_FILENAME_NODE RootNode
;
453 } VOLINFO_ATTRIBUTE
, *PVOLINFO_ATTRIBUTE
;
460 } REPARSE_POINT_ATTRIBUTE
, *PREPARSE_POINT_ATTRIBUTE
;
462 #define IRPCONTEXT_CANWAIT 0x1
463 #define IRPCONTEXT_COMPLETE 0x2
464 #define IRPCONTEXT_QUEUE 0x4
468 NTFSIDENTIFIER Identifier
;
470 PIO_STACK_LOCATION Stack
;
473 WORK_QUEUE_ITEM WorkQueueItem
;
476 PDEVICE_OBJECT DeviceObject
;
477 PFILE_OBJECT FileObject
;
478 NTSTATUS SavedExceptionCode
;
480 } NTFS_IRP_CONTEXT
, *PNTFS_IRP_CONTEXT
;
482 typedef struct _NTFS_ATTR_CONTEXT
485 ULONGLONG CacheRunOffset
;
486 LONGLONG CacheRunStartLCN
;
487 ULONGLONG CacheRunLength
;
488 LONGLONG CacheRunLastLCN
;
489 ULONGLONG CacheRunCurrentOffset
;
490 LARGE_MCB DataRunsMCB
;
491 ULONGLONG FileMFTIndex
;
492 PNTFS_ATTR_RECORD pRecord
;
493 } NTFS_ATTR_CONTEXT
, *PNTFS_ATTR_CONTEXT
;
495 #define FCB_CACHE_INITIALIZED 0x0001
496 #define FCB_IS_VOLUME_STREAM 0x0002
497 #define FCB_IS_VOLUME 0x0004
502 NTFSIDENTIFIER Identifier
;
504 FSRTL_COMMON_FCB_HEADER RFCB
;
505 SECTION_OBJECT_POINTERS SectionObjectPointers
;
507 PFILE_OBJECT FileObject
;
510 WCHAR Stream
[MAX_PATH
];
511 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
512 WCHAR PathName
[MAX_PATH
]; /* path+filename 260 max */
514 ERESOURCE PagingIoResource
;
515 ERESOURCE MainResource
;
517 LIST_ENTRY FcbListEntry
;
518 struct _FCB
* ParentFcb
;
524 ULONG OpenHandleCount
;
529 FILENAME_ATTRIBUTE Entry
;
531 } NTFS_FCB
, *PNTFS_FCB
;
533 typedef struct _FIND_ATTR_CONTXT
535 PDEVICE_EXTENSION Vcb
;
536 BOOLEAN OnlyResident
;
537 PNTFS_ATTR_RECORD FirstAttr
;
538 PNTFS_ATTR_RECORD CurrAttr
;
539 PNTFS_ATTR_RECORD LastAttr
;
540 PNTFS_ATTR_RECORD NonResidentStart
;
541 PNTFS_ATTR_RECORD NonResidentEnd
;
543 } FIND_ATTR_CONTXT
, *PFIND_ATTR_CONTXT
;
549 } FIXUP_ARRAY
, *PFIXUP_ARRAY
;
551 extern PNTFS_GLOBAL_DATA NtfsGlobalData
;
555 NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext
)
557 PULONG Flags
= &IrpContext
->Flags
;
559 *Flags
&= ~IRPCONTEXT_COMPLETE
;
560 *Flags
|= IRPCONTEXT_QUEUE
;
562 return STATUS_PENDING
;
568 //NtfsDumpAttribute(PATTRIBUTE Attribute);
571 AddBitmap(PNTFS_VCB Vcb
,
572 PFILE_RECORD_HEADER FileRecord
,
573 PNTFS_ATTR_RECORD AttributeAddress
,
578 AddData(PFILE_RECORD_HEADER FileRecord
,
579 PNTFS_ATTR_RECORD AttributeAddress
);
582 AddRun(PNTFS_VCB Vcb
,
583 PNTFS_ATTR_CONTEXT AttrContext
,
585 PFILE_RECORD_HEADER FileRecord
,
586 ULONGLONG NextAssignedCluster
,
590 AddIndexAllocation(PNTFS_VCB Vcb
,
591 PFILE_RECORD_HEADER FileRecord
,
592 PNTFS_ATTR_RECORD AttributeAddress
,
597 AddIndexRoot(PNTFS_VCB Vcb
,
598 PFILE_RECORD_HEADER FileRecord
,
599 PNTFS_ATTR_RECORD AttributeAddress
,
600 PINDEX_ROOT_ATTRIBUTE NewIndexRoot
,
606 AddFileName(PFILE_RECORD_HEADER FileRecord
,
607 PNTFS_ATTR_RECORD AttributeAddress
,
608 PDEVICE_EXTENSION DeviceExt
,
609 PFILE_OBJECT FileObject
,
610 BOOLEAN CaseSensitive
,
611 PULONGLONG ParentMftIndex
);
614 AddStandardInformation(PFILE_RECORD_HEADER FileRecord
,
615 PNTFS_ATTR_RECORD AttributeAddress
);
618 ConvertDataRunsToLargeMCB(PUCHAR DataRun
,
619 PLARGE_MCB DataRunsMCB
,
620 PULONGLONG pNextVBN
);
623 ConvertLargeMCBToDataRuns(PLARGE_MCB DataRunsMCB
,
626 PULONG UsedBufferSize
);
629 DecodeRun(PUCHAR DataRun
,
630 LONGLONG
*DataRunOffset
,
631 ULONGLONG
*DataRunLength
);
633 ULONG
GetFileNameAttributeLength(PFILENAME_ATTRIBUTE FileNameAttribute
);
636 NtfsDumpDataRuns(PVOID StartOfRun
,
637 ULONGLONG CurrentLCN
);
640 NtfsDumpFileAttributes(PDEVICE_EXTENSION Vcb
,
641 PFILE_RECORD_HEADER FileRecord
);
643 PSTANDARD_INFORMATION
644 GetStandardInformationFromRecord(PDEVICE_EXTENSION Vcb
,
645 PFILE_RECORD_HEADER FileRecord
);
648 GetFileNameFromRecord(PDEVICE_EXTENSION Vcb
,
649 PFILE_RECORD_HEADER FileRecord
,
653 GetPackedByteCount(LONGLONG NumberToPack
,
657 GetLastClusterInDataRun(PDEVICE_EXTENSION Vcb
,
658 PNTFS_ATTR_RECORD Attribute
,
659 PULONGLONG LastCluster
);
662 GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb
,
663 PFILE_RECORD_HEADER FileRecord
);
666 FindFirstAttribute(PFIND_ATTR_CONTXT Context
,
667 PDEVICE_EXTENSION Vcb
,
668 PFILE_RECORD_HEADER FileRecord
,
669 BOOLEAN OnlyResident
,
670 PNTFS_ATTR_RECORD
* Attribute
);
673 FindNextAttribute(PFIND_ATTR_CONTXT Context
,
674 PNTFS_ATTR_RECORD
* Attribute
);
677 FindCloseAttribute(PFIND_ATTR_CONTXT Context
);
680 FreeClusters(PNTFS_VCB Vcb
,
681 PNTFS_ATTR_CONTEXT AttrContext
,
683 PFILE_RECORD_HEADER FileRecord
,
684 ULONG ClustersToFree
);
689 NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject
,
690 IN LONGLONG StartingOffset
,
693 IN OUT PUCHAR Buffer
,
694 IN BOOLEAN Override
);
697 NtfsWriteDisk(IN PDEVICE_OBJECT DeviceObject
,
698 IN LONGLONG StartingOffset
,
701 IN
const PUCHAR Buffer
);
704 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
706 IN ULONG SectorCount
,
708 IN OUT PUCHAR Buffer
,
709 IN BOOLEAN Override
);
712 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject
,
713 IN ULONG ControlCode
,
714 IN PVOID InputBuffer
,
715 IN ULONG InputBufferSize
,
716 IN OUT PVOID OutputBuffer
,
717 IN OUT PULONG OutputBufferSize
,
718 IN BOOLEAN Override
);
724 CompareTreeKeys(PB_TREE_KEY Key1
,
726 BOOLEAN CaseSensitive
);
729 CreateBTreeFromIndex(PDEVICE_EXTENSION Vcb
,
730 PFILE_RECORD_HEADER FileRecordWithIndex
,
731 /*PCWSTR IndexName,*/
732 PNTFS_ATTR_CONTEXT IndexRootContext
,
733 PINDEX_ROOT_ATTRIBUTE IndexRoot
,
737 CreateIndexRootFromBTree(PDEVICE_EXTENSION DeviceExt
,
740 PINDEX_ROOT_ATTRIBUTE
*IndexRoot
,
744 DemoteBTreeRoot(PB_TREE Tree
);
747 DestroyBTree(PB_TREE Tree
);
750 DestroyBTreeNode(PB_TREE_FILENAME_NODE Node
);
753 DumpBTree(PB_TREE Tree
);
756 DumpBTreeKey(PB_TREE Tree
,
762 DumpBTreeNode(PB_TREE Tree
,
763 PB_TREE_FILENAME_NODE Node
,
768 CreateEmptyBTree(PB_TREE
*NewTree
);
771 GetAllocationOffsetFromVCN(PDEVICE_EXTENSION DeviceExt
,
772 ULONG IndexBufferSize
,
776 GetIndexEntryVCN(PINDEX_ENTRY_ATTRIBUTE IndexEntry
);
779 GetSizeOfIndexEntries(PB_TREE_FILENAME_NODE Node
);
782 NtfsInsertKey(PB_TREE Tree
,
783 ULONGLONG FileReference
,
784 PFILENAME_ATTRIBUTE FileNameAttribute
,
785 PB_TREE_FILENAME_NODE Node
,
786 BOOLEAN CaseSensitive
,
787 ULONG MaxIndexRootSize
,
788 ULONG IndexRecordSize
,
789 PB_TREE_KEY
*MedianKey
,
790 PB_TREE_FILENAME_NODE
*NewRightHandSibling
);
793 SplitBTreeNode(PB_TREE Tree
,
794 PB_TREE_FILENAME_NODE Node
,
795 PB_TREE_KEY
*MedianKey
,
796 PB_TREE_FILENAME_NODE
*NewRightHandSibling
,
797 BOOLEAN CaseSensitive
);
800 UpdateIndexAllocation(PDEVICE_EXTENSION DeviceExt
,
802 ULONG IndexBufferSize
,
803 PFILE_RECORD_HEADER FileRecord
);
806 UpdateIndexNode(PDEVICE_EXTENSION DeviceExt
,
807 PFILE_RECORD_HEADER FileRecord
,
808 PB_TREE_FILENAME_NODE Node
,
809 ULONG IndexBufferSize
,
810 PNTFS_ATTR_CONTEXT IndexAllocationContext
,
811 ULONG IndexAllocationOffset
);
816 NtfsCleanup(PNTFS_IRP_CONTEXT IrpContext
);
822 NtfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
823 PFILE_OBJECT FileObject
);
826 NtfsClose(PNTFS_IRP_CONTEXT IrpContext
);
832 NtfsCreate(PNTFS_IRP_CONTEXT IrpContext
);
835 NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt
,
836 PFILE_OBJECT FileObject
,
837 BOOLEAN CaseSensitive
,
841 NtfsCreateEmptyFileRecord(PDEVICE_EXTENSION DeviceExt
);
844 NtfsCreateFileRecord(PDEVICE_EXTENSION DeviceExt
,
845 PFILE_OBJECT FileObject
,
846 BOOLEAN CaseSensitive
,
852 NtfsDeviceControl(PNTFS_IRP_CONTEXT IrpContext
);
858 NtfsGetFileSize(PDEVICE_EXTENSION DeviceExt
,
859 PFILE_RECORD_HEADER FileRecord
,
862 PULONGLONG AllocatedSize
);
865 NtfsDirectoryControl(PNTFS_IRP_CONTEXT IrpContext
);
870 DRIVER_DISPATCH NtfsFsdDispatch
;
872 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject
,
879 NtfsAcqLazyWrite(PVOID Context
,
883 NtfsRelLazyWrite(PVOID Context
);
886 NtfsAcqReadAhead(PVOID Context
,
890 NtfsRelReadAhead(PVOID Context
);
892 FAST_IO_CHECK_IF_POSSIBLE NtfsFastIoCheckIfPossible
;
893 FAST_IO_READ NtfsFastIoRead
;
894 FAST_IO_WRITE NtfsFastIoWrite
;
900 NtfsCreateFCB(PCWSTR FileName
,
905 NtfsDestroyFCB(PNTFS_FCB Fcb
);
908 NtfsFCBIsDirectory(PNTFS_FCB Fcb
);
911 NtfsFCBIsReparsePoint(PNTFS_FCB Fcb
);
914 NtfsFCBIsCompressed(PNTFS_FCB Fcb
);
917 NtfsFCBIsRoot(PNTFS_FCB Fcb
);
920 NtfsGrabFCB(PNTFS_VCB Vcb
,
924 NtfsReleaseFCB(PNTFS_VCB Vcb
,
928 NtfsAddFCBToTable(PNTFS_VCB Vcb
,
932 NtfsGrabFCBFromTable(PNTFS_VCB Vcb
,
936 NtfsFCBInitializeCache(PNTFS_VCB Vcb
,
940 NtfsMakeRootFCB(PNTFS_VCB Vcb
);
943 NtfsOpenRootFCB(PNTFS_VCB Vcb
);
946 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb
,
948 PFILE_OBJECT FileObject
);
951 NtfsGetFCBForFile(PNTFS_VCB Vcb
,
952 PNTFS_FCB
*pParentFCB
,
955 BOOLEAN CaseSensitive
);
958 NtfsReadFCBAttribute(PNTFS_VCB Vcb
,
966 NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb
,
967 PNTFS_FCB DirectoryFCB
,
968 PUNICODE_STRING Name
,
970 PFILE_RECORD_HEADER Record
,
972 PNTFS_FCB
* fileFCB
);
978 NtfsQueryInformation(PNTFS_IRP_CONTEXT IrpContext
);
981 NtfsSetEndOfFile(PNTFS_FCB Fcb
,
982 PFILE_OBJECT FileObject
,
983 PDEVICE_EXTENSION DeviceExt
,
985 BOOLEAN CaseSensitive
,
986 PLARGE_INTEGER NewFileSize
);
989 NtfsSetInformation(PNTFS_IRP_CONTEXT IrpContext
);
994 NtfsFileSystemControl(PNTFS_IRP_CONTEXT IrpContext
);
999 NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt
,
1000 ULONGLONG DirectoryMftIndex
,
1001 ULONGLONG FileReferenceNumber
,
1002 PFILENAME_ATTRIBUTE FilenameAttribute
,
1003 BOOLEAN CaseSensitive
);
1006 AddNewMftEntry(PFILE_RECORD_HEADER FileRecord
,
1007 PDEVICE_EXTENSION DeviceExt
,
1008 PULONGLONG DestinationIndex
,
1012 NtfsDumpData(ULONG_PTR Buffer
, ULONG Length
);
1015 PrepareAttributeContext(PNTFS_ATTR_RECORD AttrRecord
);
1018 ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context
);
1021 ReadAttribute(PDEVICE_EXTENSION Vcb
,
1022 PNTFS_ATTR_CONTEXT Context
,
1028 WriteAttribute(PDEVICE_EXTENSION Vcb
,
1029 PNTFS_ATTR_CONTEXT Context
,
1031 const PUCHAR Buffer
,
1033 PULONG LengthWritten
,
1034 PFILE_RECORD_HEADER FileRecord
);
1037 AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord
);
1040 InternalSetResidentAttributeLength(PDEVICE_EXTENSION DeviceExt
,
1041 PNTFS_ATTR_CONTEXT AttrContext
,
1042 PFILE_RECORD_HEADER FileRecord
,
1047 MoveAttributes(PDEVICE_EXTENSION DeviceExt
,
1048 PNTFS_ATTR_RECORD FirstAttributeToMove
,
1049 ULONG FirstAttributeOffset
,
1053 SetAttributeDataLength(PFILE_OBJECT FileObject
,
1055 PNTFS_ATTR_CONTEXT AttrContext
,
1057 PFILE_RECORD_HEADER FileRecord
,
1058 PLARGE_INTEGER DataSize
);
1061 SetFileRecordEnd(PFILE_RECORD_HEADER FileRecord
,
1062 PNTFS_ATTR_RECORD AttrEnd
,
1066 SetNonResidentAttributeDataLength(PDEVICE_EXTENSION Vcb
,
1067 PNTFS_ATTR_CONTEXT AttrContext
,
1069 PFILE_RECORD_HEADER FileRecord
,
1070 PLARGE_INTEGER DataSize
);
1073 SetResidentAttributeDataLength(PDEVICE_EXTENSION Vcb
,
1074 PNTFS_ATTR_CONTEXT AttrContext
,
1076 PFILE_RECORD_HEADER FileRecord
,
1077 PLARGE_INTEGER DataSize
);
1080 AttributeAllocatedLength(PNTFS_ATTR_RECORD AttrRecord
);
1083 CompareFileName(PUNICODE_STRING FileName
,
1084 PINDEX_ENTRY_ATTRIBUTE IndexEntry
,
1086 BOOLEAN CaseSensitive
);
1089 UpdateMftMirror(PNTFS_VCB Vcb
);
1092 ReadFileRecord(PDEVICE_EXTENSION Vcb
,
1094 PFILE_RECORD_HEADER file
);
1097 UpdateIndexEntryFileNameSize(PDEVICE_EXTENSION Vcb
,
1098 PFILE_RECORD_HEADER MftRecord
,
1100 ULONG IndexBlockSize
,
1101 PINDEX_ENTRY_ATTRIBUTE FirstEntry
,
1102 PINDEX_ENTRY_ATTRIBUTE LastEntry
,
1103 PUNICODE_STRING FileName
,
1105 PULONG CurrentEntry
,
1107 ULONGLONG NewDataSize
,
1108 ULONGLONG NewAllocatedSize
,
1109 BOOLEAN CaseSensitive
);
1112 UpdateFileNameRecord(PDEVICE_EXTENSION Vcb
,
1113 ULONGLONG ParentMFTIndex
,
1114 PUNICODE_STRING FileName
,
1116 ULONGLONG NewDataSize
,
1117 ULONGLONG NewAllocationSize
,
1118 BOOLEAN CaseSensitive
);
1121 UpdateFileRecord(PDEVICE_EXTENSION Vcb
,
1123 PFILE_RECORD_HEADER FileRecord
);
1126 FindAttribute(PDEVICE_EXTENSION Vcb
,
1127 PFILE_RECORD_HEADER MftRecord
,
1131 PNTFS_ATTR_CONTEXT
* AttrCtx
,
1135 ReadVCN(PDEVICE_EXTENSION Vcb
,
1136 PFILE_RECORD_HEADER file
,
1137 ATTRIBUTE_TYPE type
,
1143 FixupUpdateSequenceArray(PDEVICE_EXTENSION Vcb
,
1144 PNTFS_RECORD_HEADER Record
);
1147 AddFixupArray(PDEVICE_EXTENSION Vcb
,
1148 PNTFS_RECORD_HEADER Record
);
1151 ReadLCN(PDEVICE_EXTENSION Vcb
,
1157 EnumerAttribute(PFILE_RECORD_HEADER file
,
1158 PDEVICE_EXTENSION Vcb
,
1159 PDEVICE_OBJECT DeviceObject
);
1162 NtfsLookupFile(PDEVICE_EXTENSION Vcb
,
1163 PUNICODE_STRING PathName
,
1164 BOOLEAN CaseSensitive
,
1165 PFILE_RECORD_HEADER
*FileRecord
,
1166 PULONGLONG MFTIndex
);
1169 NtfsLookupFileAt(PDEVICE_EXTENSION Vcb
,
1170 PUNICODE_STRING PathName
,
1171 BOOLEAN CaseSensitive
,
1172 PFILE_RECORD_HEADER
*FileRecord
,
1173 PULONGLONG MFTIndex
,
1174 ULONGLONG CurrentMFTIndex
);
1177 NtfsDumpFileRecord(PDEVICE_EXTENSION Vcb
,
1178 PFILE_RECORD_HEADER FileRecord
);
1181 NtfsFindFileAt(PDEVICE_EXTENSION Vcb
,
1182 PUNICODE_STRING SearchPattern
,
1184 PFILE_RECORD_HEADER
*FileRecord
,
1185 PULONGLONG MFTIndex
,
1186 ULONGLONG CurrentMFTIndex
,
1187 BOOLEAN CaseSensitive
);
1190 NtfsFindMftRecord(PDEVICE_EXTENSION Vcb
,
1192 PUNICODE_STRING FileName
,
1195 BOOLEAN CaseSensitive
,
1196 ULONGLONG
*OutMFTIndex
);
1201 NtfsIsIrpTopLevel(PIRP Irp
);
1204 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
1208 NtfsGetUserBuffer(PIRP Irp
,
1212 NtfsLockUserBuffer(IN PIRP Irp
,
1214 IN LOCK_OPERATION Operation
);
1218 wstrcmpjoki(PWSTR s1
, PWSTR s2
);
1221 CdfsSwapString(PWCHAR Out
,
1227 NtfsFileFlagsToAttributes(ULONG NtfsAttributes
,
1228 PULONG FileAttributes
);
1234 NtfsRead(PNTFS_IRP_CONTEXT IrpContext
);
1237 NtfsWrite(PNTFS_IRP_CONTEXT IrpContext
);
1243 NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt
,
1244 ULONG FirstDesiredCluster
,
1245 ULONG DesiredClusters
,
1246 PULONG FirstAssignedCluster
,
1247 PULONG AssignedClusters
);
1250 NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt
);
1253 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext
);
1256 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext
);
1261 DRIVER_INITIALIZE DriverEntry
;
1265 NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject
);