windows-nt/Source/XPSP1/NT/base/fs/utils/untfs/inc/frs.hxx

790 lines
20 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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