Sync with trunk head (part 1 of x)
[reactos.git] / drivers / filesystems / ntfs / ntfs.h
1 #ifndef NTFS_H
2 #define NTFS_H
3
4 #include <ntifs.h>
5 #include <ntddk.h>
6 #include <ntdddisk.h>
7
8 #define CACHEPAGESIZE(pDeviceExt) \
9 ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
10 (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
11
12 #define TAG_NTFS 'SFTN'
13
14 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (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
60
61
62
63 typedef struct _NTFS_INFO
64 {
65 ULONG BytesPerSector;
66 ULONG SectorsPerCluster;
67 ULONG BytesPerCluster;
68 ULONGLONG SectorCount;
69 ULARGE_INTEGER MftStart;
70 ULARGE_INTEGER MftMirrStart;
71 ULONG BytesPerFileRecord;
72
73 ULONGLONG SerialNumber;
74 USHORT VolumeLabelLength;
75 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
76 UCHAR MajorVersion;
77 UCHAR MinorVersion;
78 USHORT Flags;
79
80 } NTFS_INFO, *PNTFS_INFO;
81
82 #define NTFS_TYPE_CCB '20SF'
83 #define NTFS_TYPE_FCB '30SF'
84 #define NTFS_TYPE_VCB '50SF'
85 #define NTFS_TYPE_IRP_CONTEST '60SF'
86 #define NTFS_TYPE_GLOBAL_DATA '70SF'
87
88 typedef struct
89 {
90 ULONG Type;
91 ULONG Size;
92 } NTFSIDENTIFIER, *PNTFSIDENTIFIER;
93
94
95 typedef struct
96 {
97 NTFSIDENTIFIER Identifier;
98
99 ERESOURCE DirResource;
100 // ERESOURCE FatResource;
101
102 KSPIN_LOCK FcbListLock;
103 LIST_ENTRY FcbListHead;
104
105 PVPB Vpb;
106 PDEVICE_OBJECT StorageDevice;
107 PFILE_OBJECT StreamFileObject;
108
109 NTFS_INFO NtfsInfo;
110
111
112 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, NTFS_VCB, *PNTFS_VCB;
113
114
115 #define FCB_CACHE_INITIALIZED 0x0001
116 #define FCB_IS_VOLUME_STREAM 0x0002
117 #define FCB_IS_VOLUME 0x0004
118 #define MAX_PATH 260
119
120 typedef struct _FCB
121 {
122 NTFSIDENTIFIER Identifier;
123
124 FSRTL_COMMON_FCB_HEADER RFCB;
125 SECTION_OBJECT_POINTERS SectionObjectPointers;
126
127 PFILE_OBJECT FileObject;
128 PNTFS_VCB Vcb;
129
130 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
131 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
132
133 ERESOURCE PagingIoResource;
134 ERESOURCE MainResource;
135
136 LIST_ENTRY FcbListEntry;
137 struct _FCB* ParentFcb;
138
139 ULONG DirIndex;
140
141 LONG RefCount;
142 ULONG Flags;
143
144 // DIR_RECORD Entry;
145
146
147 } NTFS_FCB, *PNTFS_FCB;
148
149
150 typedef struct
151 {
152 NTFSIDENTIFIER Identifier;
153 LIST_ENTRY NextCCB;
154 PFILE_OBJECT PtrFileObject;
155 LARGE_INTEGER CurrentByteOffset;
156 /* for DirectoryControl */
157 ULONG Entry;
158 /* for DirectoryControl */
159 PWCHAR DirectorySearchPattern;
160 ULONG LastCluster;
161 ULONG LastOffset;
162 } NTFS_CCB, *PNTFS_CCB;
163
164 #define TAG_CCB 'BCCI'
165
166 typedef struct
167 {
168 NTFSIDENTIFIER Identifier;
169 ERESOURCE Resource;
170 PDRIVER_OBJECT DriverObject;
171 PDEVICE_OBJECT DeviceObject;
172 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
173 ULONG Flags;
174 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
175
176
177 typedef enum
178 {
179 AttributeStandardInformation = 0x10,
180 AttributeAttributeList = 0x20,
181 AttributeFileName = 0x30,
182 AttributeObjectId = 0x40,
183 AttributeSecurityDescriptor = 0x50,
184 AttributeVolumeName = 0x60,
185 AttributeVolumeInformation = 0x70,
186 AttributeData = 0x80,
187 AttributeIndexRoot = 0x90,
188 AttributeIndexAllocation = 0xA0,
189 AttributeBitmap = 0xB0,
190 AttributeReparsePoint = 0xC0,
191 AttributeEAInformation = 0xD0,
192 AttributeEA = 0xE0,
193 AttributePropertySet = 0xF0,
194 AttributeLoggedUtilityStream = 0x100
195 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
196
197
198 typedef struct
199 {
200 ULONG Type; /* Magic number 'FILE' */
201 USHORT UsaOffset; /* Offset to the update sequence */
202 USHORT UsaCount; /* Size in words of Update Sequence Number & Array (S) */
203 ULONGLONG Lsn; /* $LogFile Sequence Number (LSN) */
204 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
205
206 /* NTFS_RECORD_HEADER.Type */
207 #define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
208
209
210 typedef struct
211 {
212 NTFS_RECORD_HEADER Ntfs;
213 USHORT SequenceNumber; /* Sequence number */
214 USHORT LinkCount; /* Hard link count */
215 USHORT AttributeOffset; /* Offset to the first Attribute */
216 USHORT Flags; /* Flags */
217 ULONG BytesInUse; /* Real size of the FILE record */
218 ULONG BytesAllocated; /* Allocated size of the FILE record */
219 ULONGLONG BaseFileRecord; /* File reference to the base FILE record */
220 USHORT NextAttributeNumber; /* Next Attribute Id */
221 USHORT Pading; /* Align to 4 UCHAR boundary (XP) */
222 ULONG MFTRecordNumber; /* Number of this MFT Record (XP) */
223 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
224
225 /* Flags in FILE_RECORD_HEADER */
226
227 #define FRH_IN_USE 0x0001 /* Record is in use */
228 #define FRH_DIRECTORY 0x0002 /* Record is a directory */
229 #define FRH_UNKNOWN1 0x0004 /* Don't know */
230 #define FRH_UNKNOWN2 0x0008 /* Don't know */
231
232 typedef struct
233 {
234 ATTRIBUTE_TYPE AttributeType;
235 ULONG Length;
236 BOOLEAN Nonresident;
237 UCHAR NameLength;
238 USHORT NameOffset;
239 USHORT Flags;
240 USHORT AttributeNumber;
241 } ATTRIBUTE, *PATTRIBUTE;
242
243 typedef struct
244 {
245 ATTRIBUTE Attribute;
246 ULONG ValueLength;
247 USHORT ValueOffset;
248 UCHAR Flags;
249 // UCHAR Padding0;
250 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
251
252 typedef struct
253 {
254 ATTRIBUTE Attribute;
255 ULONGLONG StartVcn; // LowVcn
256 ULONGLONG LastVcn; // HighVcn
257 USHORT RunArrayOffset;
258 USHORT CompressionUnit;
259 ULONG Padding0;
260 UCHAR IndexedFlag;
261 ULONGLONG AllocatedSize;
262 ULONGLONG DataSize;
263 ULONGLONG InitializedSize;
264 ULONGLONG CompressedSize;
265 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
266
267
268 typedef struct
269 {
270 ULONGLONG CreationTime;
271 ULONGLONG ChangeTime;
272 ULONGLONG LastWriteTime;
273 ULONGLONG LastAccessTime;
274 ULONG FileAttribute;
275 ULONG AlignmentOrReserved[3];
276 #if 0
277 ULONG QuotaId;
278 ULONG SecurityId;
279 ULONGLONG QuotaCharge;
280 USN Usn;
281 #endif
282 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
283
284
285 typedef struct
286 {
287 ATTRIBUTE_TYPE AttributeType;
288 USHORT Length;
289 UCHAR NameLength;
290 UCHAR NameOffset;
291 ULONGLONG StartVcn; // LowVcn
292 ULONGLONG FileReferenceNumber;
293 USHORT AttributeNumber;
294 USHORT AlignmentOrReserved[3];
295 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
296
297
298 typedef struct
299 {
300 ULONGLONG DirectoryFileReferenceNumber;
301 ULONGLONG CreationTime;
302 ULONGLONG ChangeTime;
303 ULONGLONG LastWriteTime;
304 ULONGLONG LastAccessTime;
305 ULONGLONG AllocatedSize;
306 ULONGLONG DataSize;
307 ULONG FileAttributes;
308 ULONG AlignmentOrReserved;
309 UCHAR NameLength;
310 UCHAR NameType;
311 WCHAR Name[1];
312 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
313
314 typedef struct
315 {
316 ULONGLONG Unknown1;
317 UCHAR MajorVersion;
318 UCHAR MinorVersion;
319 USHORT Flags;
320 ULONG Unknown2;
321 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
322
323 typedef struct
324 {
325 NTFSIDENTIFIER Identifier;
326 ULONG Flags;
327 UCHAR MajorFunction;
328 UCHAR MinorFunction;
329 WORK_QUEUE_ITEM WorkQueueItem;
330 PIRP Irp;
331 BOOLEAN IsTopLevel;
332 PDEVICE_OBJECT DeviceObject;
333 NTSTATUS SavedExceptionCode;
334 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
335
336
337 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
338
339 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
340 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
341
342
343 /* attrib.c */
344
345 //VOID
346 //NtfsDumpAttribute(PATTRIBUTE Attribute);
347
348 //LONGLONG RunLCN(PUCHAR run);
349
350 //ULONG RunLength(PUCHAR run);
351
352 BOOLEAN
353 FindRun (PNONRESIDENT_ATTRIBUTE NresAttr,
354 ULONGLONG vcn,
355 PULONGLONG lcn,
356 PULONGLONG count);
357
358 VOID
359 NtfsDumpFileAttributes (PFILE_RECORD_HEADER FileRecord);
360
361 /* blockdev.c */
362
363 NTSTATUS
364 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
365 IN ULONG DiskSector,
366 IN ULONG SectorCount,
367 IN ULONG SectorSize,
368 IN OUT PUCHAR Buffer,
369 IN BOOLEAN Override);
370
371 NTSTATUS
372 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
373 IN ULONG ControlCode,
374 IN PVOID InputBuffer,
375 IN ULONG InputBufferSize,
376 IN OUT PVOID OutputBuffer,
377 IN OUT PULONG OutputBufferSize,
378 IN BOOLEAN Override);
379
380 /* close.c */
381
382 DRIVER_DISPATCH NtfsFsdClose;
383 NTSTATUS NTAPI
384 NtfsFsdClose(PDEVICE_OBJECT DeviceObject,
385 PIRP Irp);
386
387 /* create.c */
388
389 DRIVER_DISPATCH NtfsFsdCreate;
390 NTSTATUS NTAPI
391 NtfsFsdCreate(PDEVICE_OBJECT DeviceObject,
392 PIRP Irp);
393
394
395 /* dirctl.c */
396
397 DRIVER_DISPATCH NtfsFsdDirectoryControl;
398 NTSTATUS NTAPI
399 NtfsFsdDirectoryControl(PDEVICE_OBJECT DeviceObject,
400 PIRP Irp);
401
402 /* dispatch.c */
403 DRIVER_DISPATCH NtfsFsdDispatch;
404 NTSTATUS NTAPI
405 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
406 PIRP Irp);
407
408 /* fastio.c */
409 BOOLEAN NTAPI
410 NtfsAcqLazyWrite(PVOID Context,
411 BOOLEAN Wait);
412
413 VOID NTAPI
414 NtfsRelLazyWrite(PVOID Context);
415
416 BOOLEAN NTAPI
417 NtfsAcqReadAhead(PVOID Context,
418 BOOLEAN Wait);
419
420 VOID NTAPI
421 NtfsRelReadAhead(PVOID Context);
422
423 /* fcb.c */
424
425 PNTFS_FCB
426 NtfsCreateFCB(PCWSTR FileName, PNTFS_VCB Vcb);
427
428 VOID
429 NtfsDestroyFCB(PNTFS_FCB Fcb);
430
431 BOOLEAN
432 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
433
434 BOOLEAN
435 NtfsFCBIsRoot(PNTFS_FCB Fcb);
436
437 VOID
438 NtfsGrabFCB(PNTFS_VCB Vcb,
439 PNTFS_FCB Fcb);
440
441 VOID
442 NtfsReleaseFCB(PNTFS_VCB Vcb,
443 PNTFS_FCB Fcb);
444
445 VOID
446 NtfsAddFCBToTable(PNTFS_VCB Vcb,
447 PNTFS_FCB Fcb);
448
449 PNTFS_FCB
450 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
451 PCWSTR FileName);
452
453 NTSTATUS
454 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
455 PNTFS_FCB Fcb);
456
457 PNTFS_FCB
458 NtfsMakeRootFCB(PNTFS_VCB Vcb);
459
460 PNTFS_FCB
461 NtfsOpenRootFCB(PNTFS_VCB Vcb);
462
463 NTSTATUS
464 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
465 PNTFS_FCB Fcb,
466 PFILE_OBJECT FileObject);
467
468 NTSTATUS
469 NtfsGetFCBForFile(PNTFS_VCB Vcb,
470 PNTFS_FCB *pParentFCB,
471 PNTFS_FCB *pFCB,
472 const PWSTR pFileName);
473
474
475 /* finfo.c */
476
477 DRIVER_DISPATCH NtfsFsdQueryInformation;
478 NTSTATUS NTAPI
479 NtfsFsdQueryInformation(PDEVICE_OBJECT DeviceObject,
480 PIRP Irp);
481
482
483 /* fsctl.c */
484
485 DRIVER_DISPATCH NtfsFsdFileSystemControl;
486 NTSTATUS NTAPI
487 NtfsFsdFileSystemControl(PDEVICE_OBJECT DeviceObject,
488 PIRP Irp);
489
490
491 /* mft.c */
492 NTSTATUS
493 NtfsOpenMft (PDEVICE_EXTENSION Vcb);
494
495
496 VOID
497 ReadAttribute(PATTRIBUTE attr, PVOID buffer, PDEVICE_EXTENSION Vcb,
498 PDEVICE_OBJECT DeviceObject);
499
500 ULONG
501 AttributeDataLength(PATTRIBUTE attr);
502
503 ULONG
504 AttributeAllocatedLength (PATTRIBUTE Attribute);
505
506 NTSTATUS
507 ReadFileRecord (PDEVICE_EXTENSION Vcb,
508 ULONG index,
509 PFILE_RECORD_HEADER file,
510 PFILE_RECORD_HEADER Mft);
511
512 PATTRIBUTE
513 FindAttribute(PFILE_RECORD_HEADER file,
514 ATTRIBUTE_TYPE type,
515 PWSTR name);
516
517 ULONG
518 AttributeLengthAllocated(PATTRIBUTE attr);
519
520 VOID
521 ReadVCN (PDEVICE_EXTENSION Vcb,
522 PFILE_RECORD_HEADER file,
523 ATTRIBUTE_TYPE type,
524 ULONGLONG vcn,
525 ULONG count,
526 PVOID buffer);
527
528
529 VOID FixupUpdateSequenceArray(PFILE_RECORD_HEADER file);
530
531 VOID
532 ReadExternalAttribute (PDEVICE_EXTENSION Vcb,
533 PNONRESIDENT_ATTRIBUTE NresAttr,
534 ULONGLONG vcn,
535 ULONG count,
536 PVOID buffer);
537
538 NTSTATUS
539 ReadLCN (PDEVICE_EXTENSION Vcb,
540 ULONGLONG lcn,
541 ULONG count,
542 PVOID buffer);
543
544
545 VOID
546 EnumerAttribute(PFILE_RECORD_HEADER file,
547 PDEVICE_EXTENSION Vcb,
548 PDEVICE_OBJECT DeviceObject);
549
550 /* misc.c */
551 BOOLEAN
552 NtfsIsIrpTopLevel(PIRP Irp);
553
554 PNTFS_IRP_CONTEXT
555 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
556 PIRP Irp);
557
558 #if 0
559 BOOLEAN
560 wstrcmpjoki(PWSTR s1, PWSTR s2);
561
562 VOID
563 CdfsSwapString(PWCHAR Out,
564 PUCHAR In,
565 ULONG Count);
566
567 VOID
568 CdfsDateTimeToFileTime(PFCB Fcb,
569 TIME *FileTime);
570
571 VOID
572 CdfsFileFlagsToAttributes(PFCB Fcb,
573 PULONG FileAttributes);
574 #endif
575
576 /* rw.c */
577
578 DRIVER_DISPATCH NtfsFsdRead;
579 NTSTATUS NTAPI
580 NtfsFsdRead(PDEVICE_OBJECT DeviceObject,
581 PIRP Irp);
582
583 DRIVER_DISPATCH NtfsFsdWrite;
584 NTSTATUS NTAPI
585 NtfsFsdWrite(PDEVICE_OBJECT DeviceObject,
586 PIRP Irp);
587
588
589 /* volinfo.c */
590
591 NTSTATUS
592 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
593
594 NTSTATUS
595 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
596
597 /* ntfs.c */
598
599 DRIVER_INITIALIZE DriverEntry;
600
601 VOID NTAPI NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
602 #endif /* NTFS_H */