7 #define CACHEPAGESIZE(pDeviceExt) \
8 ((pDeviceExt)->NtfsInfo.BytesPerCluster > PAGE_SIZE ? \
9 (pDeviceExt)->NtfsInfo.BytesPerCluster : PAGE_SIZE)
11 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
13 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
16 typedef struct _BOOT_SECTOR
18 UCHAR Magic[3]; // 0x00
19 UCHAR OemName[8]; // 0x03
20 USHORT BytesPerSector; // 0x0B
21 UCHAR SectorsPerCluster; // 0x0D
22 UCHAR Unused0[7]; // 0x0E
23 UCHAR MediaId; // 0x15
24 UCHAR Unused1[2]; // 0x16
25 USHORT SectorsPerTrack;
28 UCHAR Unknown0[4]; /* always 80 00 80 00 */
29 ULONGLONG SectorCount;
30 ULONGLONG MftLocation;
31 ULONGLONG MftMirrLocation;
32 ULONG ClustersPerMftRecord;
33 ULONG ClustersPerIndexRecord;
34 ULONGLONG SerialNumber; // 0x48
35 UCHAR BootCode[432]; // 0x50
36 } __attribute__((packed)) BOOT_SECTOR, *PBOOT_SECTOR;
38 //typedef struct _BootSector BootSector;
44 typedef struct _NTFS_INFO
47 ULONG SectorsPerCluster;
48 ULONG BytesPerCluster;
49 ULONGLONG SectorCount;
50 ULARGE_INTEGER MftStart;
51 ULARGE_INTEGER MftMirrStart;
52 ULONGLONG SerialNumber;
54 } NTFS_INFO, *PNTFS_INFO;
59 ERESOURCE DirResource;
60 // ERESOURCE FatResource;
62 KSPIN_LOCK FcbListLock;
63 LIST_ENTRY FcbListHead;
66 PDEVICE_OBJECT StorageDevice;
67 PFILE_OBJECT StreamFileObject;
72 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
75 #define FCB_CACHE_INITIALIZED 0x0001
76 #define FCB_IS_VOLUME_STREAM 0x0002
77 #define FCB_IS_VOLUME 0x0004
81 FSRTL_COMMON_FCB_HEADER RFCB;
82 SECTION_OBJECT_POINTERS SectionObjectPointers;
84 PFILE_OBJECT FileObject;
85 PDEVICE_EXTENSION DevExt;
87 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
88 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
90 ERESOURCE PagingIoResource;
91 ERESOURCE MainResource;
93 LIST_ENTRY FcbListEntry;
94 struct _FCB* ParentFcb;
110 PFILE_OBJECT PtrFileObject;
111 LARGE_INTEGER CurrentByteOffset;
112 /* for DirectoryControl */
114 /* for DirectoryControl */
115 PWCHAR DirectorySearchPattern;
120 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
122 #define TAG_CCB TAG('I', 'C', 'C', 'B')
126 PDRIVER_OBJECT DriverObject;
127 PDEVICE_OBJECT DeviceObject;
129 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
134 AttributeStandardInformation = 0x10,
135 AttributeAttributeList = 0x20,
136 AttributeFileName = 0x30,
137 AttributeObjectId = 0x40,
138 AttributeSecurityDescriptor = 0x50,
139 AttributeVolumeName = 0x60,
140 AttributeVolumeInformation = 0x70,
141 AttributeData = 0x80,
142 AttributeIndexRoot = 0x90,
143 AttributeIndexAllocation = 0xA0,
144 AttributeBitmap = 0xB0,
145 AttributeReparsePoint = 0xC0,
146 AttributeEAInformation = 0xD0,
148 AttributePropertySet = 0xF0,
149 AttributeLoggedUtilityStream = 0x100
150 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
155 ULONG Type; /* Magic number 'FILE' */
156 USHORT UsnOffset; /* Offset to the update sequence */
157 USHORT UsnSize; /* Size in words of Update Sequence Number & Array (S) */
158 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
159 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
163 NTFS_RECORD_HEADER Ntfs;
164 USHORT SequenceNumber; /* Sequence number */
165 USHORT LinkCount; /* Hard link count */
166 USHORT AttributeOffset; /* Offset to the first Attribute */
167 USHORT Flags; /* Flags */
168 ULONG BytesInUse; /* Real size of the FILE record */
169 ULONG BytesAllocated; /* Allocated size of the FILE record */
170 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
171 USHORT NextAttributeNumber; /* Next Attribute Id */
172 USHORT Pading; /* Align to 4 byte boundary (XP) */
173 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
174 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
176 /* Flags in FILE_RECORD_HEADER */
178 #define FRH_IN_USE 0x01 /* Record is in use */
179 #define FRH_DIRECTORY 0x02 /* Record is a directory */
180 #define FRH_UNKNOWN1 0x04 /* Don't know */
181 #define FRH_UNKNOWN2 0x08 /* Don't know */
185 ATTRIBUTE_TYPE AttributeType;
191 USHORT AttributeNumber;
192 } ATTRIBUTE, *PATTRIBUTE;
201 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
206 ULONGLONG StartVcn; // LowVcn
207 ULONGLONG LastVcn; // HighVcn
208 USHORT RunArrayOffset;
209 USHORT CompressionUnit;
212 ULONGLONG AllocatedSize;
214 ULONGLONG InitializedSize;
215 ULONGLONG CompressedSize;
216 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
221 ULONGLONG CreationTime;
222 ULONGLONG ChangeTime;
223 ULONGLONG LastWriteTime;
224 ULONGLONG LastAccessTime;
226 ULONG AlignmentOrReserved[3];
230 ULONGLONG QuotaCharge;
233 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
238 ATTRIBUTE_TYPE AttributeType;
242 ULONGLONG StartVcn; // LowVcn
243 ULONGLONG FileReferenceNumber;
244 USHORT AttributeNumber;
245 USHORT AlignmentOrReserved[3];
246 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
251 ULONGLONG DirectoryFileReferenceNumber;
252 ULONGLONG CreationTime;
253 ULONGLONG ChangeTime;
254 ULONGLONG LastWriteTime;
255 ULONGLONG LastAccessTime;
256 ULONGLONG AllocatedSize;
258 ULONG FileAttributes;
259 ULONG AlignmentOrReserved;
263 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
272 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
275 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
277 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
278 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
284 NtfsDumpAttribute(PATTRIBUTE Attribute);
290 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
292 IN ULONG SectorCount,
294 IN OUT PUCHAR Buffer);
297 NtfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
299 IN ULONG SectorCount,
301 IN OUT PUCHAR Buffer);
304 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
305 IN ULONG ControlCode,
306 IN PVOID InputBuffer,
307 IN ULONG InputBufferSize,
308 IN OUT PVOID OutputBuffer,
309 IN OUT PULONG OutputBufferSize);
314 NtfsClose(PDEVICE_OBJECT DeviceObject,
320 NtfsCreate(PDEVICE_OBJECT DeviceObject,
327 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
333 NtfsCreateFCB(PWCHAR FileName);
336 NtfsDestroyFCB(PFCB Fcb);
339 NtfsFCBIsDirectory(PFCB Fcb);
342 NtfsFCBIsRoot(PFCB Fcb);
345 NtfsGrabFCB(PDEVICE_EXTENSION Vcb,
349 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb,
353 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
357 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
361 NtfsFCBInitializeCache(PVCB Vcb,
365 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
368 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
371 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
373 PFILE_OBJECT FileObject);
376 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
379 const PWSTR pFileName);
385 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject,
392 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
398 NtfsOpenMft(PDEVICE_OBJECT DeviceObject,
399 PDEVICE_EXTENSION Vcb);
406 wstrcmpjoki(PWSTR s1, PWSTR s2);
409 CdfsSwapString(PWCHAR Out,
414 CdfsDateTimeToFileTime(PFCB Fcb,
418 CdfsFileFlagsToAttributes(PFCB Fcb,
419 PULONG FileAttributes);
425 NtfsRead(PDEVICE_OBJECT DeviceObject,
429 NtfsWrite(PDEVICE_OBJECT DeviceObject,
436 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
440 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,