6 #include <ddk/ntdddisk.h>
9 #define USE_ROS_CC_AND_FS
12 #define CACHEPAGESIZE(pDeviceExt) \
13 ((pDeviceExt)->NtfsInfo.BytesPerCluster > PAGE_SIZE ? \
14 (pDeviceExt)->NtfsInfo.BytesPerCluster : PAGE_SIZE)
17 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
20 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
23 typedef struct _BOOT_SECTOR
25 UCHAR Magic
[3]; // 0x00
26 UCHAR OemName
[8]; // 0x03
27 USHORT BytesPerSector
; // 0x0B
28 UCHAR SectorsPerCluster
; // 0x0D
29 UCHAR Unused0
[7]; // 0x0E
30 UCHAR MediaId
; // 0x15
31 UCHAR Unused1
[2]; // 0x16
32 USHORT SectorsPerTrack
;
35 UCHAR Unknown0
[4]; /* always 80 00 80 00 */
36 ULONGLONG SectorCount
;
37 ULONGLONG MftLocation
;
38 ULONGLONG MftMirrLocation
;
39 CHAR ClustersPerMftRecord
;
41 CHAR ClustersPerIndexRecord
;
43 ULONGLONG SerialNumber
; // 0x48
44 UCHAR BootCode
[432]; // 0x50
45 } __attribute__((packed
)) BOOT_SECTOR
, *PBOOT_SECTOR
;
47 //typedef struct _BootSector BootSector;
53 typedef struct _NTFS_INFO
56 ULONG SectorsPerCluster
;
57 ULONG BytesPerCluster
;
58 ULONGLONG SectorCount
;
59 ULARGE_INTEGER MftStart
;
60 ULARGE_INTEGER MftMirrStart
;
61 ULONG BytesPerFileRecord
;
63 ULONGLONG SerialNumber
;
64 USHORT VolumeLabelLength
;
65 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
];
70 } NTFS_INFO
, *PNTFS_INFO
;
75 ERESOURCE DirResource
;
76 // ERESOURCE FatResource;
78 KSPIN_LOCK FcbListLock
;
79 LIST_ENTRY FcbListHead
;
82 PDEVICE_OBJECT StorageDevice
;
83 PFILE_OBJECT StreamFileObject
;
88 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
91 #define FCB_CACHE_INITIALIZED 0x0001
92 #define FCB_IS_VOLUME_STREAM 0x0002
93 #define FCB_IS_VOLUME 0x0004
97 FSRTL_COMMON_FCB_HEADER RFCB
;
98 SECTION_OBJECT_POINTERS SectionObjectPointers
;
100 PFILE_OBJECT FileObject
;
101 PDEVICE_EXTENSION DevExt
;
103 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
104 WCHAR PathName
[MAX_PATH
]; /* path+filename 260 max */
106 ERESOURCE PagingIoResource
;
107 ERESOURCE MainResource
;
109 LIST_ENTRY FcbListEntry
;
110 struct _FCB
* ParentFcb
;
126 PFILE_OBJECT PtrFileObject
;
127 LARGE_INTEGER CurrentByteOffset
;
128 /* for DirectoryControl */
130 /* for DirectoryControl */
131 PWCHAR DirectorySearchPattern
;
136 #define TAG_CCB TAG('I', 'C', 'C', 'B')
140 PDRIVER_OBJECT DriverObject
;
141 PDEVICE_OBJECT DeviceObject
;
143 } NTFS_GLOBAL_DATA
, *PNTFS_GLOBAL_DATA
;
148 AttributeStandardInformation
= 0x10,
149 AttributeAttributeList
= 0x20,
150 AttributeFileName
= 0x30,
151 AttributeObjectId
= 0x40,
152 AttributeSecurityDescriptor
= 0x50,
153 AttributeVolumeName
= 0x60,
154 AttributeVolumeInformation
= 0x70,
155 AttributeData
= 0x80,
156 AttributeIndexRoot
= 0x90,
157 AttributeIndexAllocation
= 0xA0,
158 AttributeBitmap
= 0xB0,
159 AttributeReparsePoint
= 0xC0,
160 AttributeEAInformation
= 0xD0,
162 AttributePropertySet
= 0xF0,
163 AttributeLoggedUtilityStream
= 0x100
164 } ATTRIBUTE_TYPE
, *PATTRIBUTE_TYPE
;
169 ULONG Type
; /* Magic number 'FILE' */
170 USHORT UsaOffset
; /* Offset to the update sequence */
171 USHORT UsaCount
; /* Size in words of Update Sequence Number & Array (S) */
172 ULONGLONG Lsn
; /* $LogFile Sequence Number (LSN) */
173 } NTFS_RECORD_HEADER
, *PNTFS_RECORD_HEADER
;
175 /* NTFS_RECORD_HEADER.Type */
176 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
181 NTFS_RECORD_HEADER Ntfs
;
182 USHORT SequenceNumber
; /* Sequence number */
183 USHORT LinkCount
; /* Hard link count */
184 USHORT AttributeOffset
; /* Offset to the first Attribute */
185 USHORT Flags
; /* Flags */
186 ULONG BytesInUse
; /* Real size of the FILE record */
187 ULONG BytesAllocated
; /* Allocated size of the FILE record */
188 ULONGLONG BaseFileRecord
; /* File reference to the base FILE record */
189 USHORT NextAttributeNumber
; /* Next Attribute Id */
190 USHORT Pading
; /* Align to 4 byte boundary (XP) */
191 ULONG MFTRecordNumber
; /* Number of this MFT Record (XP) */
192 } FILE_RECORD_HEADER
, *PFILE_RECORD_HEADER
;
194 /* Flags in FILE_RECORD_HEADER */
196 #define FRH_IN_USE 0x0001 /* Record is in use */
197 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
198 #define FRH_UNKNOWN1 0x0004 /* Don't know */
199 #define FRH_UNKNOWN2 0x0008 /* Don't know */
203 ATTRIBUTE_TYPE AttributeType
;
209 USHORT AttributeNumber
;
210 } ATTRIBUTE
, *PATTRIBUTE
;
219 } RESIDENT_ATTRIBUTE
, *PRESIDENT_ATTRIBUTE
;
224 ULONGLONG StartVcn
; // LowVcn
225 ULONGLONG LastVcn
; // HighVcn
226 USHORT RunArrayOffset
;
227 USHORT CompressionUnit
;
230 ULONGLONG AllocatedSize
;
232 ULONGLONG InitializedSize
;
233 ULONGLONG CompressedSize
;
234 } NONRESIDENT_ATTRIBUTE
, *PNONRESIDENT_ATTRIBUTE
;
239 ULONGLONG CreationTime
;
240 ULONGLONG ChangeTime
;
241 ULONGLONG LastWriteTime
;
242 ULONGLONG LastAccessTime
;
244 ULONG AlignmentOrReserved
[3];
248 ULONGLONG QuotaCharge
;
251 } STANDARD_INFORMATION
, *PSTANDARD_INFORMATION
;
256 ATTRIBUTE_TYPE AttributeType
;
260 ULONGLONG StartVcn
; // LowVcn
261 ULONGLONG FileReferenceNumber
;
262 USHORT AttributeNumber
;
263 USHORT AlignmentOrReserved
[3];
264 } ATTRIBUTE_LIST
, *PATTRIBUTE_LIST
;
269 ULONGLONG DirectoryFileReferenceNumber
;
270 ULONGLONG CreationTime
;
271 ULONGLONG ChangeTime
;
272 ULONGLONG LastWriteTime
;
273 ULONGLONG LastAccessTime
;
274 ULONGLONG AllocatedSize
;
276 ULONG FileAttributes
;
277 ULONG AlignmentOrReserved
;
281 } FILENAME_ATTRIBUTE
, *PFILENAME_ATTRIBUTE
;
290 } VOLINFO_ATTRIBUTE
, *PVOLINFO_ATTRIBUTE
;
293 extern PNTFS_GLOBAL_DATA NtfsGlobalData
;
295 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
296 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
302 //NtfsDumpAttribute(PATTRIBUTE Attribute);
304 //LONGLONG RunLCN(PUCHAR run);
306 //ULONG RunLength(PUCHAR run);
309 FindRun (PNONRESIDENT_ATTRIBUTE NresAttr
,
315 NtfsDumpFileAttributes (PFILE_RECORD_HEADER FileRecord
);
320 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
322 IN ULONG SectorCount
,
324 IN OUT PUCHAR Buffer
,
325 IN BOOLEAN Override
);
328 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject
,
329 IN ULONG ControlCode
,
330 IN PVOID InputBuffer
,
331 IN ULONG InputBufferSize
,
332 IN OUT PVOID OutputBuffer
,
333 IN OUT PULONG OutputBufferSize
,
334 IN BOOLEAN Override
);
339 NtfsClose(PDEVICE_OBJECT DeviceObject
,
345 NtfsCreate(PDEVICE_OBJECT DeviceObject
,
352 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject
,
358 NtfsCreateFCB(PWCHAR FileName
);
361 NtfsDestroyFCB(PFCB Fcb
);
364 NtfsFCBIsDirectory(PFCB Fcb
);
367 NtfsFCBIsRoot(PFCB Fcb
);
370 NtfsGrabFCB(PDEVICE_EXTENSION Vcb
,
374 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
378 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
382 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
386 NtfsFCBInitializeCache(PVCB Vcb
,
390 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
393 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
396 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
398 PFILE_OBJECT FileObject
);
401 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
404 const PWSTR pFileName
);
410 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
417 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
423 NtfsOpenMft (PDEVICE_EXTENSION Vcb
);
427 ReadAttribute(PATTRIBUTE attr
, PVOID buffer
, PDEVICE_EXTENSION Vcb
,
428 PDEVICE_OBJECT DeviceObject
);
431 AttributeDataLength(PATTRIBUTE attr
);
434 AttributeAllocatedLength (PATTRIBUTE Attribute
);
437 ReadFileRecord (PDEVICE_EXTENSION Vcb
,
439 PFILE_RECORD_HEADER file
,
440 PFILE_RECORD_HEADER Mft
);
443 FindAttribute(PFILE_RECORD_HEADER file
,
448 AttributeLengthAllocated(PATTRIBUTE attr
);
451 ReadVCN (PDEVICE_EXTENSION Vcb
,
452 PFILE_RECORD_HEADER file
,
459 VOID
FixupUpdateSequenceArray(PFILE_RECORD_HEADER file
);
462 ReadExternalAttribute (PDEVICE_EXTENSION Vcb
,
463 PNONRESIDENT_ATTRIBUTE NresAttr
,
469 ReadLCN (PDEVICE_EXTENSION Vcb
,
476 EnumerAttribute(PFILE_RECORD_HEADER file
,
477 PDEVICE_EXTENSION Vcb
,
478 PDEVICE_OBJECT DeviceObject
);
484 wstrcmpjoki(PWSTR s1
, PWSTR s2
);
487 CdfsSwapString(PWCHAR Out
,
492 CdfsDateTimeToFileTime(PFCB Fcb
,
496 CdfsFileFlagsToAttributes(PFCB Fcb
,
497 PULONG FileAttributes
);
503 NtfsRead(PDEVICE_OBJECT DeviceObject
,
507 NtfsWrite(PDEVICE_OBJECT DeviceObject
,
514 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
,
518 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject
,
524 DriverEntry(PDRIVER_OBJECT DriverObject
,
525 PUNICODE_STRING RegistryPath
);