c1fbf65a06eed3f06d77378a7fcfff767efbfdb7
[reactos.git] / drivers / fs / ntfs / ntfs.h
1 #ifndef NTFS_H
2 #define NTFS_H
3
4 #include <ddk/ntifs.h>
5
6
7 #define CACHEPAGESIZE(pDeviceExt) \
8         ((pDeviceExt)->NtfsInfo.BytesPerCluster > PAGE_SIZE ? \
9          (pDeviceExt)->NtfsInfo.BytesPerCluster : PAGE_SIZE)
10
11 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
12
13 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
14
15
16 typedef struct _BOOT_SECTOR
17 {
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;
26   USHORT    Heads;
27   UCHAR     Unused2[8];
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;
37
38 //typedef struct _BootSector BootSector;
39
40
41
42
43
44 typedef struct _NTFS_INFO
45 {
46   ULONG BytesPerSector;
47   ULONG SectorsPerCluster;
48   ULONG BytesPerCluster;
49   ULONGLONG SectorCount;
50   ULARGE_INTEGER MftStart;
51   ULARGE_INTEGER MftMirrStart;
52   ULONGLONG SerialNumber;
53
54 } NTFS_INFO, *PNTFS_INFO;
55
56
57 typedef struct
58 {
59   ERESOURCE DirResource;
60 //  ERESOURCE FatResource;
61
62   KSPIN_LOCK FcbListLock;
63   LIST_ENTRY FcbListHead;
64
65   PVPB Vpb;
66   PDEVICE_OBJECT StorageDevice;
67   PFILE_OBJECT StreamFileObject;
68
69   NTFS_INFO NtfsInfo;
70
71
72 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
73
74
75 #define FCB_CACHE_INITIALIZED   0x0001
76 #define FCB_IS_VOLUME_STREAM    0x0002
77 #define FCB_IS_VOLUME           0x0004
78
79 typedef struct _FCB
80 {
81   REACTOS_COMMON_FCB_HEADER RFCB;
82   SECTION_OBJECT_POINTERS SectionObjectPointers;
83
84   PFILE_OBJECT FileObject;
85   PDEVICE_EXTENSION DevExt;
86
87   WCHAR *ObjectName;            /* point on filename (250 chars max) in PathName */
88   WCHAR PathName[MAX_PATH];     /* path+filename 260 max */
89
90   ERESOURCE PagingIoResource;
91   ERESOURCE MainResource;
92
93   LIST_ENTRY FcbListEntry;
94   struct _FCB* ParentFcb;
95
96   ULONG DirIndex;
97
98   LONG RefCount;
99   ULONG Flags;
100
101 //  DIR_RECORD Entry;
102
103
104 } FCB, *PFCB;
105
106
107 typedef struct _CCB
108 {
109   LIST_ENTRY     NextCCB;
110   PFILE_OBJECT   PtrFileObject;
111   LARGE_INTEGER  CurrentByteOffset;
112   /* for DirectoryControl */
113   ULONG Entry;
114   /* for DirectoryControl */
115   PWCHAR DirectorySearchPattern;
116   ULONG LastCluster;
117   ULONG LastOffset;
118 } CCB, *PCCB;
119
120 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
121
122 #define TAG_CCB TAG('I', 'C', 'C', 'B')
123
124 typedef struct
125 {
126   PDRIVER_OBJECT DriverObject;
127   PDEVICE_OBJECT DeviceObject;
128   ULONG Flags;
129 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
130
131
132 typedef enum
133 {
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,
147   AttributeEA = 0xE0,
148   AttributePropertySet = 0xF0,
149   AttributeLoggedUtilityStream = 0x100
150 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
151
152
153 typedef struct
154 {
155   ULONG Type;
156   USHORT UsnOffset;
157   USHORT UsnSize;
158   ULONGLONG Usn;
159 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
160
161 typedef struct
162 {
163   NTFS_RECORD_HEADER Ntfs;
164   USHORT SequenceNumber;
165   USHORT LinkCount;
166   USHORT AttributeOffset;
167   USHORT Flags;
168   ULONG BytesInUse;
169   ULONG BytesAllocated;
170   ULONGLONG BaseFileRecord;
171   USHORT NextAttributeNumber;
172 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
173
174 typedef struct
175 {
176   ATTRIBUTE_TYPE AttributeType;
177   ULONG Length;
178   BOOLEAN Nonresident;
179   UCHAR NameLength;
180   USHORT NameOffset;
181   USHORT Flags;
182   USHORT AttributeNumber;
183 } ATTRIBUTE, *PATTRIBUTE;
184
185 typedef struct
186 {
187   ATTRIBUTE Attribute;
188   ULONG ValueLength;
189   USHORT ValueOffset;
190   UCHAR Flags;
191 //  UCHAR Padding0;
192 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
193
194 typedef struct
195 {
196   ATTRIBUTE Attribute;
197   ULONGLONG StartVcn; // LowVcn
198   ULONGLONG LastVcn; // HighVcn
199   USHORT RunArrayOffset;
200   USHORT CompressionUnit;
201   ULONG  Padding0;
202   UCHAR  IndexedFlag;
203   ULONGLONG AllocatedSize;
204   ULONGLONG DataSize;
205   ULONGLONG InitializedSize;
206   ULONGLONG CompressedSize;
207 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
208
209
210 typedef struct
211 {
212   ULONGLONG CreationTime;
213   ULONGLONG ChangeTime;
214   ULONGLONG LastWriteTime;
215   ULONGLONG LastAccessTime;
216   ULONG FileAttribute;
217   ULONG AlignmentOrReserved[3];
218 #if 0
219   ULONG QuotaId;
220   ULONG SecurityId;
221   ULONGLONG QuotaCharge;
222   USN Usn;
223 #endif
224 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
225
226
227 typedef struct
228 {
229   ATTRIBUTE_TYPE AttributeType;
230   USHORT Length;
231   UCHAR NameLength;
232   UCHAR NameOffset;
233   ULONGLONG StartVcn; // LowVcn
234   ULONGLONG FileReferenceNumber;
235   USHORT AttributeNumber;
236   USHORT AlignmentOrReserved[3];
237 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
238
239
240 typedef struct
241 {
242   ULONGLONG DirectoryFileReferenceNumber;
243   ULONGLONG CreationTime;
244   ULONGLONG ChangeTime;
245   ULONGLONG LastWriteTime;
246   ULONGLONG LastAccessTime;
247   ULONGLONG AllocatedSize;
248   ULONGLONG DataSize;
249   ULONG FileAttributes;
250   ULONG AlignmentOrReserved;
251   UCHAR NameLength;
252   UCHAR NameType;
253   WCHAR Name[1];
254 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
255
256 typedef struct
257 {
258   ULONGLONG Unknown1;
259   UCHAR MajorVersion;
260   UCHAR MinorVersion;
261   USHORT Flags;
262   ULONG Unknown2;
263 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
264
265
266 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
267
268 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
269 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
270
271
272 /* attrib.c */
273
274 VOID
275 NtfsDumpAttribute(PATTRIBUTE Attribute);
276
277
278 /* blockdev.c */
279
280 NTSTATUS
281 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
282                 IN ULONG DiskSector,
283                 IN ULONG SectorCount,
284                 IN ULONG SectorSize,
285                 IN OUT PUCHAR Buffer);
286
287 NTSTATUS
288 NtfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
289                    IN ULONG DiskSector,
290                    IN ULONG SectorCount,
291                    IN ULONG SectorSize,
292                    IN OUT PUCHAR Buffer);
293
294 NTSTATUS
295 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
296                     IN ULONG ControlCode,
297                     IN PVOID InputBuffer,
298                     IN ULONG InputBufferSize,
299                     IN OUT PVOID OutputBuffer,
300                     IN OUT PULONG OutputBufferSize);
301
302 #if 0
303 /* close.c */
304
305 NTSTATUS STDCALL
306 CdfsClose(PDEVICE_OBJECT DeviceObject,
307           PIRP Irp);
308 #endif
309
310 /* create.c */
311
312 NTSTATUS STDCALL
313 NtfsCreate(PDEVICE_OBJECT DeviceObject,
314            PIRP Irp);
315
316
317 /* dirctl.c */
318
319 NTSTATUS STDCALL
320 NtfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
321                      PIRP Irp);
322
323
324 /* fcb.c */
325
326 PFCB
327 NtfsCreateFCB(PWCHAR FileName);
328
329 VOID
330 NtfsDestroyFCB(PFCB Fcb);
331
332 BOOLEAN
333 NtfsFCBIsDirectory(PFCB Fcb);
334
335 BOOLEAN
336 NtfsFCBIsRoot(PFCB Fcb);
337
338 VOID
339 NtfsGrabFCB(PDEVICE_EXTENSION Vcb,
340             PFCB Fcb);
341
342 VOID
343 NtfsReleaseFCB(PDEVICE_EXTENSION Vcb,
344                PFCB Fcb);
345
346 VOID
347 NtfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
348                   PFCB Fcb);
349
350 PFCB
351 NtfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
352                      PWSTR FileName);
353
354 NTSTATUS
355 NtfsFCBInitializeCache(PVCB Vcb,
356                        PFCB Fcb);
357
358 PFCB
359 NtfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
360
361 PFCB
362 NtfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
363
364 NTSTATUS
365 NtfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
366                           PFCB Fcb,
367                           PFILE_OBJECT FileObject);
368
369 NTSTATUS
370 NtfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
371                   PFCB *pParentFCB,
372                   PFCB *pFCB,
373                   const PWSTR pFileName);
374
375
376 /* finfo.c */
377
378 NTSTATUS STDCALL
379 NtfsQueryInformation(PDEVICE_OBJECT DeviceObject,
380                      PIRP Irp);
381
382
383 /* fsctl.c */
384
385 NTSTATUS STDCALL
386 NtfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
387                       PIRP Irp);
388
389
390 /* mft.c */
391 NTSTATUS
392 NtfsOpenMft(PDEVICE_OBJECT DeviceObject,
393             PDEVICE_EXTENSION Vcb);
394
395
396 #if 0
397 /* misc.c */
398
399 BOOLEAN
400 wstrcmpjoki(PWSTR s1, PWSTR s2);
401
402 VOID
403 CdfsSwapString(PWCHAR Out,
404                PUCHAR In,
405                ULONG Count);
406
407 VOID
408 CdfsDateTimeToFileTime(PFCB Fcb,
409                        TIME *FileTime);
410
411 VOID
412 CdfsFileFlagsToAttributes(PFCB Fcb,
413                           PULONG FileAttributes);
414
415 /* rw.c */
416
417 NTSTATUS STDCALL
418 CdfsRead(PDEVICE_OBJECT DeviceObject,
419         PIRP Irp);
420
421 NTSTATUS STDCALL
422 CdfsWrite(PDEVICE_OBJECT DeviceObject,
423           PIRP Irp);
424 #endif
425
426
427 /* volinfo.c */
428
429 NTSTATUS STDCALL
430 NtfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
431                            PIRP Irp);
432
433 NTSTATUS STDCALL
434 NtfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
435                          PIRP Irp);
436
437 #endif /* NTFS_H */