1066 lines
20 KiB
C++
1066 lines
20 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
attrib.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the declarations for NTFS_ATTRIBUTE,
|
|||
|
which models an NTFS attribute instance.
|
|||
|
|
|||
|
An attribute instance models the user's view of an attribute,
|
|||
|
as a [type, name, value] triple. (The name is optional.) It
|
|||
|
does not correspond to any specific disk structure.
|
|||
|
|
|||
|
An attribute instance may exist in:
|
|||
|
|
|||
|
1) a single resident attribute record,
|
|||
|
|
|||
|
2) a single non-resident attribute record, or
|
|||
|
|
|||
|
3) multiple, non-overlapping non-resident attribute records.
|
|||
|
|
|||
|
Case (3) is rare, so we don't need to optimize for it, but we
|
|||
|
do need to handle it.
|
|||
|
|
|||
|
|
|||
|
The client may initialize an Attribute object by supplying the
|
|||
|
value directly [resident]; by supplying a description of the
|
|||
|
value's location on disk [non-resident]; or by supplying an
|
|||
|
attribute record or list of attribute records for the attribute.
|
|||
|
|
|||
|
|
|||
|
On disk, an attribute may be resident (with the data contained
|
|||
|
in the attribute record) or it may be nonresident (with the
|
|||
|
data residing on disk, outside the File Record Segment). This
|
|||
|
is reflected in the attribute object by having the value stored
|
|||
|
directly (in space allocated by the attribute object and copied
|
|||
|
at initialization) or stored on disk (with the attribute object
|
|||
|
keeping an Extent List which describes this disk storage). I
|
|||
|
chose not to reflect this difference with different classes for
|
|||
|
three reasons: first, an attribute may wish to transform itself
|
|||
|
from one form to another; second, this would introduce many
|
|||
|
virtual methods; and third, I want to have special attribute
|
|||
|
classes derive from the attribute class, and dividing attributes
|
|||
|
into resident and nonresident would force me to use multiple
|
|||
|
inheritance.
|
|||
|
|
|||
|
Generally, the difference between resident and nonresident
|
|||
|
attributes is not visible to clients of this class. The
|
|||
|
most important exception is GetResidentValue; this method
|
|||
|
is provided for performance reasons--Read will supply the
|
|||
|
same effect, but requires copying the data.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bill McJohn (billmc) 19-June-91
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
ULIB, User Mode
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#if !defined( _NTFS_ATTRIBUTE_DEFN_ )
|
|||
|
|
|||
|
#define _NTFS_ATTRIBUTE_DEFN_
|
|||
|
|
|||
|
#include "extents.hxx"
|
|||
|
#include "wstring.hxx"
|
|||
|
#include "drive.hxx"
|
|||
|
|
|||
|
DECLARE_CLASS( LOG_IO_DP_DRIVE );
|
|||
|
DECLARE_CLASS( NTFS_FILE_RECORD_SEGMENT );
|
|||
|
DECLARE_CLASS( NTFS_EXTENT_LIST );
|
|||
|
DECLARE_CLASS( NTFS_ATTRIBUTE_RECORD );
|
|||
|
DECLARE_CLASS( NTFS_ATTRIBUTE_RECORD_LIST );
|
|||
|
DECLARE_CLASS( NTFS_BITMAP );
|
|||
|
DECLARE_CLASS( NTFS_ATTRIBUTE );
|
|||
|
DECLARE_CLASS( NTFS_BAD_CLUSTER_FILE );
|
|||
|
DECLARE_CLASS( NUMBER_SET );
|
|||
|
DECLARE_CLASS( NTFS_ATTRIBUTE );
|
|||
|
|
|||
|
class NTFS_ATTRIBUTE : public OBJECT {
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
UNTFS_EXPORT
|
|||
|
DECLARE_CONSTRUCTOR( NTFS_ATTRIBUTE );
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
~NTFS_ATTRIBUTE (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
Initialize (
|
|||
|
IN OUT PLOG_IO_DP_DRIVE Drive,
|
|||
|
IN ULONG ClusterFactor,
|
|||
|
IN PCVOID Value,
|
|||
|
IN ULONG ValueLength,
|
|||
|
IN ATTRIBUTE_TYPE_CODE TypeCode,
|
|||
|
IN PCWSTRING Name DEFAULT NULL,
|
|||
|
IN USHORT Flags DEFAULT 0
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
Initialize (
|
|||
|
IN OUT PLOG_IO_DP_DRIVE Drive,
|
|||
|
IN ULONG ClusterFactor,
|
|||
|
IN PCNTFS_EXTENT_LIST Extents,
|
|||
|
IN BIG_INT ValueLength,
|
|||
|
IN BIG_INT ValidLength,
|
|||
|
IN ATTRIBUTE_TYPE_CODE TypeCode,
|
|||
|
IN PCWSTRING Name DEFAULT NULL,
|
|||
|
IN USHORT Flags DEFAULT 0
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Initialize (
|
|||
|
IN OUT PLOG_IO_DP_DRIVE Drive,
|
|||
|
IN ULONG ClusterFactor,
|
|||
|
IN PCNTFS_ATTRIBUTE_RECORD AttributeRecord
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
AddAttributeRecord (
|
|||
|
IN PCNTFS_ATTRIBUTE_RECORD AttributeRecord,
|
|||
|
IN OUT PNTFS_EXTENT_LIST *BackupExtent
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
VerifyAndFix(
|
|||
|
IN BIG_INT VolumeSectors
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ATTRIBUTE_TYPE_CODE
|
|||
|
QueryTypeCode (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCWSTRING
|
|||
|
GetName (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
QueryValueLength (
|
|||
|
OUT PBIG_INT ValueLength,
|
|||
|
OUT PBIG_INT AllocatedLength DEFAULT NULL,
|
|||
|
OUT PBIG_INT ValidLength DEFAULT NULL
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BIG_INT
|
|||
|
QueryValueLength(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BIG_INT
|
|||
|
QueryValidDataLength(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BIG_INT
|
|||
|
QueryAllocatedLength(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BIG_INT
|
|||
|
QueryClustersAllocated(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsResident (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsIndexed (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetIsIndexed(
|
|||
|
IN BOOLEAN State DEFAULT TRUE
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCVOID
|
|||
|
GetResidentValue (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
QueryLcnFromVcn (
|
|||
|
IN VCN Vcn,
|
|||
|
OUT PLCN Lcn,
|
|||
|
OUT PBIG_INT RunLength DEFAULT NULL
|
|||
|
) CONST;
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
InsertIntoFile (
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT BaseFileRecordSegment,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
MakeNonresident (
|
|||
|
IN OUT PNTFS_BITMAP Bitmap
|
|||
|
);
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
Resize (
|
|||
|
IN BIG_INT NewSize,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
SetSparse (
|
|||
|
IN BIG_INT NewSize,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
AddExtent (
|
|||
|
IN VCN Vcn,
|
|||
|
IN LCN Lcn,
|
|||
|
IN BIG_INT RunLength
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
Read (
|
|||
|
OUT PVOID Data,
|
|||
|
IN BIG_INT ByteOffset,
|
|||
|
IN ULONG BytesToRead,
|
|||
|
OUT PULONG BytesRead
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
PrimeCache (
|
|||
|
IN BIG_INT ByteOffset,
|
|||
|
IN ULONG BytesToRead
|
|||
|
);
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
UNTFS_EXPORT
|
|||
|
BOOLEAN
|
|||
|
Write (
|
|||
|
IN PCVOID Data,
|
|||
|
IN BIG_INT ByteOffset,
|
|||
|
IN ULONG BytesToWrite,
|
|||
|
OUT PULONG BytesWritten,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Fill (
|
|||
|
IN BIG_INT Offset,
|
|||
|
IN CHAR FillCharacter
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Fill (
|
|||
|
IN BIG_INT Offset,
|
|||
|
IN CHAR FillCharacter,
|
|||
|
IN ULONG NumberOfBytes
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsStorageModified (
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PLOG_IO_DP_DRIVE
|
|||
|
GetDrive(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
RecoverAttribute(
|
|||
|
IN OUT PNTFS_BITMAP VolumeBitmap,
|
|||
|
IN OUT PNUMBER_SET BadClusters,
|
|||
|
OUT PBIG_INT BytesRecovered DEFAULT NULL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
USHORT
|
|||
|
QueryFlags(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetFlags(
|
|||
|
IN USHORT Flags
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
UCHAR
|
|||
|
QueryResidentFlags(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
MarkAsAllocated(
|
|||
|
IN OUT PNTFS_BITMAP VolumeBitmap
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ULONG
|
|||
|
QueryCompressionUnit(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsCompressed(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsSparse(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Hotfix(
|
|||
|
IN VCN Vcn,
|
|||
|
IN BIG_INT RunLength,
|
|||
|
IN OUT PNTFS_BITMAP VolumeBitmap,
|
|||
|
IN OUT PNUMBER_SET BadClusters,
|
|||
|
IN BOOLEAN Contiguous DEFAULT FALSE
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ReplaceVcns(
|
|||
|
IN VCN StartingVcn,
|
|||
|
IN LCN NewLcn,
|
|||
|
IN BIG_INT NumberOfClusters
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCNTFS_EXTENT_LIST
|
|||
|
GetExtentList(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsAllocationZeroed(
|
|||
|
OUT PBOOLEAN Error DEFAULT NULL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
GetNextAllocationOffset(
|
|||
|
IN OUT PBIG_INT ByteOffset,
|
|||
|
IN OUT PBIG_INT Length
|
|||
|
);
|
|||
|
|
|||
|
FRIEND
|
|||
|
BOOLEAN
|
|||
|
operator==(
|
|||
|
IN RCNTFS_ATTRIBUTE Left,
|
|||
|
IN RCNTFS_ATTRIBUTE Right
|
|||
|
);
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetStorageModified (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
ResetStorageModified (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ULONG
|
|||
|
QueryClusterFactor(
|
|||
|
) CONST;
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Construct (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Destroy (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
InsertMftDataIntoFile (
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT BaseFileRecordSegment,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap OPTIONAL,
|
|||
|
IN BOOLEAN BeConservative
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ReadCompressed (
|
|||
|
OUT PVOID Data,
|
|||
|
IN BIG_INT ByteOffset,
|
|||
|
IN ULONG BytesToRead,
|
|||
|
OUT PULONG BytesRead
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
WriteCompressed (
|
|||
|
IN PCVOID Data,
|
|||
|
IN BIG_INT ByteOffset,
|
|||
|
IN ULONG BytesToWrite,
|
|||
|
OUT PULONG BytesWritten,
|
|||
|
IN OUT PNTFS_BITMAP Bitmap OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
RecoverCompressedAttribute(
|
|||
|
IN OUT PNTFS_BITMAP VolumeBitmap,
|
|||
|
IN OUT PNUMBER_SET BadClusters,
|
|||
|
OUT PBIG_INT BytesRecovered DEFAULT NULL
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
PLOG_IO_DP_DRIVE _Drive;
|
|||
|
ULONG _ClusterFactor;
|
|||
|
|
|||
|
ATTRIBUTE_TYPE_CODE _Type;
|
|||
|
DSTRING _Name;
|
|||
|
USHORT _Flags;
|
|||
|
UCHAR _FormCode;
|
|||
|
UCHAR _CompressionUnit;
|
|||
|
|
|||
|
BIG_INT _ValueLength;
|
|||
|
BIG_INT _ValidDataLength;
|
|||
|
|
|||
|
PVOID _ResidentData;
|
|||
|
PNTFS_EXTENT_LIST _ExtentList;
|
|||
|
|
|||
|
UCHAR _ResidentFlags;
|
|||
|
|
|||
|
BOOLEAN _StorageModified;
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::IsResident(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method returns whether the attribute value is resident.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if the value is resident; FALSE if it is non-resident.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return( _ResidentData != NULL );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BIG_INT
|
|||
|
NTFS_ATTRIBUTE::QueryValueLength(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns the length of the attribute value in bytes.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The length of the attribute value in bytes.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ValueLength;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BIG_INT
|
|||
|
NTFS_ATTRIBUTE::QueryValidDataLength(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns the valid data length.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The valid data length.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ValidDataLength;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BIG_INT
|
|||
|
NTFS_ATTRIBUTE::QueryAllocatedLength(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine return the number of bytes allocated for this attribute
|
|||
|
on disk.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The amount of disk space allocated for this attribute.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
BIG_INT Result;
|
|||
|
|
|||
|
if( IsResident() ) {
|
|||
|
|
|||
|
Result = QuadAlign( _ValueLength.GetLowPart() );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
Result = (_ExtentList->QueryNextVcn()*_ClusterFactor*
|
|||
|
_Drive->QuerySectorSize());
|
|||
|
}
|
|||
|
|
|||
|
return Result;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
ATTRIBUTE_TYPE_CODE
|
|||
|
NTFS_ATTRIBUTE::QueryTypeCode(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the attribute's type code.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The attribute's type code.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _Type;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCWSTRING
|
|||
|
NTFS_ATTRIBUTE::GetName(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the attribute's name. (Note that this returns a pointer
|
|||
|
to the attribute's private copy of its name.)
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
A pointer to the attribute's name, if it has one; NULL if it
|
|||
|
has none.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return &_Name;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
NTFS_ATTRIBUTE::QueryValueLength(
|
|||
|
OUT PBIG_INT ValueLength,
|
|||
|
OUT PBIG_INT AllocatedLength,
|
|||
|
OUT PBIG_INT ValidLength
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the attribute's value lengths (actual, allocated
|
|||
|
and valid length).
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ValueLength -- receives the attribute value's length
|
|||
|
AllocatedLength -- receives the attribute value's allocated length
|
|||
|
(ignored if NULL)
|
|||
|
ValidLength -- receives the attribute value's valid length
|
|||
|
(ignored if NULL );
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
*ValueLength = _ValueLength;
|
|||
|
|
|||
|
if( AllocatedLength != NULL ) {
|
|||
|
|
|||
|
*AllocatedLength = QueryAllocatedLength();
|
|||
|
}
|
|||
|
|
|||
|
if( ValidLength != NULL ) {
|
|||
|
|
|||
|
*ValidLength = _ValidDataLength;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::IsIndexed(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method returns whether the attribute is indexed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if the attribute is indexed; FALSE if not.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return( (_ResidentData == NULL) ?
|
|||
|
FALSE :
|
|||
|
_ResidentFlags & RESIDENT_FORM_INDEXED );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
NTFS_ATTRIBUTE::SetIsIndexed(
|
|||
|
IN BOOLEAN State
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method marks the attribute as indexed. It has no effect if
|
|||
|
the attribute is nonresident.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
State -- supplies a value indicating whether the attribute
|
|||
|
is indexed (TRUE) or not indexed (FALSE).
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
if( _ResidentData != NULL ) {
|
|||
|
|
|||
|
if( State ) {
|
|||
|
|
|||
|
_ResidentFlags |= RESIDENT_FORM_INDEXED;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
_ResidentFlags &= ~RESIDENT_FORM_INDEXED;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCVOID
|
|||
|
NTFS_ATTRIBUTE::GetResidentValue(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns a pointer to the attribute's value.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
If the attribute value is resident, returns a pointer to the
|
|||
|
value. If it is nonresident, returns NULL.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
This method is provided for clients who know that the value is
|
|||
|
resident and who want to inspect it without copying it; if the
|
|||
|
client doesn't know whether the value is resident, Read is
|
|||
|
a better way to get it.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ResidentData;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::QueryLcnFromVcn (
|
|||
|
IN VCN Vcn,
|
|||
|
OUT PLCN Lcn,
|
|||
|
OUT PBIG_INT RunLength
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method converts a VCN within the attribute into an LCN.
|
|||
|
(Note that it only applies to nonresident attributes.)
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Vcn -- Supplies the VCN to be converted.
|
|||
|
Lcn -- Receives the corresponding LCN.
|
|||
|
RunLength -- Receives the remaining length in the current run
|
|||
|
starting at this LCN.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE upon successful completion.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
if( _ExtentList == NULL ) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
return _ExtentList->QueryLcnFromVcn( Vcn, Lcn, RunLength );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::IsStorageModified(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Query whether the attribute's storage (i.e. anything that
|
|||
|
would go into an attribute record) has changed
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Returns TRUE if the attribute's storage has been modified since
|
|||
|
the last time we got it from or put it into a File Record Segment.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _StorageModified;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
NTFS_ATTRIBUTE::SetStorageModified (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine sets the 'IsStorageModified' flag.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
_StorageModified = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
NTFS_ATTRIBUTE::ResetStorageModified (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine resets the 'IsStorageModified' flag.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
_StorageModified = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PLOG_IO_DP_DRIVE
|
|||
|
NTFS_ATTRIBUTE::GetDrive(
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method returns the drive on which the Attribute resides.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The drive on which the Attribute resides.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _Drive;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
USHORT
|
|||
|
NTFS_ATTRIBUTE::QueryFlags(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns this attribute's flags.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
This attribute's flags.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _Flags;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
NTFS_ATTRIBUTE::SetFlags(
|
|||
|
IN USHORT Flags
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns this attribute's flags.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
This attribute's flags.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
_Flags = Flags;
|
|||
|
SetStorageModified();
|
|||
|
}
|
|||
|
|
|||
|
INLINE
|
|||
|
UCHAR
|
|||
|
NTFS_ATTRIBUTE::QueryResidentFlags(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns this attribute's resident flags.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
This attribute's resident flags.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ResidentFlags;
|
|||
|
}
|
|||
|
|
|||
|
INLINE
|
|||
|
ULONG
|
|||
|
NTFS_ATTRIBUTE::QueryCompressionUnit(
|
|||
|
) CONST
|
|||
|
{
|
|||
|
return _CompressionUnit;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::IsCompressed(
|
|||
|
) CONST
|
|||
|
{
|
|||
|
return ((_Flags & ATTRIBUTE_FLAG_COMPRESSION_MASK) != 0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
NTFS_ATTRIBUTE::IsSparse(
|
|||
|
) CONST
|
|||
|
{
|
|||
|
return ((_Flags & ATTRIBUTE_FLAG_SPARSE) != 0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
ULONG
|
|||
|
NTFS_ATTRIBUTE::QueryClusterFactor(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This method returns the cluster factor.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The cluster factor.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ClusterFactor;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCNTFS_EXTENT_LIST
|
|||
|
NTFS_ATTRIBUTE::GetExtentList(
|
|||
|
) CONST
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns a pointer to this object's extent list.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
A pointer to the extent list.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return _ExtentList;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif
|