/*++ Copyright (c) 1991 Microsoft Corporation Module Name: extents.hxx Abstract: This module contains the declarations for NTFS_EXTENT_LIST, which models a set of NTFS extents. An extent is a contiguous run of clusters; a non-resident attribute's value is made up of a list of extents. The NTFS_EXTENT_LIST object can be used to describe the disk space allocated to a non-resident attribute. This class also encapsulates the knowledge of mapping pairs and their compression, i.e. of the representation of extent lists in attribute records. Author: Bill McJohn (billmc) 17-June-91 Matthew Bradburn (mattbr) 19-August-95 Changed to use NTFS MCB package. Environment: ULIB, User Mode --*/ #if !defined( _NTFS_EXTENT_LIST_DEFN_ ) #define _NTFS_EXTENT_LIST_DEFN_ DECLARE_CLASS( NTFS_BITMAP ); DECLARE_CLASS( NTFS_EXTENT_LIST ); DECLARE_CLASS( NTFS_EXTENT ); typedef struct _MAPPING_PAIR { VCN NextVcn; LCN CurrentLcn; }; DEFINE_TYPE( _MAPPING_PAIR, MAPPING_PAIR ); class NTFS_EXTENT : public OBJECT { public: DECLARE_CONSTRUCTOR( NTFS_EXTENT ); VCN Vcn; LCN Lcn; BIG_INT RunLength; }; class NTFS_EXTENT_LIST : public OBJECT { public: UNTFS_EXPORT DECLARE_CONSTRUCTOR( NTFS_EXTENT_LIST ); VIRTUAL UNTFS_EXPORT ~NTFS_EXTENT_LIST( ); NONVIRTUAL UNTFS_EXPORT BOOLEAN Initialize( IN VCN LowestVcn, IN VCN NextVcn ); NONVIRTUAL BOOLEAN Initialize( IN VCN StartingVcn, IN PCVOID CompressedMappingPairs, IN ULONG MappingPairsMaximumLength, OUT PBOOLEAN BadMappingPairs DEFAULT NULL ); NONVIRTUAL BOOLEAN Initialize( IN PCNTFS_EXTENT_LIST ExtentsToCopy ); FRIEND BOOLEAN Initialize( IN PCNTFS_EXTENT_LIST ExtentsToCopy ); NONVIRTUAL BOOLEAN IsEmpty( ) CONST; NONVIRTUAL BOOLEAN IsSparse( ) CONST; NONVIRTUAL UNTFS_EXPORT ULONG QueryNumberOfExtents( ) CONST; NONVIRTUAL UNTFS_EXPORT BOOLEAN AddExtent( IN VCN Vcn, IN LCN Lcn, IN BIG_INT RunLength ); NONVIRTUAL BOOLEAN AddExtents( IN VCN StartingVcn, IN PCVOID CompressedMappingPairs, IN ULONG MappingPairsMaximumLength, OUT PBOOLEAN BadMappingPairs DEFAULT NULL ); NONVIRTUAL VOID DeleteExtent( IN ULONG ExtentNumber ); NONVIRTUAL BOOLEAN Resize( IN BIG_INT NewSize, IN OUT PNTFS_BITMAP Bitmap ); NONVIRTUAL BOOLEAN SetSparse( IN BIG_INT NewSize ); NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryExtent( IN ULONG ExtentNumber, OUT PVCN Vcn, OUT PLCN Lcn, OUT PBIG_INT RunLength ) CONST; NONVIRTUAL UNTFS_EXPORT BOOLEAN QueryLcnFromVcn( IN VCN Vcn, OUT PLCN Lcn, OUT PBIG_INT RunLength DEFAULT NULL ) CONST; NONVIRTUAL BOOLEAN QueryCompressedMappingPairs( OUT PVCN LowestVcn, OUT PVCN NextVcn, OUT PULONG MappingPairsLength, IN ULONG BufferSize, IN OUT PVOID Buffer, OUT PBOOLEAN HasHoleInFront DEFAULT NULL ) CONST; NONVIRTUAL VCN QueryLowestVcn( ) CONST; NONVIRTUAL VCN QueryNextVcn( ) CONST; NONVIRTUAL VOID SetLowestVcn( IN BIG_INT LowestVcn ); NONVIRTUAL VOID SetNextVcn( IN BIG_INT NextVcn ); NONVIRTUAL BIG_INT QueryClustersAllocated( ) CONST; NONVIRTUAL BOOLEAN DeleteRange( IN VCN Vcn, IN BIG_INT RunLength ); private: NONVIRTUAL VOID Construct ( ); NONVIRTUAL VOID Destroy( ); NONVIRTUAL LCN QueryLastLcn( ) CONST; NONVIRTUAL VOID Truncate( IN BIG_INT NewNumberOfClusters, IN OUT PNTFS_BITMAP Bitmap ); NONVIRTUAL VOID Coalesce( ); STATIC BOOLEAN QueryMappingPairsLength( IN PCVOID CompressedPairs, IN ULONG MaximumLength, OUT PULONG Length, OUT PULONG NumberOfPairs ); STATIC BOOLEAN ExpandMappingPairs( IN PCVOID CompressedPairs, IN VCN StartingVcn, IN ULONG MaximumCompressedLength, IN ULONG MaximumNumberOfPairs, IN OUT PMAPPING_PAIR MappingPairs, OUT PULONG NumberOfPairs ); STATIC BOOLEAN CompressMappingPairs( IN PCMAPPING_PAIR MappingPairs, IN ULONG NumberOfPairs, IN VCN StartingVcn, IN OUT PVOID CompressedPairs, IN ULONG MaximumCompressedLength, OUT PULONG CompressedLength ); struct _LARGE_MCB* _Mcb; BOOLEAN _McbInitialized; VCN _LowestVcn; VCN _NextVcn; }; INLINE BOOLEAN NTFS_EXTENT_LIST::IsEmpty( ) CONST /*++ Routine Description: This method determines whether the extent list is empty. Arguments: None. Return Value: TRUE if there are no extents in the list. --*/ { return ( _LowestVcn == _NextVcn ); } INLINE VCN NTFS_EXTENT_LIST::QueryLowestVcn( ) CONST /*++ Routine Description: This method returns the lowest VCN covered by this extent list. Note that for a sparse file, this is not necessarily the same as the VCN of the first extent in the list. Arguments: None. Return Value: The lowest VCN mapped by this extent list. --*/ { return _LowestVcn; } INLINE LCN NTFS_EXTENT_LIST::QueryNextVcn( ) CONST /*++ Routine Description: This method returns the highest VCN covered by this extent list. Note that for a sparse file, this is not necessarily the same as the last VCN of the last extent in the list. Arguments: None. Return Value: The highest VCN mapped by this extent list. --*/ { return _NextVcn; } #endif // _NTFS_EXTENT_LIST_DEFN_