Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenntfs.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
1.7.6.1
|