368 lines
7.4 KiB
C++
368 lines
7.4 KiB
C++
|
/*++
|
|||
|
|
|||
|
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_
|