790 lines
20 KiB
C++
790 lines
20 KiB
C++
|
/*++
|
|||
|
|
|||
|
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
|