ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ntfs.h
Go to the documentation of this file.
00001 #ifndef NTFS_H
00002 #define NTFS_H
00003 
00004 #include <ntifs.h>
00005 #include <ntddk.h>
00006 #include <ntdddisk.h>
00007 
00008 #define CACHEPAGESIZE(pDeviceExt) \
00009     ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
00010      (pDeviceExt)->NtfsInfo.UCHARsPerCluster : PAGE_SIZE)
00011 
00012 #define TAG_NTFS 'SFTN'
00013 
00014 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
00015 
00016 #define DEVICE_NAME L"\\Ntfs"
00017 
00018 #include <pshpack1.h>
00019 typedef struct _BIOS_PARAMETERS_BLOCK
00020 {
00021   USHORT    BytesPerSector;         // 0x0B
00022   UCHAR     SectorsPerCluster;      // 0x0D
00023   UCHAR     Unused0[7];             // 0x0E, checked when volume is mounted
00024   UCHAR     MediaId;                // 0x15
00025   UCHAR     Unused1[2];             // 0x16
00026   USHORT    SectorsPerTrack;        // 0x18
00027   USHORT    Heads;                  // 0x1A
00028   UCHAR     Unused2[4];             // 0x1C
00029   UCHAR     Unused3[4];             // 0x20, checked when volume is mounted
00030 } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK;
00031 
00032 typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
00033 {
00034   USHORT    Unknown[2];             // 0x24, always 80 00 80 00
00035   ULONGLONG SectorCount;            // 0x28
00036   ULONGLONG MftLocation;            // 0x30
00037   ULONGLONG MftMirrLocation;        // 0x38
00038   CHAR      ClustersPerMftRecord;   // 0x40
00039   UCHAR     Unused4[3];             // 0x41
00040   CHAR      ClustersPerIndexRecord; // 0x44
00041   UCHAR     Unused5[3];             // 0x45
00042   ULONGLONG SerialNumber;           // 0x48
00043   UCHAR     Checksum[4];            // 0x50
00044 } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK;
00045 
00046 typedef struct _BOOT_SECTOR
00047 {
00048   UCHAR     Jump[3];                // 0x00
00049   UCHAR     OEMID[8];               // 0x03
00050   BIOS_PARAMETERS_BLOCK BPB;
00051   EXTENDED_BIOS_PARAMETERS_BLOCK EBPB;
00052   UCHAR     BootStrap[426];         // 0x54
00053   USHORT    EndSector;              // 0x1FE
00054 } BOOT_SECTOR, *PBOOT_SECTOR;
00055 #include <poppack.h>
00056 
00057 //typedef struct _BootSector BootSector;
00058 
00059 
00060 
00061 
00062 
00063 typedef struct _NTFS_INFO
00064 {
00065   ULONG BytesPerSector;
00066   ULONG SectorsPerCluster;
00067   ULONG BytesPerCluster;
00068   ULONGLONG SectorCount;
00069   ULARGE_INTEGER MftStart;
00070   ULARGE_INTEGER MftMirrStart;
00071   ULONG BytesPerFileRecord;
00072 
00073   ULONGLONG SerialNumber;
00074   USHORT VolumeLabelLength;
00075   WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
00076   UCHAR MajorVersion;
00077   UCHAR MinorVersion;
00078   USHORT Flags;
00079 
00080 } NTFS_INFO, *PNTFS_INFO;
00081 
00082 #define NTFS_TYPE_CCB         '20SF'
00083 #define NTFS_TYPE_FCB         '30SF'
00084 #define NTFS_TYPE_VCB         '50SF'
00085 #define NTFS_TYPE_IRP_CONTEST '60SF'
00086 #define NTFS_TYPE_GLOBAL_DATA '70SF'
00087 
00088 typedef struct
00089 {
00090   ULONG Type;
00091   ULONG Size;
00092 } NTFSIDENTIFIER, *PNTFSIDENTIFIER;
00093 
00094 
00095 typedef struct
00096 {
00097   NTFSIDENTIFIER Identifier;
00098 
00099   ERESOURCE DirResource;
00100 //  ERESOURCE FatResource;
00101 
00102   KSPIN_LOCK FcbListLock;
00103   LIST_ENTRY FcbListHead;
00104 
00105   PVPB Vpb;
00106   PDEVICE_OBJECT StorageDevice;
00107   PFILE_OBJECT StreamFileObject;
00108 
00109   NTFS_INFO NtfsInfo;
00110 
00111 
00112 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, NTFS_VCB, *PNTFS_VCB;
00113 
00114 
00115 #define FCB_CACHE_INITIALIZED   0x0001
00116 #define FCB_IS_VOLUME_STREAM    0x0002
00117 #define FCB_IS_VOLUME           0x0004
00118 #define MAX_PATH                260
00119 
00120 typedef struct _FCB
00121 {
00122   NTFSIDENTIFIER Identifier;
00123 
00124   FSRTL_COMMON_FCB_HEADER RFCB;
00125   SECTION_OBJECT_POINTERS SectionObjectPointers;
00126 
00127   PFILE_OBJECT FileObject;
00128   PNTFS_VCB Vcb;
00129 
00130   WCHAR *ObjectName;        /* point on filename (250 chars max) in PathName */
00131   WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
00132 
00133   ERESOURCE PagingIoResource;
00134   ERESOURCE MainResource;
00135 
00136   LIST_ENTRY FcbListEntry;
00137   struct _FCB* ParentFcb;
00138 
00139   ULONG DirIndex;
00140 
00141   LONG RefCount;
00142   ULONG Flags;
00143 
00144 //  DIR_RECORD Entry;
00145 
00146 
00147 } NTFS_FCB, *PNTFS_FCB;
00148 
00149 
00150 typedef struct
00151 {
00152   NTFSIDENTIFIER Identifier;
00153   LIST_ENTRY     NextCCB;
00154   PFILE_OBJECT   PtrFileObject;
00155   LARGE_INTEGER  CurrentByteOffset;
00156   /* for DirectoryControl */
00157   ULONG Entry;
00158   /* for DirectoryControl */
00159   PWCHAR DirectorySearchPattern;
00160   ULONG LastCluster;
00161   ULONG LastOffset;
00162 } NTFS_CCB, *PNTFS_CCB;
00163 
00164 #define TAG_CCB 'BCCI'
00165 
00166 typedef struct
00167 {
00168   NTFSIDENTIFIER Identifier;
00169   ERESOURCE      Resource;
00170   PDRIVER_OBJECT DriverObject;
00171   PDEVICE_OBJECT DeviceObject;
00172   CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
00173   ULONG Flags;
00174 } NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
00175 
00176 
00177 typedef enum
00178 {
00179   AttributeStandardInformation = 0x10,
00180   AttributeAttributeList = 0x20,
00181   AttributeFileName = 0x30,
00182   AttributeObjectId = 0x40,
00183   AttributeSecurityDescriptor = 0x50,
00184   AttributeVolumeName = 0x60,
00185   AttributeVolumeInformation = 0x70,
00186   AttributeData = 0x80,
00187   AttributeIndexRoot = 0x90,
00188   AttributeIndexAllocation = 0xA0,
00189   AttributeBitmap = 0xB0,
00190   AttributeReparsePoint = 0xC0,
00191   AttributeEAInformation = 0xD0,
00192   AttributeEA = 0xE0,
00193   AttributePropertySet = 0xF0,
00194   AttributeLoggedUtilityStream = 0x100
00195 } ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;
00196 
00197 
00198 typedef struct
00199 {
00200   ULONG Type;             /* Magic number 'FILE' */
00201   USHORT UsaOffset;       /* Offset to the update sequence */
00202   USHORT UsaCount;        /* Size in words of Update Sequence Number & Array (S) */
00203   ULONGLONG Lsn;          /* $LogFile Sequence Number (LSN) */
00204 } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
00205 
00206 /* NTFS_RECORD_HEADER.Type */
00207 #define NRH_FILE_TYPE  0x454C4946  /* 'FILE' */
00208 
00209 
00210 typedef struct
00211 {
00212   NTFS_RECORD_HEADER Ntfs;
00213   USHORT SequenceNumber;        /* Sequence number */
00214   USHORT LinkCount;             /* Hard link count */
00215   USHORT AttributeOffset;       /* Offset to the first Attribute */
00216   USHORT Flags;                 /* Flags */
00217   ULONG BytesInUse;             /* Real size of the FILE record */
00218   ULONG BytesAllocated;         /* Allocated size of the FILE record */
00219   ULONGLONG BaseFileRecord;     /* File reference to the base FILE record */
00220   USHORT NextAttributeNumber;   /* Next Attribute Id */
00221   USHORT Pading;                /* Align to 4 UCHAR boundary (XP) */
00222   ULONG MFTRecordNumber;        /* Number of this MFT Record (XP) */
00223 } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;
00224 
00225 /* Flags in FILE_RECORD_HEADER */
00226 
00227 #define FRH_IN_USE    0x0001    /* Record is in use */
00228 #define FRH_DIRECTORY 0x0002    /* Record is a directory */
00229 #define FRH_UNKNOWN1  0x0004    /* Don't know */
00230 #define FRH_UNKNOWN2  0x0008    /* Don't know */
00231 
00232 typedef struct
00233 {
00234   ATTRIBUTE_TYPE AttributeType;
00235   ULONG Length;
00236   BOOLEAN Nonresident;
00237   UCHAR NameLength;
00238   USHORT NameOffset;
00239   USHORT Flags;
00240   USHORT AttributeNumber;
00241 } ATTRIBUTE, *PATTRIBUTE;
00242 
00243 typedef struct
00244 {
00245   ATTRIBUTE Attribute;
00246   ULONG ValueLength;
00247   USHORT ValueOffset;
00248   UCHAR Flags;
00249 //  UCHAR Padding0;
00250 } RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
00251 
00252 typedef struct
00253 {
00254   ATTRIBUTE Attribute;
00255   ULONGLONG StartVcn; // LowVcn
00256   ULONGLONG LastVcn; // HighVcn
00257   USHORT RunArrayOffset;
00258   USHORT CompressionUnit;
00259   ULONG  Padding0;
00260   UCHAR  IndexedFlag;
00261   ULONGLONG AllocatedSize;
00262   ULONGLONG DataSize;
00263   ULONGLONG InitializedSize;
00264   ULONGLONG CompressedSize;
00265 } NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;
00266 
00267 
00268 typedef struct
00269 {
00270   ULONGLONG CreationTime;
00271   ULONGLONG ChangeTime;
00272   ULONGLONG LastWriteTime;
00273   ULONGLONG LastAccessTime;
00274   ULONG FileAttribute;
00275   ULONG AlignmentOrReserved[3];
00276 #if 0
00277   ULONG QuotaId;
00278   ULONG SecurityId;
00279   ULONGLONG QuotaCharge;
00280   USN Usn;
00281 #endif
00282 } STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
00283 
00284 
00285 typedef struct
00286 {
00287   ATTRIBUTE_TYPE AttributeType;
00288   USHORT Length;
00289   UCHAR NameLength;
00290   UCHAR NameOffset;
00291   ULONGLONG StartVcn; // LowVcn
00292   ULONGLONG FileReferenceNumber;
00293   USHORT AttributeNumber;
00294   USHORT AlignmentOrReserved[3];
00295 } ATTRIBUTE_LIST, *PATTRIBUTE_LIST;
00296 
00297 
00298 typedef struct
00299 {
00300   ULONGLONG DirectoryFileReferenceNumber;
00301   ULONGLONG CreationTime;
00302   ULONGLONG ChangeTime;
00303   ULONGLONG LastWriteTime;
00304   ULONGLONG LastAccessTime;
00305   ULONGLONG AllocatedSize;
00306   ULONGLONG DataSize;
00307   ULONG FileAttributes;
00308   ULONG AlignmentOrReserved;
00309   UCHAR NameLength;
00310   UCHAR NameType;
00311   WCHAR Name[1];
00312 } FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
00313 
00314 typedef struct
00315 {
00316   ULONGLONG Unknown1;
00317   UCHAR MajorVersion;
00318   UCHAR MinorVersion;
00319   USHORT Flags;
00320   ULONG Unknown2;
00321 } VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
00322 
00323 typedef struct
00324 {
00325   NTFSIDENTIFIER Identifier;
00326   ULONG Flags;
00327   UCHAR MajorFunction;
00328   UCHAR MinorFunction;
00329   WORK_QUEUE_ITEM   WorkQueueItem;
00330   PIRP Irp;
00331   BOOLEAN IsTopLevel;
00332   PDEVICE_OBJECT DeviceObject;
00333   NTSTATUS SavedExceptionCode;
00334 } NTFS_IRP_CONTEXT, *PNTFS_IRP_CONTEXT;
00335 
00336 
00337 extern PNTFS_GLOBAL_DATA NtfsGlobalData;
00338 
00339 //int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
00340 //void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
00341 
00342 
00343 /* attrib.c */
00344 
00345 //VOID
00346 //NtfsDumpAttribute(PATTRIBUTE Attribute);
00347 
00348 //LONGLONG RunLCN(PUCHAR run);
00349 
00350 //ULONG RunLength(PUCHAR run);
00351 
00352 BOOLEAN
00353 FindRun (PNONRESIDENT_ATTRIBUTE NresAttr,
00354      ULONGLONG vcn,
00355      PULONGLONG lcn,
00356      PULONGLONG count);
00357 
00358 VOID
00359 NtfsDumpFileAttributes (PFILE_RECORD_HEADER FileRecord);
00360 
00361 /* blockdev.c */
00362 
00363 NTSTATUS
00364 NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
00365         IN ULONG DiskSector,
00366         IN ULONG SectorCount,
00367         IN ULONG SectorSize,
00368         IN OUT PUCHAR Buffer,
00369         IN BOOLEAN Override);
00370 
00371 NTSTATUS
00372 NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject,
00373             IN ULONG ControlCode,
00374             IN PVOID InputBuffer,
00375             IN ULONG InputBufferSize,
00376             IN OUT PVOID OutputBuffer,
00377             IN OUT PULONG OutputBufferSize,
00378             IN BOOLEAN Override);
00379 
00380 /* close.c */
00381 
00382 DRIVER_DISPATCH NtfsFsdClose;
00383 NTSTATUS NTAPI
00384 NtfsFsdClose(PDEVICE_OBJECT DeviceObject,
00385       PIRP Irp);
00386 
00387 /* create.c */
00388 
00389 DRIVER_DISPATCH NtfsFsdCreate;
00390 NTSTATUS NTAPI
00391 NtfsFsdCreate(PDEVICE_OBJECT DeviceObject,
00392        PIRP Irp);
00393 
00394 
00395 /* dirctl.c */
00396 
00397 DRIVER_DISPATCH NtfsFsdDirectoryControl;
00398 NTSTATUS NTAPI
00399 NtfsFsdDirectoryControl(PDEVICE_OBJECT DeviceObject,
00400              PIRP Irp);
00401 
00402 /* dispatch.c */
00403 DRIVER_DISPATCH NtfsFsdDispatch;
00404 NTSTATUS NTAPI
00405 NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
00406                 PIRP Irp);
00407 
00408 /* fastio.c */
00409 BOOLEAN NTAPI
00410 NtfsAcqLazyWrite(PVOID Context,
00411                  BOOLEAN Wait);
00412 
00413 VOID NTAPI
00414 NtfsRelLazyWrite(PVOID Context);
00415 
00416 BOOLEAN NTAPI
00417 NtfsAcqReadAhead(PVOID Context,
00418                  BOOLEAN Wait);
00419 
00420 VOID NTAPI
00421 NtfsRelReadAhead(PVOID Context);
00422 
00423 /* fcb.c */
00424 
00425 PNTFS_FCB
00426 NtfsCreateFCB(PCWSTR FileName, PNTFS_VCB Vcb);
00427 
00428 VOID
00429 NtfsDestroyFCB(PNTFS_FCB Fcb);
00430 
00431 BOOLEAN
00432 NtfsFCBIsDirectory(PNTFS_FCB Fcb);
00433 
00434 BOOLEAN
00435 NtfsFCBIsRoot(PNTFS_FCB Fcb);
00436 
00437 VOID
00438 NtfsGrabFCB(PNTFS_VCB Vcb,
00439         PNTFS_FCB Fcb);
00440 
00441 VOID
00442 NtfsReleaseFCB(PNTFS_VCB Vcb,
00443            PNTFS_FCB Fcb);
00444 
00445 VOID
00446 NtfsAddFCBToTable(PNTFS_VCB Vcb,
00447           PNTFS_FCB Fcb);
00448 
00449 PNTFS_FCB
00450 NtfsGrabFCBFromTable(PNTFS_VCB Vcb,
00451              PCWSTR FileName);
00452 
00453 NTSTATUS
00454 NtfsFCBInitializeCache(PNTFS_VCB Vcb,
00455                PNTFS_FCB Fcb);
00456 
00457 PNTFS_FCB
00458 NtfsMakeRootFCB(PNTFS_VCB Vcb);
00459 
00460 PNTFS_FCB
00461 NtfsOpenRootFCB(PNTFS_VCB Vcb);
00462 
00463 NTSTATUS
00464 NtfsAttachFCBToFileObject(PNTFS_VCB Vcb,
00465               PNTFS_FCB Fcb,
00466               PFILE_OBJECT FileObject);
00467 
00468 NTSTATUS
00469 NtfsGetFCBForFile(PNTFS_VCB Vcb,
00470           PNTFS_FCB *pParentFCB,
00471           PNTFS_FCB *pFCB,
00472           const PWSTR pFileName);
00473 
00474 
00475 /* finfo.c */
00476 
00477 DRIVER_DISPATCH NtfsFsdQueryInformation;
00478 NTSTATUS NTAPI
00479 NtfsFsdQueryInformation(PDEVICE_OBJECT DeviceObject,
00480              PIRP Irp);
00481 
00482 
00483 /* fsctl.c */
00484 
00485 DRIVER_DISPATCH NtfsFsdFileSystemControl;
00486 NTSTATUS NTAPI
00487 NtfsFsdFileSystemControl(PDEVICE_OBJECT DeviceObject,
00488               PIRP Irp);
00489 
00490 
00491 /* mft.c */
00492 NTSTATUS
00493 NtfsOpenMft (PDEVICE_EXTENSION Vcb);
00494 
00495 
00496 VOID
00497 ReadAttribute(PATTRIBUTE attr, PVOID buffer, PDEVICE_EXTENSION Vcb,
00498                     PDEVICE_OBJECT DeviceObject);
00499 
00500 ULONG
00501 AttributeDataLength(PATTRIBUTE  attr);
00502 
00503 ULONG
00504 AttributeAllocatedLength (PATTRIBUTE Attribute);
00505 
00506 NTSTATUS
00507 ReadFileRecord (PDEVICE_EXTENSION Vcb,
00508         ULONG index,
00509         PFILE_RECORD_HEADER file,
00510         PFILE_RECORD_HEADER Mft);
00511 
00512 PATTRIBUTE
00513 FindAttribute(PFILE_RECORD_HEADER file,
00514           ATTRIBUTE_TYPE type,
00515           PWSTR name);
00516 
00517 ULONG
00518 AttributeLengthAllocated(PATTRIBUTE attr);
00519 
00520 VOID
00521 ReadVCN (PDEVICE_EXTENSION Vcb,
00522      PFILE_RECORD_HEADER file,
00523      ATTRIBUTE_TYPE type,
00524      ULONGLONG vcn,
00525      ULONG count,
00526      PVOID buffer);
00527 
00528 
00529 VOID FixupUpdateSequenceArray(PFILE_RECORD_HEADER file);
00530 
00531 VOID
00532 ReadExternalAttribute (PDEVICE_EXTENSION Vcb,
00533                PNONRESIDENT_ATTRIBUTE NresAttr,
00534                ULONGLONG vcn,
00535                ULONG count,
00536                PVOID buffer);
00537 
00538 NTSTATUS
00539 ReadLCN (PDEVICE_EXTENSION Vcb,
00540      ULONGLONG lcn,
00541      ULONG count,
00542      PVOID buffer);
00543 
00544 
00545 VOID
00546 EnumerAttribute(PFILE_RECORD_HEADER file,
00547         PDEVICE_EXTENSION Vcb,
00548         PDEVICE_OBJECT DeviceObject);
00549 
00550 /* misc.c */
00551 BOOLEAN
00552 NtfsIsIrpTopLevel(PIRP Irp);
00553 
00554 PNTFS_IRP_CONTEXT
00555 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
00556                        PIRP Irp);
00557 
00558 #if 0
00559 BOOLEAN
00560 wstrcmpjoki(PWSTR s1, PWSTR s2);
00561 
00562 VOID
00563 CdfsSwapString(PWCHAR Out,
00564            PUCHAR In,
00565            ULONG Count);
00566 
00567 VOID
00568 CdfsDateTimeToFileTime(PFCB Fcb,
00569                TIME *FileTime);
00570 
00571 VOID
00572 CdfsFileFlagsToAttributes(PFCB Fcb,
00573               PULONG FileAttributes);
00574 #endif
00575 
00576 /* rw.c */
00577 
00578 DRIVER_DISPATCH NtfsFsdRead;
00579 NTSTATUS NTAPI
00580 NtfsFsdRead(PDEVICE_OBJECT DeviceObject,
00581     PIRP Irp);
00582 
00583 DRIVER_DISPATCH NtfsFsdWrite;
00584 NTSTATUS NTAPI
00585 NtfsFsdWrite(PDEVICE_OBJECT DeviceObject,
00586       PIRP Irp);
00587 
00588 
00589 /* volinfo.c */
00590 
00591 NTSTATUS
00592 NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
00593 
00594 NTSTATUS
00595 NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);
00596 
00597 /* ntfs.c */
00598 
00599 DRIVER_INITIALIZE DriverEntry;
00600 
00601 VOID NTAPI NtfsInitializeFunctionPointers(PDRIVER_OBJECT DriverObject);
00602 #endif /* NTFS_H */

Generated on Fri May 25 2012 04:17:19 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.