|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
frsstruc.hxx
Abstract:
This class models a file record segment structure.
Author:
Norbert P. Kusters (norbertk) 17-Sep-91
Environment:
ULIB, User Mode
--*/
#if !defined( _NTFS_FRS_STRUCTURE_DEFN_ )
#define _NTFS_FRS_STRUCTURE_DEFN_
#include "volume.hxx"
#include "ntfssa.hxx"
#include "tlink.hxx"
DECLARE_CLASS( NTFS_FRS_STRUCTURE ); DECLARE_CLASS( MEM ); DECLARE_CLASS( NTFS_ATTRIBUTE ); DECLARE_CLASS( LOG_IO_DP_DRIVE ); DECLARE_CLASS( NTFS_CLUSTER_RUN ); DECLARE_CLASS( WSTRING ); DECLARE_CLASS( MESSAGE ); DECLARE_CLASS( NTFS_ATTRIBUTE_COLUMNS ); DECLARE_CLASS( NTFS_ATTRIBUTE_LIST ); DECLARE_CLASS( NTFS_BITMAP ); DECLARE_CLASS( NTFS_UPCASE_TABLE );
class NTFS_FRS_STRUCTURE : public OBJECT {
public:
UNTFS_EXPORT DECLARE_CONSTRUCTOR( NTFS_FRS_STRUCTURE );
VIRTUAL UNTFS_EXPORT ~NTFS_FRS_STRUCTURE( );
NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize( IN OUT PMEM Mem, IN OUT PNTFS_ATTRIBUTE MftData, IN VCN FileNumber, IN ULONG ClusterFactor, IN BIG_INT VolumeSectors, IN ULONG FrsSize, IN PNTFS_UPCASE_TABLE UpcaseTable OPTIONAL );
UNTFS_EXPORT BOOLEAN Initialize( IN OUT PMEM Mem, IN OUT PNTFS_ATTRIBUTE MftData, IN VCN FirstFileNumber, IN ULONG FrsCount, IN ULONG ClusterFactor, IN BIG_INT VolumeSectors, IN ULONG FrsSize, IN PNTFS_UPCASE_TABLE UpcaseTable );
NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize( IN OUT PMEM Mem, IN OUT PLOG_IO_DP_DRIVE Drive, IN LCN StartOfMft, IN ULONG ClusterFactor, IN BIG_INT VolumeSectors, IN ULONG FrsSize, IN PNTFS_UPCASE_TABLE UpcaseTable DEFAULT NULL, IN ULONG Offset DEFAULT 0 );
NONVIRTUAL BOOLEAN VerifyAndFix( IN FIX_LEVEL FixLevel, IN OUT PMESSAGE Message, IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable OPTIONAL, IN OUT PBOOLEAN DiskErrorsFound DEFAULT NULL );
#if defined(LOCATE_DELETED_FILE)
NONVIRTUAL BOOLEAN LocateUnuseFrs( IN FIX_LEVEL FixLevel, IN OUT PMESSAGE Message, IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable OPTIONAL, IN OUT PBOOLEAN DiskErrorsFound DEFAULT NULL ); #endif
NONVIRTUAL BOOLEAN LoneFrsAllocationCheck( IN OUT PNTFS_BITMAP VolumeBitmap, IN OUT PNTFS_CHKDSK_REPORT ChkdskReport, IN OUT PNTFS_CHKDSK_INFO ChkdskInfo, IN FIX_LEVEL FixLevel, IN OUT PMESSAGE Message, IN OUT PBOOLEAN DiskErrorsFound DEFAULT NULL );
NONVIRTUAL BOOLEAN CheckInstanceTags( IN FIX_LEVEL FixLevel, IN BOOLEAN Verbose, IN OUT PMESSAGE Message, OUT PBOOLEAN Changes, IN OUT PNTFS_ATTRIBUTE_LIST AttributeList DEFAULT NULL );
VIRTUAL UNTFS_EXPORT BOOLEAN Read( );
UNTFS_EXPORT BOOLEAN ReadNext( IN VCN FileNumber );
UNTFS_EXPORT BOOLEAN ReadAgain( IN VCN FileNumber );
UNTFS_EXPORT BOOLEAN ReadSet( IN OUT PTLINK Link );
NONVIRTUAL UNTFS_EXPORT BOOLEAN Write( );
NONVIRTUAL UNTFS_EXPORT PVOID GetNextAttributeRecord( IN PCVOID AttributeRecord, IN OUT PMESSAGE Message DEFAULT NULL, OUT PBOOLEAN ErrorsFound DEFAULT NULL );
NONVIRTUAL VOID DeleteAttributeRecord( IN OUT PVOID AttributeRecord );
NONVIRTUAL BOOLEAN InsertAttributeRecord( IN OUT PVOID Position, IN PCVOID AttributeRecord );
NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryAttributeList( OUT PNTFS_ATTRIBUTE_LIST AttributeList );
NONVIRTUAL PVOID GetAttribute( IN ULONG TypeCode );
NONVIRTUAL PVOID GetAttributeList( );
NONVIRTUAL BOOLEAN UpdateAttributeList( IN PCNTFS_ATTRIBUTE_LIST AttributeList, IN BOOLEAN WriteList );
NONVIRTUAL UNTFS_EXPORT BOOLEAN SafeQueryAttribute( IN ATTRIBUTE_TYPE_CODE TypeCode, IN OUT PNTFS_ATTRIBUTE MftData, OUT PNTFS_ATTRIBUTE Attribute );
NONVIRTUAL MFT_SEGMENT_REFERENCE QuerySegmentReference( ) CONST;
NONVIRTUAL FILE_REFERENCE QueryBaseFileRecordSegment( ) CONST;
NONVIRTUAL BOOLEAN IsBase( ) CONST;
NONVIRTUAL BOOLEAN IsInUse( ) CONST;
NONVIRTUAL VOID ClearInUse( );
NONVIRTUAL BOOLEAN IsSystemFile( ) CONST;
NONVIRTUAL VOID SetSystemFile( );
NONVIRTUAL BOOLEAN IsViewIndexPresent( ) CONST;
NONVIRTUAL VOID SetViewIndexPresent( );
NONVIRTUAL VOID ClearViewIndexPresent( );
NONVIRTUAL BOOLEAN IsIndexPresent( ) CONST;
NONVIRTUAL VOID SetIndexPresent( );
NONVIRTUAL VOID ClearIndexPresent( );
NONVIRTUAL VCN QueryFileNumber( ) CONST;
NONVIRTUAL ULONG QueryClusterFactor( ) CONST;
NONVIRTUAL ULONG QuerySize( ) CONST;
NONVIRTUAL PLOG_IO_DP_DRIVE GetDrive( );
NONVIRTUAL VOID SetFrsData( IN VCN FileNumber, IN PFILE_RECORD_SEGMENT_HEADER frsdata );
NONVIRTUAL USHORT QueryReferenceCount( ) CONST;
NONVIRTUAL VOID SetReferenceCount( IN USHORT ReferenceCount );
NONVIRTUAL BIG_INT QueryVolumeSectors( ) CONST;
NONVIRTUAL PNTFS_UPCASE_TABLE GetUpcaseTable( );
NONVIRTUAL VOID SetUpcaseTable( IN PNTFS_UPCASE_TABLE UpcaseTable );
NONVIRTUAL LSN QueryLsn( ) CONST;
protected:
NONVIRTUAL ULONG QueryAvailableSpace( );
PFILE_RECORD_SEGMENT_HEADER _FrsData;
private:
NONVIRTUAL BOOLEAN Sort( OUT PBOOLEAN Changes, OUT PBOOLEAN Duplicates );
NONVIRTUAL VOID Construct( );
NONVIRTUAL VOID Destroy( );
PSECRUN _secrun; PNTFS_ATTRIBUTE _mftdata;
PNTFS_UPCASE_TABLE _upcase_table;
VCN _file_number; VCN _first_file_number; ULONG _frs_count; BOOLEAN _frs_state; BOOLEAN _read_status; ULONG _cluster_factor; ULONG _size; PLOG_IO_DP_DRIVE _drive; BIG_INT _volume_sectors; UCHAR _usa_check;
};
INLINE MFT_SEGMENT_REFERENCE NTFS_FRS_STRUCTURE::QuerySegmentReference( ) CONST /*++
Routine Description:
This routine computes the segment reference value for this FRS.
Arguments:
None.
Return Value:
The segment reference value for this FRS.
--*/ { MFT_SEGMENT_REFERENCE SegmentReference;
DebugAssert( _FrsData );
SegmentReference.LowPart = _file_number.GetLowPart(); SegmentReference.HighPart = (USHORT) _file_number.GetHighPart(); SegmentReference.SequenceNumber = _FrsData->SequenceNumber;
return SegmentReference; }
INLINE FILE_REFERENCE NTFS_FRS_STRUCTURE::QueryBaseFileRecordSegment( ) CONST /*++
Routine Description:
This field contains a pointer to the base file record segment for this file record segment.
Arguments:
None.
Return Value:
A FILE_REFERENCE to the base file record segment for this file record segment.
--*/ { DebugAssert( _FrsData );
return _FrsData->BaseFileRecordSegment; }
INLINE BOOLEAN NTFS_FRS_STRUCTURE::IsBase( ) CONST /*++
Routine Description:
This method determines whether this File Record Segment is the Base File Record Segment for its file.
Arguments:
None.
Return Value:
TRUE if this is a Base File Record Segment; FALSE otherwise.
--*/ { return( _FrsData->BaseFileRecordSegment.LowPart == 0 && _FrsData->BaseFileRecordSegment.HighPart == 0 && _FrsData->BaseFileRecordSegment.SequenceNumber == 0 ); }
INLINE BOOLEAN NTFS_FRS_STRUCTURE::IsInUse( ) CONST /*++
Routine Description:
This routine computes whether or not this file record segment is in use.
Arguments:
None.
Return Value:
FALSE - This file record segment is not in use. TRUE - This file record segment is in use.
--*/ { DebugAssert( _FrsData );
return (_FrsData->Flags & FILE_RECORD_SEGMENT_IN_USE) ? TRUE : FALSE; }
INLINE VOID NTFS_FRS_STRUCTURE::ClearInUse( ) /*++
Routine Description:
This routine clears the in use bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags &= ~FILE_RECORD_SEGMENT_IN_USE; }
INLINE BOOLEAN NTFS_FRS_STRUCTURE::IsSystemFile( ) CONST /*++
Routine Description:
This routine computes whether or not this file record segment is a system file.
Arguments:
None.
Return Value:
FALSE - This file record segment is not a system file. TRUE - This file record segment is a system file.
--*/ { DebugAssert( _FrsData );
return (_FrsData->Flags & FILE_SYSTEM_FILE) ? TRUE : FALSE; }
INLINE VOID NTFS_FRS_STRUCTURE::SetSystemFile( ) /*++
Routine Description:
This routine sets the system file bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags |= FILE_SYSTEM_FILE; }
INLINE BOOLEAN NTFS_FRS_STRUCTURE::IsViewIndexPresent( ) CONST /*++
Routine Description:
This routine computes whether or not the indices of file record segment can be viewed.
Arguments:
None.
Return Value:
FALSE - The indices of this file record segment cannot be viewed. TRUE - The indices of this file record segment can be viewed.
--*/ { DebugAssert( _FrsData );
return (_FrsData->Flags & FILE_VIEW_INDEX_PRESENT) ? TRUE : FALSE; }
INLINE VOID NTFS_FRS_STRUCTURE::SetViewIndexPresent( ) /*++
Routine Description:
This routine sets the view index present bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags |= FILE_VIEW_INDEX_PRESENT; }
INLINE VOID NTFS_FRS_STRUCTURE::ClearViewIndexPresent( ) /*++
Routine Description:
This routine clears the view index present bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags &= ~FILE_VIEW_INDEX_PRESENT; }
INLINE BOOLEAN NTFS_FRS_STRUCTURE::IsIndexPresent( ) CONST /*++
Routine Description:
This routine computes whether or not this file record segment's FILE_NAME_INDEX_PRESENT flag is set.
Arguments:
None.
Return Value:
FALSE - This file record segment's FILE_NAME_INDEX_PRESENT is NOT set. TRUE - This file record segment's FILE_NAME_INDEX_PRESENT is set.
--*/ { DebugAssert( _FrsData );
return (_FrsData->Flags & FILE_FILE_NAME_INDEX_PRESENT) ? TRUE : FALSE; }
INLINE VOID NTFS_FRS_STRUCTURE::ClearIndexPresent( ) /*++
Routine Description:
This routine clears the index present bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags &= ~FILE_FILE_NAME_INDEX_PRESENT; }
INLINE VOID NTFS_FRS_STRUCTURE::SetIndexPresent( ) /*++
Routine Description:
This routine sets the index present bit on this file record segment.
Arguments:
None.
Return Value:
None.
--*/ { DebugAssert( _FrsData );
_FrsData->Flags |= FILE_FILE_NAME_INDEX_PRESENT; }
INLINE ULONG NTFS_FRS_STRUCTURE::QuerySize( ) CONST /*++
Routine Description:
This routine computes the number of bytes in this file record segment.
Arguments:
None.
Return Value:
The number of bytes in this file record segment.
--*/ { return _size; }
INLINE VCN NTFS_FRS_STRUCTURE::QueryFileNumber( ) CONST /*++
Routine Description:
This method returns the File Number of the File Record Segment.
Arguments:
None.
Return Value:
the File Number (i.e. ordinal number within the MFT) of this File Record Segment.
--*/ { return _file_number; }
INLINE ULONG NTFS_FRS_STRUCTURE::QueryClusterFactor( ) CONST /*++
Routine Description:
This method returns the cluster factor.
Arguments:
None.
Return Value:
The cluster factor with which this File Record Segment was initialized.
--*/ { return _cluster_factor; }
INLINE PLOG_IO_DP_DRIVE NTFS_FRS_STRUCTURE::GetDrive( ) /*++
Routine Description:
This method returns the drive on which the File Record Segment resides. This functionality enables clients to initialize other File Record Segments on the same drive.
Arguments:
None.
Return Value:
The drive on which the File Record Segment resides.
--*/ { return _drive; }
INLINE USHORT NTFS_FRS_STRUCTURE::QueryReferenceCount( ) CONST /*++
Routine Description:
This routine returns the value of the reference count field in this frs.
Arguments:
None.
Return Value:
The value of the reference count field in this frs.
--*/ { return _FrsData->ReferenceCount; }
INLINE VOID NTFS_FRS_STRUCTURE::SetReferenceCount( IN USHORT ReferenceCount ) /*++
Routine Description:
This routine sets the value of the reference count field in this frs.
Arguments:
ReferenceCount - Supplies the new reference count.
Return Value:
None.
--*/ { _FrsData->ReferenceCount = ReferenceCount; }
INLINE BIG_INT NTFS_FRS_STRUCTURE::QueryVolumeSectors( ) CONST /*++
Routine Description:
This routine returns the number of sectors on the volume as recorded in the boot sector.
Arguments:
None.
Return Value:
The number of volume sectors.
--*/ { return _volume_sectors; }
INLINE PNTFS_UPCASE_TABLE NTFS_FRS_STRUCTURE::GetUpcaseTable( ) /*++
Routine Description:
This method fetches the upcase table for the volume on which this FRS resides.
Arguments:
None.
Return Value:
The volume upcase table.
--*/ { return _upcase_table; }
INLINE VOID NTFS_FRS_STRUCTURE::SetUpcaseTable( IN PNTFS_UPCASE_TABLE UpcaseTable ) /*++
Routine Description:
This method sets the upcase table for the volume on which this FRS resides.
Arguments:
UpcaseTable -- Supplies the volume upcase table.
Return Value:
None.
--*/ { _upcase_table = UpcaseTable; }
INLINE LSN NTFS_FRS_STRUCTURE::QueryLsn( ) CONST /*++
Routine Description:
This routine returns the logical sequence number for this file record segment.
Arguments:
None.
Return Value:
The logical sequence number for this file record segment.
--*/ { DebugAssert( _FrsData );
return _FrsData->Lsn; }
#endif // _NTFS_FRS_STRUCTURE_DEFN_
|