/*++ Copyright (c) 1991 Microsoft Corporation Module Name: frs.hxx Abstract: This module contains the declarations for the NTFS_FILE_RECORD_SEGMENT class. This class models File Record Segments in the NTFS Master File Table; it is the object through which a file's attributes may be accessed. Author: Bill McJohn (billmc) 13-June-91 Environment: ULIB, User Mode --*/ #if !defined( _NTFS_FILE_RECORD_SEGMENT_DEFN_ ) #define _NTFS_FILE_RECORD_SEGMENT_DEFN_ #include "frsstruc.hxx" #include "cannedsd.hxx" #include "clusrun.hxx" #include "array.hxx" #include "hmem.hxx" #include "list.hxx" #include "iterator.hxx" // Possible return codes for SortIndex: // // NTFS_SORT_INDEX_NOT_FOUND -- this FRS does not contain an // index with the specified name. // NTFS_SORT_INDEX_WELL_ORDERED -- the index was not sorted because // it was found to be well-ordered. // NTFS_SORT_INDEX_BADLY_ORDERED -- The index was found to be badly // ordered, and it was not sorted. // NTFS_SORT_INDEX_SORTED -- The index was sorted and new // attributes were inserted into // the FRS. // NTFS_SORT_INSERT_FAILED -- An insertion of an index entry // into the new tree failed. // (Probable cause: out of space.) // NTFS_SORT_ERROR -- Sort failed because of an error. // // typedef enum NTFS_SORT_CODE { NTFS_SORT_INDEX_NOT_FOUND, NTFS_SORT_INDEX_WELL_ORDERED, NTFS_SORT_INDEX_BADLY_ORDERED, NTFS_SORT_INDEX_SORTED, NTFS_SORT_INSERT_FAILED, NTFS_SORT_ERROR }; // Possible return codes for VerifyAndFixQuotaDefaultId: // // NTFS_QUOTA_INDEX_NOT_FOUND -- this FRS does not contain an // index with the specified name. // NTFS_QUOTA_DEFAULT_ENTRY_MISSING-- the default entry was not found // in the index // NTFS_QUOTA_INDEX_FOUND -- Found the default Id entry in the // index tree. // NTFS_QUOTA_INDEX_INSERTED -- Inserted the default Id entry into // the index tree. // NTFS_QUOTA_INSERT_FAILED -- An insertion of the default Id // entry into the index tree failed. // (Probable cause: out of space.) // NTFS_QUOTA_ERROR -- error occurred. (Possibly out // of memory or out of space.) // typedef enum NTFS_QUOTA_CODE { NTFS_QUOTA_INDEX_NOT_FOUND, NTFS_QUOTA_INDEX_FOUND, NTFS_QUOTA_DEFAULT_ENTRY_MISSING, NTFS_QUOTA_INDEX_INSERTED, NTFS_QUOTA_INSERT_FAILED, NTFS_QUOTA_ERROR }; // Possible return codes for FindSecurityIndexEntryAndValidate: // // NTFS_SECURITY_INDEX_ENTRY_MISSING -- the specified index entry key // cannot be found in the index // NTFS_SECURITY_INDEX_FOUND -- the found entry contains // correct data // NTFS_SECURITY_INDEX_FIXED -- the found entry contains invalid // data but is now corrected // NTFS_SECURITY_INDEX_DATA_ERROR -- The index was found but the data // data in it is incorrect. // NTFS_SECURITY_INDEX_INSERTED -- An index was successfully inserted // into the specified index. // NTFS_SECURITY_INSERT_FAILED -- An insertion of an index entry // into the index tree failed. // (Probable cause: out of space.) // NTFS_SECURITY_ERROR -- failed because of an error. // (Probably out of memory or out // of space.) // typedef enum NTFS_SECURITY_CODE { NTFS_SECURITY_INDEX_ENTRY_MISSING, NTFS_SECURITY_INDEX_FOUND, NTFS_SECURITY_INDEX_FIXED, NTFS_SECURITY_INDEX_DATA_ERROR, NTFS_SECURITY_INDEX_INSERTED, NTFS_SECURITY_INSERT_FAILED, NTFS_SECURITY_ERROR }; // Forward references DECLARE_CLASS( IO_DP_DRIVE ); DECLARE_CLASS( NTFS_MASTER_FILE_TABLE ); DECLARE_CLASS( NTFS_MFT_FILE ); DECLARE_CLASS( NTFS_ATTRIBUTE ); DECLARE_CLASS( WSTRING ); DECLARE_CLASS( NTFS_ATTRIBUTE_RECORD ); DECLARE_CLASS( NTFS_ATTRIBUTE_RECORD_LIST ); DECLARE_CLASS( NTFS_FILE_RECORD_SEGMENT ); DECLARE_CLASS( NTFS_ATTRIBUTE_LIST ); DECLARE_CLASS( NTFS_BITMAP ); DECLARE_CLASS( NTFS_BAD_CLUSTER_FILE ); class NTFS_FILE_RECORD_SEGMENT : public NTFS_FRS_STRUCTURE { public: UNTFS_EXPORT DECLARE_CONSTRUCTOR( NTFS_FILE_RECORD_SEGMENT ); VIRTUAL UNTFS_EXPORT ~NTFS_FILE_RECORD_SEGMENT ( ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize ( IN VCN FileNumber, IN OUT PNTFS_MFT_FILE MftFile ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize ( IN VCN FileNumber, IN OUT PNTFS_MASTER_FILE_TABLE Mft ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize( IN VCN FirstFileNumber, IN ULONG FrsCount, IN OUT PNTFS_MASTER_FILE_TABLE Mft ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize( ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Create ( IN PCSTANDARD_INFORMATION StandardInformation, IN USHORT Flags DEFAULT 0 ); NONVIRTUAL BOOLEAN Create ( IN PCMFT_SEGMENT_REFERENCE BaseSegment, IN USHORT Flags DEFAULT 0 ); NONVIRTUAL BOOLEAN CreateSystemFile( IN UCHAR major DEFAULT 0, IN UCHAR minor DEFAULT 0 ); NONVIRTUAL BOOLEAN CreateExtendSystemFile( IN PCWSTRING file_name_text, IN USHORT FrsFlags, IN ULONG FileAttributes DEFAULT 0 ); NONVIRTUAL BOOLEAN VerifyAndFixFileNames( IN OUT PNTFS_BITMAP VolumeBitmap, IN PCNTFS_CHKDSK_INFO ChkdskInfo, IN FIX_LEVEL FixLevel, IN OUT PMESSAGE Message, IN OUT PBOOLEAN DiskErrorsFound DEFAULT NULL, IN BOOLEAN FixDupInfo DEFAULT TRUE, IN BOOLEAN ClearSystemFlags DEFAULT FALSE ); VIRTUAL UNTFS_EXPORT BOOLEAN Write( ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Flush( IN OUT PNTFS_BITMAP VolumeBitmap OPTIONAL, IN OUT PNTFS_INDEX_TREE ParentIndex DEFAULT NULL, IN BOOLEAN FrsIsEmpty DEFAULT FALSE ); NONVIRTUAL BOOLEAN AddDataAttribute( IN ULONG InitialSize, IN OUT PNTFS_BITMAP VolumeBitmap, IN BOOLEAN Fill DEFAULT FALSE, IN CHAR FillCharacter DEFAULT 0 ); NONVIRTUAL UNTFS_EXPORT BOOLEAN AddFileNameAttribute( IN PFILE_NAME FileNameAttributeValue ); NONVIRTUAL BOOLEAN AddAttribute( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name OPTIONAL, IN PCVOID Value OPTIONAL, IN ULONG Length, IN OUT PNTFS_BITMAP Bitmap OPTIONAL, IN BOOLEAN IsIndexed DEFAULT FALSE ); NONVIRTUAL UNTFS_EXPORT BOOLEAN AddSecurityDescriptor( IN CANNED_SECURITY_TYPE SecurityType, IN OUT PNTFS_BITMAP Bitmap ); NONVIRTUAL UNTFS_EXPORT BOOLEAN AddSecurityDescriptorData( IN PNTFS_ATTRIBUTE attribute, IN OUT PVOID buffer, OUT PSECURITY_ENTRY *SecurityEntry, IN ULONG SecurityId, IN CANNED_SECURITY_TYPE SecurityType, IN OUT PNTFS_BITMAP Bitmap, IN BOOLEAN FixLevel ); NONVIRTUAL BOOLEAN AddEmptyAttribute( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name DEFAULT NULL ); NONVIRTUAL UNTFS_EXPORT BOOLEAN IsAttributePresent ( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name DEFAULT NULL, IN BOOLEAN IgnoreExternal DEFAULT FALSE ); NONVIRTUAL BOOLEAN QueryAttributeRecord ( OUT PNTFS_ATTRIBUTE_RECORD AttributeRecord, IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name DEFAULT NULL ); NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryAttribute ( OUT PNTFS_ATTRIBUTE Attribute, OUT PBOOLEAN Error, IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name DEFAULT NULL ); NONVIRTUAL BOOLEAN Delete( IN OUT PNTFS_BITMAP VolumeBitmap ); NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryAttributeListAttribute ( OUT PNTFS_ATTRIBUTE Attribute, OUT PBOOLEAN Error ); NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryFileSizes ( OUT PBIG_INT AllocatedLength, OUT PBIG_INT FileSize, OUT PBOOLEAN Error ); NONVIRTUAL BOOLEAN QueryResidentAttribute ( OUT PNTFS_ATTRIBUTE Attribute, OUT PBOOLEAN Error, IN ATTRIBUTE_TYPE_CODE Type, IN PCVOID Value, IN ULONG ValueLength, IN COLLATION_RULE CollationRule DEFAULT COLLATION_BINARY ); NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryAttributeByOrdinal ( OUT PNTFS_ATTRIBUTE Attribute, OUT PBOOLEAN Error, IN ATTRIBUTE_TYPE_CODE Type, IN ULONG Ordinal ); NONVIRTUAL BOOLEAN QueryAttributeByTag ( OUT PNTFS_ATTRIBUTE Attribute, OUT PBOOLEAN Error, IN ULONG Tag ); NONVIRTUAL BOOLEAN PurgeAttribute ( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name DEFAULT NULL, IN BOOLEAN IgnoreExternal DEFAULT FALSE ); NONVIRTUAL BOOLEAN DeleteResidentAttribute( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name OPTIONAL, IN PCVOID Value, IN ULONG ValueLength, OUT PBOOLEAN Deleted, IN BOOLEAN IgnoreExternal DEFAULT FALSE ); NONVIRTUAL BOOLEAN DeleteResidentAttributeLocal( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name OPTIONAL, IN PCVOID Value, IN ULONG ValueLength, OUT PBOOLEAN Deleted, OUT PBOOLEAN IsIndexed, OUT PUSHORT InstanceTag ); VIRTUAL BOOLEAN InsertAttributeRecord ( IN OUT PNTFS_ATTRIBUTE_RECORD NewRecord, IN BOOLEAN ForceExternal DEFAULT FALSE ); NONVIRTUAL USHORT QueryNextInstance( ); NONVIRTUAL VOID IncrementNextInstance( ); NONVIRTUAL ULONG QueryFreeSpace( ); NONVIRTUAL ULONG QueryMaximumAttributeRecordSize ( ) CONST; NONVIRTUAL BOOLEAN QueryNextAttribute( IN OUT PATTRIBUTE_TYPE_CODE TypeCode, IN OUT PWSTRING Name ); NONVIRTUAL BOOLEAN RecoverFile( IN OUT PNTFS_BITMAP VolumeBitmap, IN OUT PNUMBER_SET BadClusterList, IN UCHAR VolumeMajorVersion, OUT PULONG BadClusters, OUT PBIG_INT BytesRecovered, OUT PBIG_INT TotalBytes ); NONVIRTUAL NTFS_SORT_CODE SortIndex( IN PCWSTRING IndexName, IN OUT PNTFS_BITMAP VolumeBitmap, IN BOOLEAN DuplicatesAllowed, IN BOOLEAN CheckOnly DEFAULT FALSE ); NONVIRTUAL NTFS_QUOTA_CODE VerifyAndFixQuotaDefaultId( IN OUT PNTFS_BITMAP VolumeBitmap, IN BOOLEAN CheckOnly ); NONVIRTUAL NTFS_SECURITY_CODE FindSecurityIndexEntryAndValidate( IN OUT PNTFS_INDEX_TREE OldTree, IN PVOID Key, IN USHORT KeyLength, IN PSECURITY_DESCRIPTOR_HEADER SecurityDescriptorHeader, IN OUT PNTFS_BITMAP VolumeBitmap, IN BOOLEAN CheckOnly ); NONVIRTUAL BOOLEAN QueryDuplicatedInformation( OUT PDUPLICATED_INFORMATION DuplicatedInformation ); NONVIRTUAL BOOLEAN UpdateFileNames( IN PDUPLICATED_INFORMATION DuplicatedInformation, IN OUT PNTFS_INDEX_TREE Index OPTIONAL, IN BOOLEAN IgnoreExternal ); NONVIRTUAL BOOLEAN Backtrack( OUT PWSTRING Path ); NONVIRTUAL VOID SetLsn( IN BIG_INT NewLsn ); NONVIRTUAL BOOLEAN PurgeAttributeList ( ); NONVIRTUAL BOOLEAN IsAttributeListPresent( ); protected: NONVIRTUAL BOOLEAN Initialize( IN OUT PLOG_IO_DP_DRIVE Drive, IN LCN StartOfMft, IN PNTFS_MASTER_FILE_TABLE Mft ); private: NONVIRTUAL VOID Construct ( ); inline NONVIRTUAL VOID Destroy2 ( ); NONVIRTUAL VOID Destroy ( ); NONVIRTUAL BOOLEAN Create ( IN USHORT Flags DEFAULT 0 ); NONVIRTUAL BOOLEAN SetupAttributeList( ); NONVIRTUAL BOOLEAN CreateAttributeList( OUT PNTFS_ATTRIBUTE_LIST AttributeList ); NONVIRTUAL BOOLEAN SaveAttributeList( PNTFS_BITMAP VolumeBitmap ); NONVIRTUAL BOOLEAN InsertExternalAttributeRecord( IN PNTFS_ATTRIBUTE_RECORD NewRecord ); NONVIRTUAL BOOLEAN BacktrackWorker( IN OUT PWSTRING Path ); NONVIRTUAL PNTFS_FILE_RECORD_SEGMENT SetupChild( IN VCN FileNumber ); NONVIRTUAL BOOLEAN AddChild( PNTFS_FILE_RECORD_SEGMENT ChildFrs ); NONVIRTUAL PNTFS_FILE_RECORD_SEGMENT GetChild( VCN FileNumber ); NONVIRTUAL VOID DeleteChild( VCN FileNumber ); HMEM _Mem; LIST _Children; PITERATOR _ChildIterator; PNTFS_MASTER_FILE_TABLE _Mft; PNTFS_ATTRIBUTE_LIST _AttributeList; }; INLINE USHORT NTFS_FILE_RECORD_SEGMENT::QueryNextInstance( ) /*++ Routine Description: This method fetches the current value of the FRS' NextAttributeInstance field. Arguments: None. Return Value: The current value of the FRS' NextAttributeInstance field. --*/ { return _FrsData->NextAttributeInstance; } INLINE VOID NTFS_FILE_RECORD_SEGMENT::IncrementNextInstance( ) /*++ Routine Description: This method increments the NextAttributeInstance field of the File Record Segment. Arguments: None. Return Value: None. --*/ { _FrsData->NextAttributeInstance++; } INLINE ULONG NTFS_FILE_RECORD_SEGMENT::QueryFreeSpace( ) /*++ Routine Description: This method returns the amount of free space following the last Attribute Record in the File Record Segment. Arguments: None. Return Value: The amount of free space. Notes: This method assumes that the FRS is consistent. --*/ { return _FrsData->BytesAvailable - _FrsData->FirstFreeByte; } INLINE ULONG NTFS_FILE_RECORD_SEGMENT::QueryMaximumAttributeRecordSize ( ) CONST /*++ Routine Description: This method returns the size of the largest attribute record the File Record Segment will accept. Note that this is the largest record it will ever accept, not what it can currently accept. Arguments: None. Return Value: The size of the largest attribute record a File Record Segment of this size can accept. --*/ { ULONG temp; // // Take a precaution to make sure this routine never returns a // "negative" number. // temp = _FrsData->FirstAttributeOffset + QuadAlign(sizeof(ATTRIBUTE_TYPE_CODE)); if (temp > QuerySize()) { return QuerySize(); } return QuerySize() - temp; } INLINE BOOLEAN NTFS_FILE_RECORD_SEGMENT::AddEmptyAttribute( IN ATTRIBUTE_TYPE_CODE Type, IN PCWSTRING Name ) /*++ Routine Description: This method adds an empty, non-indexed, resident attribute of the specified type to the FRS. Arguments: Type -- Supplies the attribute's type code. Name -- Supplies the attribute's name. May be NULL, in which case the attribute has no name. Return Value: TRUE upon successful completion. --*/ { NTFS_ATTRIBUTE Attribute; return( Attribute.Initialize( GetDrive(), QueryClusterFactor(), NULL, 0, Type, Name, 0 ) && Attribute.InsertIntoFile( this, NULL ) ); } INLINE BOOLEAN NTFS_FILE_RECORD_SEGMENT::IsAttributeListPresent( ) /*++ Routine Description: This method checks for the presence of an attribute list. Arguments: N/A Return Value: TRUE if there is an attribute list. --*/ { return (_AttributeList != NULL) || IsAttributePresent($ATTRIBUTE_LIST, NULL, TRUE); } #endif