Unit NTFSClass

From Ultibo.org
Revision as of 03:44, 17 March 2017 by Ultibo (Talk | contribs)

Jump to: navigation, search

Return to Unit Reference


Description


Ultibo NTFS classes unit

To be documented

Constants


None defined

Type definitions



NTFS compare security descriptor

TNTFSCompareSecurityDescriptor = function(ASecurityId:LongWord; ADescriptor:Pointer; ASize:Word):Boolean of Object;


Class definitions



NTFS disk table

TNTFSDiskTable = class(TDiskTable)

Note: Respresents the $Mft and $MftMirr
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FStartSector:Int64; Absolute starting sector of this table
FStartCluster:Int64; Absolute starting cluster of this table
 
FEntry:TNTFSDiskEntry;  
public
property StartSector:Int64 read FStartSector write FStartSector;  
property StartCluster:Int64 read FStartCluster write FStartCluster;  
 
property Entry:TNTFSDiskEntry read FEntry write FEntry;  

NTFS disk block

TNTFSDiskBlock = class(TDiskBlock)

Note: Represents a block of $Bitmap entries
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FBlockCount:LongWord; Number of cluster entries in this block (Bits in the bitmap)
FBlockBuffer:Pointer;  
FBlockCluster:Int64; First cluster represented by this block (BlockNo represents the VCN of the block)
public
property BlockCount:LongWord read FBlockCount write FBlockCount;  
property BlockBuffer:Pointer read FBlockBuffer write FBlockBuffer;  
property BlockCluster:Int64 read FBlockCluster write FBlockCluster;  

NTFS disk entry

TNTFSDiskEntry = class(TDiskEntry)

Note: Represents a file entry.
 
constructor Create(ALocalLock:TMutexHandle; AOrigin:TNTFSDiskRecord; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
FPrevEntry:TNTFSDiskEntry;  
FNextEntry:TNTFSDiskEntry;  
 
FUsed:Int64; Used size of the file
FAllocated:Int64; Allocated size of file
FChangeTime:TFileTime; MFT record change time
 
FOrigin:TNTFSDiskRecord; Entry origin record
FAttribute:TNTFSDiskAttribute; Entry naming attribute
FAlternate:TNTFSDiskAttribute; Alternate name attribute
 
procedure SetOrigin(AOrigin:TNTFSDiskRecord);  
public
property LocalLock:TMutexHandle read FLocalLock write FLocalLock;  
 
property PrevEntry:TNTFSDiskEntry read FPrevEntry write FPrevEntry;  
property NextEntry:TNTFSDiskEntry read FNextEntry write FNextEntry;  
 
property Used:Int64 read FUsed write FUsed;  
property Allocated:Int64 read FAllocated write FAllocated;  
property ChangeTime:TFileTime read FChangeTime write FChangeTime;  
 
property Origin:TNTFSDiskRecord read FOrigin write SetOrigin;  
property Attribute:TNTFSDiskAttribute read FAttribute write FAttribute;  
property Alternate:TNTFSDiskAttribute read FAlternate write FAlternate;  
 
function GetDot:TNTFSDiskEntry;  
function GetDotDot:TNTFSDiskEntry;  
 
function CreateDot:TNTFSDiskEntry;  
function CreateDotDot:TNTFSDiskEntry;  
 
function UpdateDot:Boolean;  
function UpdateDotDot(AEntry:TNTFSDiskEntry):Boolean;  
 
function RecordNumber:Int64;  
function FileReference:Int64;  
 
function UpdateEntry:Boolean;  
function UpdateRecord:Boolean;  
 
function FindFirstName(AHandle:TFindHandle; AReference:Boolean):TDiskEntry; override;  
function FindPrevName(AHandle:TFindHandle; AReference:Boolean):TDiskEntry; override;  
function FindNextName(AHandle:TFindHandle; AReference:Boolean):TDiskEntry; override;  
function FindLastName(AHandle:TFindHandle; AReference:Boolean):TDiskEntry; override;  

NTFS disk access contol list

TNTFSDiskAcl = class(TDiskAcl)

Note: Data of attribute $SECURITY_DESCRIPTOR
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
 
public
 

NTFS disk access control entry

TNTFSDiskAce = class(TDiskAce)

Note: Data of attribute $SECURITY_DESCRIPTOR
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
 
public
 

NTFS entry list

TNTFSEntryList = class(TObject)

constructor Create;  
destructor Destroy; override;  
private
FEntryCount:Integer;  
FFirstEntry:TNTFSDiskEntry;  
FLastEntry:TNTFSDiskEntry;  
 
function Link(AEntry:TNTFSDiskEntry):Boolean;  
function Unlink(AEntry:TNTFSDiskEntry):Boolean;  
public
property EntryCount:Integer read FEntryCount;  
property FirstEntry:TNTFSDiskEntry read FFirstEntry;  
property LastEntry:TNTFSDiskEntry read FLastEntry;  
 
function Add(AEntry:TNTFSDiskEntry):Boolean;  
function Remove(AEntry:TNTFSDiskEntry):Boolean;  
 
procedure ClearList; virtual;  

NTFS record list

TNTFSRecordList = class(TObject)

constructor Create;  
destructor Destroy; override;  
private
FRecordCount:Integer;  
FFirstRecord:TNTFSDiskRecord;  
FLastRecord:TNTFSDiskRecord;  
 
function Link(ARecord:TNTFSDiskRecord):Boolean;  
function Unlink(ARecord:TNTFSDiskRecord):Boolean;  
public
property RecordCount:Integer read FRecordCount;  
property FirstRecord:TNTFSDiskRecord read FFirstRecord;  
property LastRecord:TNTFSDiskRecord read FLastRecord;  
 
function Add(ARecord:TNTFSDiskRecord):Boolean;  
function Remove(ARecord:TNTFSDiskRecord):Boolean;  
 
procedure ClearList; virtual;  

NTFS record index

TNTFSRecordIndex = class(TLinkedObjBtree)

Note: Index of FILE records.
 
constructor Create;  
destructor Destroy; override;  
private
FLock:TSynchronizerHandle;  
FRecordLocal:TMutexHandle;  
 
FRunsLock:TSynchronizerHandle;  
FItemsLock:TSynchronizerHandle;  
FNodesLock:TSynchronizerHandle;  
FIndexLock:TSynchronizerHandle;  
FExtendedsLock:TSynchronizerHandle;  
FAttributesLock:TSynchronizerHandle;  
 
FRunLocal:TMutexHandle;  
FItemLocal:TMutexHandle;  
FKeyLocal:TMutexHandle;  
FNodeLocal:TMutexHandle;  
FExtendedLocal:TMutexHandle;  
FAttributeLocal:TMutexHandle;  
 
function Find(const ARecordNumber:Int64; ACurrent:TNTFSDiskRecord):TNTFSDiskRecord;  
protected
function CreateBlank:TBtreeObject; override;  
 
function Compare(AEntry1,AEntry2:TBtreeObject):Integer; override;  
public
function CreateRecord(ABase:TNTFSDiskRecord; const ARecordNumber:Int64; AVersion:Word):TNTFSDiskRecord;  
function DestroyRecord(ARecord:TNTFSDiskRecord):Boolean;  
function NewRecord(ABase:TNTFSDiskRecord; const ARecordNumber:Int64; AVersion:Word):TNTFSDiskRecord;  
function InsertRecord(ARecord:TNTFSDiskRecord):Boolean;  
function DeleteRecord(ARecord:TNTFSDiskRecord):Boolean;  
function RemoveRecord(ARecord:TNTFSDiskRecord):Boolean;  
 
function FindRecord(const ARecordNumber:Int64):TNTFSDiskRecord;  
 
function ReaderLock:Boolean;  
function ReaderUnlock:Boolean;  
function ReaderConvert:Boolean;  
function WriterLock:Boolean;  
function WriterUnlock:Boolean;  
function WriterConvert:Boolean;  
 
function RunsReaderLock:Boolean;  
function RunsReaderUnlock:Boolean;  
function RunsWriterLock:Boolean;  
function RunsWriterUnlock:Boolean;  
 
function ItemsReaderLock:Boolean;  
function ItemsReaderUnlock:Boolean;  
function ItemsWriterLock:Boolean;  
function ItemsWriterUnlock:Boolean;  
 
function NodesReaderLock:Boolean;  
function NodesReaderUnlock:Boolean;  
function NodesWriterLock:Boolean;  
function NodesWriterUnlock:Boolean;  
 
function IndexReaderLock:Boolean;  
function IndexReaderUnlock:Boolean;  
function IndexWriterLock:Boolean;  
function IndexWriterUnlock:Boolean;  
 
function ExtendedsReaderLock:Boolean;  
function ExtendedsReaderUnlock:Boolean;  
function ExtendedsWriterLock:Boolean;  
function ExtendedsWriterUnlock:Boolean;  
 
function AttributesReaderLock:Boolean;  
function AttributesReaderUnlock:Boolean;  
function AttributesWriterLock:Boolean;  
function AttributesWriterUnlock:Boolean;  

NTFS disk record

TNTFSDiskRecord = class(TBtreeObject)

Note: Represents a FILE record entry.
 
constructor Create(ALocalLock:TMutexHandle; ABase:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FRunsLock:TSynchronizerHandle;  
FItemsLock:TSynchronizerHandle;  
FNodesLock:TSynchronizerHandle;  
FIndexLock:TSynchronizerHandle;  
FExtendedsLock:TSynchronizerHandle;  
FAttributesLock:TSynchronizerHandle;  
 
FRunLocal:TMutexHandle;  
FItemLocal:TMutexHandle;  
FKeyLocal:TMutexHandle;  
FNodeLocal:TMutexHandle;  
FExtendedLocal:TMutexHandle;  
FAttributeLocal:TMutexHandle;  
 
FStatus:LongWord;  
 
FPrevRecord:TNTFSDiskRecord;  
FNextRecord:TNTFSDiskRecord;  
 
FRecordFlags:Word; Flags (See Consts)
FHardLinkCount:Word; Hard link count
FSequenceNumber:Word; Sequence number
FNextAttributeId:Word; Next Attribute Id
FRecordNumber:Int64; Number of this MFT Record
FRecordSize:LongWord; Actual size of the FILE record
FRecordAllocated:LongWord; Allocated size of the FILE record
 
FAttributeOffset:Word; Offset to the first Attribute
FUpdateSequenceOffset:Word; Offset to the Update Sequence Record
FUpdateSequenceLength:Word; Size in words of the Update Sequence Record
 
FUpdateSequenceNumber:Word; Update Sequence Number
FLogFileSequenceNumber:Int64; LogFile Sequence Number (LSN)
 
FBase:TNTFSDiskRecord; Base file record
FLinks:TNTFSEntryList; List of record links
FStreams:TNTFSEntryList; List of record streams
FRecords:TNTFSRecordList; List of child records
FAttributes:TNTFSDiskAttributes; List of record attributes
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetResizing:Boolean;  
procedure SetResizing(AValue:Boolean);  
function GetRemoving:Boolean;  
procedure SetRemoving(AValue:Boolean);  
 
function GetMirrored:Boolean;  
procedure SetMirrored(AValue:Boolean);  
function GetMetafile:Boolean;  
procedure SetMetafile(AValue:Boolean);  
function GetReserved:Boolean;  
procedure SetReserved(AValue:Boolean);  
function GetExpansion:Boolean;  
procedure SetExpansion(AValue:Boolean);  
 
function GetOverflow:Boolean;  
procedure SetOverflow(AValue:Boolean);  
function GetExtension:Boolean;  
procedure SetExtension(AValue:Boolean);  
 
function GetIsUsed:Boolean;  
procedure SetIsUsed(AValue:Boolean);  
function GetIsFolder:Boolean;  
procedure SetIsFolder(AValue:Boolean);  
function GetIsUnknown1:Boolean;  
procedure SetIsUnknown1(AValue:Boolean);  
function GetIsIndexView:Boolean;  
procedure SetIsIndexView(AValue:Boolean);  
 
function GetOrigin:TNTFSDiskRecord;  
 
function CreateLinks(ANew:Boolean):TNTFSEntryList;  
function CreateStreams(ANew:Boolean):TNTFSEntryList;  
function CreateRecords(ANew:Boolean):TNTFSRecordList;  
function CreateAttributes(AVersion:Word; ANew:Boolean):TNTFSDiskAttributes;  
public
property Resizing:Boolean read GetResizing write SetResizing; Record is being Resized
property Removing:Boolean read GetRemoving write SetRemoving; Record is being Removed
 
property Mirrored:Boolean read GetMirrored write SetMirrored; Record is in $MftMirr file
property Metafile:Boolean read GetMetafile write SetMetafile; Record is an NTFS metafile
property Reserved:Boolean read GetReserved write SetReserved; Record is an Mft reserved record
property Expansion:Boolean read GetExpansion write SetExpansion; Record is an Mft expansion record
 
property Overflow:Boolean read GetOverflow write SetOverflow; Record has an attribute list attribute
property Extension:Boolean read GetExtension write SetExtension; Record is an extension of the base record
 
property PrevRecord:TNTFSDiskRecord read FPrevRecord write FPrevRecord;  
property NextRecord:TNTFSDiskRecord read FNextRecord write FNextRecord;  
 
property IsUsed:Boolean read GetIsUsed write SetIsUsed; Record is in use
property IsFolder:Boolean read GetIsFolder write SetIsFolder; Record is a folder
property IsUnknown1:Boolean read GetIsUnknown1 write SetIsUnknown1;
property IsIndexView:Boolean read GetIsIndexView write SetIsIndexView; Record is an index view
 
property RecordFlags:Word read FRecordFlags write FRecordFlags;  
property HardLinkCount:Word read FHardLinkCount write FHardLinkCount;  
property SequenceNumber:Word read FSequenceNumber write FSequenceNumber;  
property NextAttributeId:Word read FNextAttributeId write FNextAttributeId;  
property RecordNumber:Int64 read FRecordNumber write FRecordNumber;  
property RecordSize:LongWord read FRecordSize write FRecordSize;  
property RecordAllocated:LongWord read FRecordAllocated write FRecordAllocated;  
 
property AttributeOffset:Word read FAttributeOffset write FAttributeOffset;  
property UpdateSequenceOffset:Word read FUpdateSequenceOffset write FUpdateSequenceOffset;  
property UpdateSequenceLength:Word read FUpdateSequenceLength write FUpdateSequenceLength;  
 
property UpdateSequenceNumber:Word read FUpdateSequenceNumber write FUpdateSequenceNumber;  
property LogFileSequenceNumber:Int64 read FLogFileSequenceNumber write FLogFileSequenceNumber;  
 
property Base:TNTFSDiskRecord read FBase write FBase;  
property Links:TNTFSEntryList read FLinks;  
property Streams:TNTFSEntryList read FStreams;  
property Records:TNTFSRecordList read FRecords;  
property Attributes:TNTFSDiskAttributes read FAttributes;  
 
property Origin:TNTFSDiskRecord read GetOrigin;  
 
function CreateLink(AAttribute,AAlternate:TNTFSDiskAttribute; ANew:Boolean):TNTFSDiskEntry;  
function DestroyLink(ALink:TNTFSDiskEntry):Boolean;  
function NewLink(AAttribute,AAlternate:TNTFSDiskAttribute):TNTFSDiskEntry;  
function GetLink(AAttribute:TNTFSDiskAttribute):TNTFSDiskEntry;  
function DeleteLink(ALink:TNTFSDiskEntry):Boolean;  
function RenameLink(ALink:TNTFSDiskEntry; AAttribute,AAlternate:TNTFSDiskAttribute):Boolean;  
 
function CreateStream(AAttribute:TNTFSDiskAttribute; ANew:Boolean):TNTFSDiskEntry;  
function DestroyStream(AStream:TNTFSDiskEntry):Boolean;  
function NewStream(AAttribute:TNTFSDiskAttribute):TNTFSDiskEntry;  
function GetStream(AAttribute:TNTFSDiskAttribute):TNTFSDiskEntry;  
function DeleteStream(AStream:TNTFSDiskEntry):Boolean;  
 
function GetFileNameByKey(AKey:TNTFSAttributeKey):TNTFSDiskAttribute;  
function GetFileNameByName(const AName:String; AInstance:Integer):TNTFSDiskAttribute;  
function GetFileNameByParent(const AName:String; const AParent:Int64; AInstance:Integer):TNTFSDiskAttribute;  
function GetFileNameByNameSpace(const AName:String; const AParent:Int64; ANameSpace:Byte; AInstance:Integer):TNTFSDiskAttribute;  
 
function GetRecord(AInstance:Integer):TNTFSDiskRecord;  
function GetRecordByFree(AFree:LongWord; AExclude:Boolean):TNTFSDiskRecord;  
function GetRecordByReference(const AFileReference:Int64):TNTFSDiskRecord;  
 
function AddRecord(ARecord:TNTFSDiskRecord):Boolean;  
function RemoveRecord(ARecord:TNTFSDiskRecord):Boolean;  
 
function GetAttributeByItem(AItem:TNTFSDiskItem):TNTFSDiskAttribute;  
function GetAttributeByStatus(AInclude,AExclude:Word; AInstance:Integer):TNTFSDiskAttribute;  
function GetAttributeByVCN(AAttribute:TNTFSDiskAttribute; const AVCN:Int64; var AInstance:LongWord):TNTFSDiskAttribute;  
function GetAttributeByUnit(AAttribute:TNTFSDiskAttribute; const AUnit:Int64; var AInstance:LongWord):TNTFSDiskAttribute;  
 
function CreateAttribute(AType:LongWord; AVersion:Word; ANew:Boolean):TNTFSDiskAttribute;  
function DestroyAttribute(AAttribute:TNTFSDiskAttribute):Boolean;  
function NewAttribute(APrevious:TNTFSDiskAttribute; AType:LongWord; const AName:String; AVersion:Word):TNTFSDiskAttribute;  
function GetAttribute(AType:LongWord; const AName:String; AInstance:Integer):TNTFSDiskAttribute;  
function RemoveAttribute(AAttribute:TNTFSDiskAttribute):Boolean;  
function MoveAttribute(ADest:TNTFSDiskRecord; AAttribute:TNTFSDiskAttribute):Boolean;  
function RenameAttribute(AAttribute:TNTFSDiskAttribute; const AName:String):Boolean;  
 
function FileReference:Int64;  
function BaseReference:Int64; File reference to the base FILE record
 
function LinkCount:LongWord;  
function StreamCount:LongWord;  
function RecordCount:LongWord;  
function AttributeCount:LongWord;  
 
function RecordFree:LongWord;  
function AttributeSize(AVersion:Word; AType:LongWord):LongWord;  
 
function CalculatedSize(AVersion:Word):LongWord;  
function CalculatedOffset(AVersion:Word):Word;  
function CalculatedSequenceOffset(AVersion:Word):Word;  
function CalculatedSequenceLength(ASectorSize:Word):Word;  
function CalculatedStreamUsed(AVersion:Word; AAttribute:TNTFSDiskAttribute):Int64;  
 
function ReadAttributes(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteAttributes(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadRecord(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word; AFree:Boolean):Boolean;  
function WriteRecord(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS disk index

TNTFSDiskIndex = class(TLinkedObjBtree)

Note: Index of INDX records.
 
constructor Create(AKeyLocal:TMutexHandle; ALock:TSynchronizerHandle; AVolumeVersion,ASectorSize:Word; AIndexType,ACollateRule:LongWord; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
FLock:TSynchronizerHandle;  
FKeyLocal:TMutexHandle;  
 
FStatus:LongWord;  
 
FSectorSize:Word;  
FVolumeVersion:Word;  
 
FIndexType:LongWord; Attribute Type (Or None if Data Index)
FCollateRule:LongWord; Collation Rule
FIndexRecordSize:LongWord; Size of Index Allocation Entry (bytes)
FIndexCounterOffset:LongWord; Index Record Number increment
 
FClustersPerIndex:LongWord; Clusters per INDX Record or 0 if less than cluster size
FIndexsPerCluster:LongWord; INDX Records per Cluster or 0 if more than cluster size
 
FIndexCounterShift:Word; Shift count for Record -> Counter
FIndexRecordShiftCount:Word; Shift count for Record -> VCN
FIndexRecordOffsetMask:Int64; Mask for Record offset calculation
 
FTotalIndexRecordCount:Int64; Total number of index records in index
 
FLastFreeIndexRecord:Int64; Or ntfsUnknownRecordNumber if not known
FFreeIndexRecordCount:Int64; Or ntfsUnknownRecordNumber if not known
 
FCompareSecurityDescriptor:TNTFSCompareSecurityDescriptor;  
 
FUpCase:TNTFSUpCase; Uppercase Conversion Table
 
FNodes:TNTFSDiskNodes; List of index nodes
FAttribute:TNTFSDiskAttribute; Attribute owning this index
 
function GetNodesLock:TSynchronizerHandle;  
 
function GetKeyLocal:TMutexHandle;  
function GetNodeLocal:TMutexHandle;  
 
function GetLoaded:Boolean;  
procedure SetLoaded(AValue:Boolean);  
function GetChanged:Boolean;  
 
function GetUpCase:PNTFSUpCaseData;  
function GetRootNode:TNTFSDiskNode;  
 
function CreateNodes(ANew:Boolean):TNTFSDiskNodes;  
 
function CompareKey(AEntry1,AEntry2:Pointer; ASize1,ASize2:Word):Integer;  
 
function CompareBinary(AEntry1,AEntry2:Pointer; ASize1,ASize2:Word):Integer;  
function CompareFileName(AEntry1,AEntry2:PWideChar; ASize1,ASize2:Word):Integer;  
function CompareUnicode(AEntry1,AEntry2:PWideChar; ASize1,ASize2:Word):Integer;  
function CompareLongWord(AEntry1,AEntry2:LongWord; ASize1,ASize2:Word):Integer;  
function CompareSID(AEntry1,AEntry2:PSID; ASize1,ASize2:Word):Integer;  
function CompareSecurityHash(AEntry1,AEntry2:PNTFSSecurityHashKeyData; ASize1,ASize2:Word):Integer;  
function CompareGUID(AEntry1,AEntry2:PGUID; ASize1,ASize2:Word):Integer;  
protected
function GetEnd(AEntry:TBtreeObject):TBtreeObject; override;  
function GetStart(AEntry:TBtreeObject):TBtreeObject; override;  
function GetBlank(AEntry:TBtreeObject):TBtreeObject; override;  
function GetMedian(AEntry:TBtreeObject):TBtreeObject; override;  
 
function GetDropTest(AEntry:TBtreeObject; var ALeft:Boolean):TBtreeObject;  
function GetDrop(AEntry:TBtreeObject; var ALeft:Boolean):TBtreeObject; override;  
function GetMerge(AEntry:TBtreeObject):TBtreeObject; override;  
function GetBorrow(AEntry:TBtreeObject):TBtreeObject; override;  
function GetTarget(ADrop:TBtreeObject; ALeft:Boolean):TBtreeObject; override;  
 
function PushNode(AEntry:TBtreeObject):Boolean; override;  
function SplitNode(AEntry:TBtreeObject):Boolean; override;  
function DropNode(AEntry,ADrop,ATarget:TBtreeObject; ALeft:Boolean):Boolean; override;  
function DropNodeOld(AEntry,ADrop:TBtreeObject; ALeft:Boolean):Boolean; override;  
function MergeNode(AEntry,AMerge:TBtreeObject):Boolean; override;  
function BorrowEntry(AEntry,ABorrow:TBtreeObject):Boolean; override;  
 
function SwapEntry(AEntry,ASwap:TBtreeObject;ALeft:Boolean):Boolean; override;  
function SetParentEntry(AEntry,AParent:TBtreeObject):Boolean; override;  
 
function DeleteBlank(ABlank:TBtreeObject):Boolean; override;  
 
function AttachBlank(ABlank:TBtreeObject):Boolean; override;  
function DetachBlank(ABlank:TBtreeObject):Boolean; override;  
 
function AttachEntry(AEntry:TBtreeObject):Boolean; override;  
function DetachEntry(AEntry:TBtreeObject):Boolean; override;  
 
function RequirePush(AEntry:TBtreeObject):Boolean; override;  
function RequireSplit(AEntry:TBtreeObject):Boolean; override;  
function RequireDrop(AEntry:TBtreeObject):Boolean; override;  
function RequireMerge(AEntry:TBtreeObject):Boolean; override;  
function RequireBorrow(AEntry:TBtreeObject):Boolean; override;  
public
property Loaded:Boolean read GetLoaded write SetLoaded;  
property Changed:Boolean read GetChanged;  
 
property SectorSize:Word read FSectorSize write FSectorSize;  
property VolumeVersion:Word read FVolumeVersion;  
 
property IndexType:LongWord read FIndexType write FIndexType;  
property CollateRule:LongWord read FCollateRule write FCollateRule;  
property IndexRecordSize:LongWord read FIndexRecordSize write FIndexRecordSize;  
property IndexCounterOffset:LongWord read FIndexCounterOffset write FIndexCounterOffset;  
 
property ClustersPerIndex:LongWord read FClustersPerIndex write FClustersPerIndex;  
property IndexsPerCluster:LongWord read FIndexsPerCluster write FIndexsPerCluster;  
 
property IndexCounterShift:Word read FIndexCounterShift write FIndexCounterShift;  
property IndexRecordShiftCount:Word read FIndexRecordShiftCount write FIndexRecordShiftCount;  
property IndexRecordOffsetMask:Int64 read FIndexRecordOffsetMask write FIndexRecordOffsetMask;  
 
property TotalIndexRecordCount:Int64 read FTotalIndexRecordCount write FTotalIndexRecordCount;  
 
property LastFreeIndexRecord:Int64 read FLastFreeIndexRecord write FLastFreeIndexRecord;  
property FreeIndexRecordCount:Int64 read FFreeIndexRecordCount write FFreeIndexRecordCount;  
 
property CompareSecurityDescriptor:TNTFSCompareSecurityDescriptor read FCompareSecurityDescriptor write FCompareSecurityDescriptor;  
 
property UpCase:TNTFSUpCase read FUpCase write FUpCase;  
 
property Nodes:TNTFSDiskNodes read FNodes;  
property Attribute:TNTFSDiskAttribute read FAttribute;  
 
property RootNode:TNTFSDiskNode read GetRootNode;  
 
function NodeCount:Integer;  
 
function CreateKey(ANode:TNTFSDiskNode; ABlank:Boolean):TNTFSDiskKey; virtual;  
function DestroyKey(AKey:TNTFSDiskKey):Boolean;  
function NewKey(AKey,AData:Pointer; AKeySize,ADataSize:Word):TNTFSDiskKey; virtual;  
function NewKeyEx(AKey,AData,APadding:Pointer; AKeySize,ADataSize,APaddingSize:Word):TNTFSDiskKey; virtual;  
function AddKey(AParent,AKey:TNTFSDiskKey):Boolean;  
function InsertKey(AKey:TNTFSDiskKey):Boolean;  
function RemoveKey(AKey:TNTFSDiskKey):Boolean;  
 
function CreateNode(ANew:Boolean):TNTFSDiskNode;  
function DestroyNode(ANode:TNTFSDiskNode):Boolean;  
function NewNode(const ARecordNumber:Int64):TNTFSDiskNode;  
function GetNode(const ARecordNumber:Int64):TNTFSDiskNode;  
function DeleteNode(ANode:TNTFSDiskNode):Boolean;  
function RemoveNode(ANode:TNTFSDiskNode):Boolean;  
 
function UpdateNodes(AVersion:Word):Boolean; virtual;  
 
function FindKey(AValue:Pointer; ASize:Word):TNTFSDiskKey; virtual;  
 
function ReadRoot(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteRoot(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadKeys(AParent:TNTFSDiskKey; ANode:TNTFSDiskNode; ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteKeys(AParent:TNTFSDiskKey; ANode:TNTFSDiskNode; ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReaderLock:Boolean;  
function ReaderUnlock:Boolean;  
function WriterLock:Boolean;  
function WriterUnlock:Boolean;  

NTFS data index

TNTFSDataIndex = class(TNTFSDiskIndex)

private
function CompareSecurityDescriptor(AHash1,AHash2,ASecurityId:LongWord; ADescriptor:Pointer; ASize:Word):Integer;  
 
function Find(AValue:Pointer; ASize:Word; ACurrent:TNTFSDataKey):TNTFSDataKey;  
function FindEx(AValue:Pointer; ASize:Word; AHash:LongWord; ACurrent:TNTFSDataKey):TNTFSDataKey;  
protected
function CreateBlank:TBtreeObject; override;  
 
function Compare(AEntry1,AEntry2:TBtreeObject):Integer; override;  
public
function CreateKey(ANode:TNTFSDiskNode; ABlank:Boolean):TNTFSDiskKey; override;  
function NewKey(AKey,AData:Pointer; AKeySize,ADataSize:Word):TNTFSDiskKey; override;  
 
function GetKeyBySID(ASID:PSID):TNTFSDiskKey;  
function GetKeyByOwner(AOwner:LongWord):TNTFSDiskKey;  
function GetKeyByObjectId(const AObjectId:TGUID):TNTFSDiskKey;  
function GetKeyBySecurity(ASecurity:TNTFSSecurity):TNTFSDiskKey;  
function GetKeyByReparse(AReparseTag:LongWord; const AFileReference:Int64):TNTFSDiskKey;  
 
function FindKey(AValue:Pointer;ASize:Word):TNTFSDiskKey; override;  

NTFS padded index

TNTFSPaddedIndex = class(TNTFSDataIndex)

Note: A DataIndex that allows a block of Padding to be specified.
 
protected
function CreateBlank:TBtreeObject; override;  
private
function CreateBlank:TBtreeObject; override;  
public
function CreateKey(ANode:TNTFSDiskNode; ABlank:Boolean):TNTFSDiskKey; override;  
function NewKey(AKey,AData:Pointer; AKeySize,ADataSize:Word):TNTFSDiskKey; override;  
function NewKeyEx(AKey,AData,APadding:Pointer; AKeySize,ADataSize,APaddingSize:Word):TNTFSDiskKey; override;  

NTFS attribute index

TNTFSAttributeIndex = class(TNTFSDiskIndex)

private
function Find(AValue:Pointer; ASize:Word; ACurrent:TNTFSAttributeKey):TNTFSAttributeKey;  
protected
function CreateBlank:TBtreeObject; override;  
 
function Compare(AEntry1,AEntry2:TBtreeObject):Integer; override;  
public
function CreateKey(ANode:TNTFSDiskNode; ABlank:Boolean):TNTFSDiskKey; override;  
function NewKey(AKey,AData:Pointer; AKeySize,ADataSize:Word):TNTFSDiskKey; override;  
 
function GetKeyByFileName(const AFileName:String):TNTFSDiskKey;  
 
function NewKeyByAttribute(AAttribute:TNTFSDiskAttribute):TNTFSDiskKey;  
function GetKeyByAttribute(AAttribute:TNTFSDiskAttribute):TNTFSDiskKey;  
 
function FindKey(AValue:Pointer; ASize:Word):TNTFSDiskKey; override;  

NTFS disk nodes

TNTFSDiskNodes = class(TFileSysListEx)

constructor Create(ANodeLocal:TMutexHandle; ALock:TSynchronizerHandle);  
destructor Destroy; override;  
private
FNodeLocal:TMutexHandle;  
 
function GetModified:Boolean;  
procedure SetModified(AValue:Boolean);  
public
property Modified:Boolean read GetModified write SetModified;  
 
function TotalSize:LongWord;  
 
function NodeCount:LongWord;  

NTFS disk node

TNTFSDiskNode = class(TListObject)

Note: Represents an INDX record header.
 
constructor Create(ALocalLock:TMutexHandle; AIndex:TNTFSDiskIndex);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FStatus:LongWord;  
 
FIndexFlags:Word; Flags (See Consts)
FIndexSize:LongWord; Total size of the Index Entries
FIndexAllocated:LongWord; Allocated size of the Index Entries
FEntryOffset:LongWord; Offset to first Index Entry
 
FRecordNumber:Int64; Number of this INDX record in the Index Allocation
FUpdateSequenceOffset:Word; Offset to the Update Sequence Record
FUpdateSequenceLength:Word; Size in words of the Update Sequence Record
 
FUpdateSequenceNumber:Word; Update Sequence Number
FLogFileSequenceNumber:Int64; LogFile sequence number
 
FIndex:TNTFSDiskIndex; Index owning this node
FBlank:TNTFSDiskKey; Blank key of this node (Blank keys do not move)
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetAdded:Boolean;  
procedure SetAdded(AValue:Boolean);  
function GetDeleted:Boolean;  
procedure SetDeleted(AValue:Boolean);  
function GetChanged:Boolean;  
procedure SetChanged(AValue:Boolean);  
 
function GetModified:Boolean;  
procedure SetModified(AValue:Boolean);  
 
function GetIsRoot:Boolean;  
 
function GetHasSubNodes:Boolean;  
procedure SetHasSubNodes(AValue:Boolean);  
 
function GetStart:TNTFSDiskKey;  
public
property Added:Boolean read GetAdded write SetAdded; Index record to be allocated
property Deleted:Boolean read GetDeleted write SetDeleted; Index record to be deallocated
property Changed:Boolean read GetChanged write SetChanged; Index record to be updated
 
property Modified:Boolean read GetModified write SetModified; Index record has been added, deleted or changed
 
property IsRoot:Boolean read GetIsRoot;  
 
property HasSubNodes:Boolean read GetHasSubNodes write SetHasSubNodes;  
 
property IndexFlags:Word read FIndexFlags write FIndexFlags;  
property IndexSize:LongWord read FIndexSize write FIndexSize;  
property IndexAllocated:LongWord read FIndexAllocated write FIndexAllocated;  
property EntryOffset:LongWord read FEntryOffset write FEntryOffset;  
 
property RecordNumber:Int64 read FRecordNumber write FRecordNumber;  
property UpdateSequenceOffset:Word read FUpdateSequenceOffset write FUpdateSequenceOffset;  
property UpdateSequenceLength:Word read FUpdateSequenceLength write FUpdateSequenceLength;  
 
property UpdateSequenceNumber:Word read FUpdateSequenceNumber write FUpdateSequenceNumber;  
property LogFileSequenceNumber:Int64 read FLogFileSequenceNumber write FLogFileSequenceNumber;  
 
property Index:TNTFSDiskIndex read FIndex;  
property Blank:TNTFSDiskKey read FBlank write FBlank;  
property Start:TNTFSDiskKey read GetStart;  
 
function KeyCount:Integer;  
 
function IndexFree:LongWord;  
 
function UpdateKeys(AVersion:Word):Boolean; virtual;  
 
function CalculatedSize(AVersion:Word):LongWord;  
function CalculatedOffset(AVersion:Word):LongWord;  
function CalculatedAllocated(AVersion:Word):LongWord;  
function CalculatedSequenceOffset(AVersion:Word):Word;  
function CalculatedSequenceLength(ASectorSize:Word):Word;  
 
function WriteEmpty(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word; var AUpdateSequenceOffset,AUpdateSequenceLength:Word):Boolean;  
 
function ReadRecord(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteRecord(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadHeader(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteHeader(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS disk key

TNTFSDiskKey = class(TBtreeObject)

Note: Represents an INDX record entry.
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FStatus:LongWord;  
FKey:Pointer;  
 
FEntryFlags:Word; Flags (See Consts)
FEntrySize:Word; Length of the index entry
FKeySize:Word; Length of the key entry
FSubNodeNumber:Int64; Number of the sub-node in the index allocation attribute
 
FNode:TNTFSDiskNode; Index node of this key
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetChanged:Boolean;  
procedure SetChanged(AValue:Boolean);  
 
function GetHasSubNode:Boolean;  
procedure SetHasSubNode(AValue:Boolean);  
function GetIsLastNode:Boolean;  
procedure SetIsLastNode(AValue:Boolean);  
 
procedure SetKeySize(ASize:Word); virtual;  
procedure SetSubNodeNumber(const ANodeNumber:Int64);  
 
procedure SetNode(ANode:TNTFSDiskNode);  
public
property Changed:Boolean read GetChanged write SetChanged; Index record to be updated
 
property HasSubNode:Boolean read GetHasSubNode write SetHasSubNode;  
property IsLastNode:Boolean read GetIsLastNode write SetIsLastNode;  
 
property Key:Pointer read FKey;  
 
property EntryFlags:Word read FEntryFlags write FEntryFlags;  
property EntrySize:Word read FEntrySize write FEntrySize;  
property KeySize:Word read FKeySize write SetKeySize;  
property SubNodeNumber:Int64 read FSubNodeNumber write SetSubNodeNumber;  
 
property Node:TNTFSDiskNode read FNode write SetNode;  
 
function CalculatedSize(AVersion:Word):Word; virtual;  
 
function ReadKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  
function WriteKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  

NTFS data key

TNTFSDataKey = class(TNTFSDiskKey)

constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FData:Pointer;  
 
FDataSize:Word; Size of the data (Only valid when the last entry flag is not set)
 
procedure SetKeySize(ASize:Word); override;  
procedure SetData(AData:Pointer);  
procedure SetDataSize(ASize:Word);  
public
property Data:Pointer read FData write SetData;  
 
property DataSize:Word read FDataSize write SetDataSize;  
 
function DataOffset:Word; Offset to the data (Only valid when the last entry flag is not set)
function CalculatedSize(AVersion:Word):Word; override;  
 
function ReadKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS padded key

TNTFSPaddedKey = class(TNTFSDataKey)

constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FPadding:Pointer;  
FPaddingSize:Word;  
 
procedure SetPadding(APadding:Pointer);  
procedure SetPaddingSize(ASize:Word);  
public
property Padding:Pointer read FPadding write SetPadding;  
property PaddingSize:Word read FPaddingSize write SetPaddingSize;  
 
function ReadKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS attribute key

TNTFSAttributeKey = class(TNTFSDiskKey)

constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FFileReference:Int64; File reference (Only valid when the last entry flag is not set)
 
FAttribute:TNTFSDiskAttribute; Indexed attribute of this key
 
function GetInvalid:Boolean;  
procedure SetInvalid(AValue:Boolean);  
 
procedure SetKeySize(ASize:Word); override;  
procedure SetAttribute(AAttribute:TNTFSDiskAttribute);  
public
property Invalid:Boolean read GetInvalid write SetInvalid; Key points to invalid file record or attribute
 
property FileReference:Int64 read FFileReference write FFileReference;  
 
property Attribute:TNTFSDiskAttribute read FAttribute write SetAttribute;  
 
function UpdateKey:Boolean;  
 
function RecordNumber:Int64;  
 
function CalculatedSize(AVersion:Word):Word; override;  
 
function ReadKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteKey(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS disk runs

TNTFSDiskRuns = class(TFileSysListEx)

constructor Create(ARunLocal:TMutexHandle; ALock:TSynchronizerHandle);  
destructor Destroy; override;  
private
FRunLocal:TMutexHandle;  
 
FRecent:TNTFSDiskRun;  
FRecentVCN:Int64;  
 
function GetStart:TNTFSDiskRun;  
function GetFinal:TNTFSDiskRun;  
public
property Recent:TNTFSDiskRun read FRecent write FRecent;  
property RecentVCN:Int64 read FRecentVCN write FRecentVCN;  
 
function SparseCount:Int64; Count of sparse runs in list
function ClusterCount:Int64; Count of normal runs in list
function AllocatedCount:Int64; Count of allocated runs in list
 
function TotalSize:LongWord; Total size of the encoded data runs
 
function RunCount:LongWord;  

NTFS disk run

TNTFSDiskRun = class(TListObject)

constructor Create(ALocalLock:TMutexHandle; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FStart:Int64; Run start logical cluster
FOffset:Int64; Run start cluster offset
FLength:Int64; Run length in clusters
 
FAttribute:TNTFSDiskAttribute; Attribute owning this run
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetIsLast:Boolean;  
function GetIsSparse:Boolean;  
 
function GetOffsetSize:Byte;  
function GetLengthSize:Byte;  
 
procedure SetStart(const AStart:Int64);  
procedure SetOffset(const AOffset:Int64);  
 
function GetSuccessor:TNTFSDiskRun;  
function GetPredecessor:TNTFSDiskRun;  
public
property IsLast:Boolean read GetIsLast;  
property IsSparse:Boolean read GetIsSparse;  
 
property Start:Int64 read FStart write SetStart;  
property Offset:Int64 read FOffset write SetOffset;  
property Length:Int64 read FLength write FLength;  
 
property Attribute:TNTFSDiskAttribute read FAttribute;  
 
function RunSize:LongWord; Size of the encoded data run
 
function UpdateRun:Boolean;  
 
function ReadRun(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean;  
function WriteRun(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean;  

NTFS disk items

TNTFSDiskItems = class(TFileSysListEx)

constructor Create(AItemLocal:TMutexHandle; ALock:TSynchronizerHandle);  
destructor Destroy; override;  
private
FItemLocal:TMutexHandle;  
 
FStatus:LongWord;  
 
function GetLoaded:Boolean;  
procedure SetLoaded(AValue:Boolean);  
 
function GetPrevious(AItem:TNTFSDiskItem):TNTFSDiskItem;  
public
property Loaded:Boolean read GetLoaded write SetLoaded;  
 
function TotalSize:Int64;  
 
function ItemCount:LongWord;  

NTFS disk item

TNTFSDiskItem = class(TListObject)

Note: Data of attribute $ATTRIBUTE_LIST
 
constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FStatus:LongWord;  
 
FItemSize:Word; Record length
FStartVCN:Int64; Starting VCN if non resident
FFileReference:Int64; File Reference of the attribute
FAttributeType:LongWord; Attribute Type
FAttributeId:Word; Attribute Id
FAttributeName:String; Name in Unicode (if NameLength > 0)
 
FParent:TNTFSDiskAttribute; Attribute list owning this item
FAttribute:TNTFSDiskAttribute; Attribute pointed to by this item
 
FAttributeHash:LongWord;  
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetInvalid:Boolean;  
procedure SetInvalid(AValue:Boolean);  
 
function GetAttributeName:String;  
procedure SetAttributeName(const AAttributeName:String);  
procedure SetAttribute(AAttribute:TNTFSDiskAttribute);  
 
function Compare(AItem:TNTFSDiskItem):Integer; virtual;  
public
property Invalid:Boolean read GetInvalid write SetInvalid; Item points to invalid file record or attribute
 
property ItemSize:Word read FItemSize write FItemSize;  
property StartVCN:Int64 read FStartVCN write FStartVCN;  
property FileReference:Int64 read FFileReference write FFileReference;  
property AttributeType:LongWord read FAttributeType write FAttributeType;  
property AttributeId:Word read FAttributeId write FAttributeId;  
property AttributeName:String read GetAttributeName write SetAttributeName;  
 
property Parent:TNTFSDiskAttribute read FParent;  
property Attribute:TNTFSDiskAttribute read FAttribute write SetAttribute;  
 
property AttributeHash:LongWord read FAttributeHash;  
 
function RecordNumber:Int64;  
 
function AttributeNameSize:Word;  
function AttributeNameLength:Byte; Name length
function AttributeNameOffset:Byte; Offset to Name
 
function UpdateItem:Boolean;  
 
function CalculatedSize(AVersion:Word):Word;  
 
function ReadItem(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteItem(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS disk attributes

TNTFSDiskAttributes = class(TFileSysListEx)

constructor Create(AAttributeLocal:TMutexHandle; ALock:TSynchronizerHandle);  
destructor Destroy; override;  
private
FAttributeLocal:TMutexHandle;  
 
function GetPrevious(AAttribute:TNTFSDiskAttribute):TNTFSDiskAttribute;  
public
function TotalSize:LongWord;  
 
function AttributeCount:LongWord;  

NTFS disk attribute

TNTFSDiskAttribute = class(TListObject)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
protected
FStatus:LongWord;  
FData:Pointer; Only applicable if attribute is resident
 
FAttributeType:LongWord; Attribute Type (e.g. 0x80, 0xA0)
FAttributeSize:LongWord; Length of the Attribute (including header)
FAttributeFlags:Word; Attribute Flags
FAttributeId:Word; Attribute Id
FAttributeName:String; Attribute Name
FNonResident:Byte; Non-resident flag
 
FIndexed:Byte; Indexed flag
FDataSize:LongWord; Length of the Attribute Data
 
FStartVCN:Int64; Starting VCN
FLastVCN:Int64; Last VCN
FStreamSize:Int64; Real size of the attribute
FStreamUsed:Int64; The actual Allocated size of the attribute (Only present when compressed and only in the first instance)
FStreamAllocated:Int64; Allocated size of the attribute
FInitializedSize:Int64; Initialized data size of the stream (Portion which has been Written)
FCompressionUnit:Word; Compression Unit Size
 
FRuns:TNTFSDiskRuns; List of runs of this attribute
FItems:TNTFSDiskItems; List of items of this attribute
FIndex:TNTFSDiskIndex; Index of this attribute if applicable
FParent:TNTFSDiskRecord; Record owning this attribute
 
FAttributeHash:LongWord;  
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetRunsLock:TSynchronizerHandle;  
function GetItemsLock:TSynchronizerHandle;  
function GetIndexLock:TSynchronizerHandle;  
function GetExtendedsLock:TSynchronizerHandle;  
 
function GetRunLocal:TMutexHandle;  
function GetItemLocal:TMutexHandle;  
function GetKeyLocal:TMutexHandle;  
function GetExtendedLocal:TMutexHandle;  
 
function GetUpdating:Boolean;  
procedure SetUpdating(AValue:Boolean);  
 
function GetIsFixed:Boolean;  
function GetIsSingle:Boolean;  
function GetIsUnlisted:Boolean;  
function GetIsUnmovable:Boolean;  
function GetIsManaged:Boolean;  
 
function GetIsSparse:Boolean;  
procedure SetIsSparse(AValue:Boolean);  
function GetIsEncrypted:Boolean;  
procedure SetIsEncrypted(AValue:Boolean);  
function GetIsCompressed:Boolean;  
procedure SetIsCompressed(AValue:Boolean);  
 
function GetAttributeName:String;  
procedure SetAttributeName(const AAttributeName:String);  
 
function GetDataSize:LongWord; virtual;  
procedure SetDataSize(AValue:LongWord); virtual;  
 
function Compare(AAttribute:TNTFSDiskAttribute):Integer; virtual;  
 
function CreateRuns(ANew:Boolean):TNTFSDiskRuns;  
function CreateItems(ANew:Boolean):TNTFSDiskItems;  
 
function GetRecord(AInstance:Integer):TNTFSDiskRecord;  
function GetAttribute(AType:LongWord; const AName:String; AInstance:Integer):TNTFSDiskAttribute;  
public
property Updating:Boolean read GetUpdating write SetUpdating;  
 
property IsFixed:Boolean read GetIsFixed;  
property IsSingle:Boolean read GetIsSingle;  
property IsUnlisted:Boolean read GetIsUnlisted;  
property IsUnmovable:Boolean read GetIsUnmovable;  
property IsManaged:Boolean read GetIsManaged;  
 
property IsSparse:Boolean read GetIsSparse write SetIsSparse;  
property IsEncrypted:Boolean read GetIsEncrypted write SetIsEncrypted;  
property IsCompressed:Boolean read GetIsCompressed write SetIsCompressed;  
 
property Data:Pointer read FData;  
 
property AttributeType:LongWord read FAttributeType;  
property AttributeSize:LongWord read FAttributeSize write FAttributeSize;  
property AttributeFlags:Word read FAttributeFlags write FAttributeFlags;  
property AttributeId:Word read FAttributeId write FAttributeId;  
property AttributeName:String read GetAttributeName write SetAttributeName;  
property NonResident:Byte read FNonResident write FNonResident;  
 
property Indexed:Byte read FIndexed write FIndexed;  
property DataSize:LongWord read GetDataSize write SetDataSize;  
 
property StartVCN:Int64 read FStartVCN write FStartVCN;  
property LastVCN:Int64 read FLastVCN write FLastVCN;  
property StreamSize:Int64 read FStreamSize write FStreamSize;  
property StreamUsed:Int64 read FStreamUsed write FStreamUsed;  
property StreamAllocated:Int64 read FStreamAllocated write FStreamAllocated;  
property InitializedSize:Int64 read FInitializedSize write FInitializedSize;  
property CompressionUnit:Word read FCompressionUnit write FCompressionUnit;  
 
property Runs:TNTFSDiskRuns read FRuns;  
property Items:TNTFSDiskItems read FItems;  
property Index:TNTFSDiskIndex read FIndex;  
property Parent:TNTFSDiskRecord read FParent write FParent;  
 
property AttributeHash:LongWord read FAttributeHash;  
 
function GetRunCount(const AVCN:Int64; var AStartVCN,ACount:Int64):Boolean;  
function GetRunLength(const AVCN:Int64; var AStartVCN,ALength:Int64):Boolean;  
function GetRunByUnit(const AUnit:Int64; var AStartVCN:Int64):TNTFSDiskRun;  
function GetRunByCluster(const ACluster:Int64; var AStartVCN:Int64):TNTFSDiskRun;  
 
function CreateRun(ANew:Boolean):TNTFSDiskRun;  
function DestroyRun(ARun:TNTFSDiskRun):Boolean;  
function NewRun(const AStart,ALength:Int64):TNTFSDiskRun;  
function InsertRun(APrev:TNTFSDiskRun; const AStart,ALength:Int64):TNTFSDiskRun;  
function GetRun(const AVCN:Int64; var AStartVCN:Int64):TNTFSDiskRun;  
function GetRunOld(const AVCN:Int64; var AStartVCN:Int64):TNTFSDiskRun;  
function MergeRun(ARun:TNTFSDiskRun):Boolean;  
function SplitRun(ARun:TNTFSDiskRun; const ALength:Int64):Boolean;  
function RemoveRun(ARun:TNTFSDiskRun):Boolean;  
function MoveRun(ADest:TNTFSDiskAttribute; ARun:TNTFSDiskRun):Boolean;  
 
function GetItemByAttribute(AAttribute:TNTFSDiskAttribute):TNTFSDiskItem;  
 
function CreateItem(ANew:Boolean):TNTFSDiskItem;  
function DestroyItem(AItem:TNTFSDiskItem):Boolean;  
function NewItem(AAttribute:TNTFSDiskAttribute):TNTFSDiskItem;  
function GetItem(AType:LongWord; const AName:String; AInstance:Integer):TNTFSDiskItem;  
function RemoveItem(AItem:TNTFSDiskItem):Boolean;  
function MoveItem(AItem:TNTFSDiskItem; AAttribute:TNTFSDiskAttribute):Boolean;  
function RenameItem(AItem:TNTFSDiskItem; AAttribute:TNTFSDiskAttribute):Boolean;  
 
function CreateIndex(AVersion,ASector:Word):Boolean; virtual;  
function NewIndex(AVersion,ASector:Word; AType,ARule,ASize,AOffset:LongWord):Boolean; virtual;  
 
function RecordNumber:Int64;  
function FileReference:Int64;  
function BaseReference:Int64;  
 
function RunOffset:Word; Offset to the Data Run
function DataOffset:Word; Offset to the Attribute Data
function AttributeNameSize:Word;  
function AttributeNameLength:Byte; Name length
function AttributeNameOffset:Word; Offset to the Name
 
function RunCount:LongWord;  
function ItemCount:LongWord;  
 
function CalculatedSize(AVersion:Word):LongWord; virtual;  
function CalculatedDataSize(AVersion:Word):LongWord; virtual;  
function CalculatedStreamSize(AVersion:Word):Int64; virtual;  
function CalculatedStreamUsed(AVersion:Word):Int64; virtual;  
 
function CoalesceRun(ARun:TNTFSDiskRun):Boolean;  
 
function UpdateRun(ARun:TNTFSDiskRun):Boolean;  
function UpdateKey(AKey:TNTFSDiskKey):Boolean; virtual;  
function UpdateItem(AItem:TNTFSDiskItem):Boolean; virtual;  
function UpdateEntry(AEntry:TNTFSDiskEntry):Boolean; virtual;  
function UpdateAttribute(AEntry:TNTFSDiskEntry):Boolean; virtual;  
 
function ReadRuns(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean;  
function WriteRuns(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean;  
 
function ReadItems(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteItems(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; virtual;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; virtual;  
 
function ReadAttribute(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  
function WriteAttribute(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  

NTFS standard information attribute

TNTFSStandardInformationAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FCreateTime:TFileTime; File Creation
FWriteTime:TFileTime; File Altered
FChangeTime:TFileTime; MFT Changed
FAccessTime:TFileTime; File Read
FAttributes:LongWord; DOS File Permissions
FMaxVersions:LongWord; Maximum Number of Versions
FVersionNo:LongWord; Version Number
FClassId:LongWord; Class Id
FOwnerId:LongWord; Owner Id
FSecurityId:LongWord; Security Id
FQuotaCharge:Int64; Quota Charged
FUpdateSequenceNumber:Int64; Update Sequence Number
public
property CreateTime:TFileTime read FCreateTime write FCreateTime;  
property WriteTime:TFileTime read FWriteTime write FWriteTime;  
property ChangeTime:TFileTime read FChangeTime write FChangeTime;  
property AccessTime:TFileTime read FAccessTime write FAccessTime;  
property Attributes:LongWord read FAttributes write FAttributes;  
property MaxVersions:LongWord read FMaxVersions write FMaxVersions;  
property VersionNo:LongWord read FVersionNo write FVersionNo;  
property ClassId:LongWord read FClassId write FClassId;  
property OwnerId:LongWord read FOwnerId write FOwnerId;  
property SecurityId:LongWord read FSecurityId write FSecurityId;  
property QuotaCharge:Int64 read FQuotaCharge write FQuotaCharge;  
property UpdateSequenceNumber:Int64 read FUpdateSequenceNumber write FUpdateSequenceNumber;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function UpdateEntry(AEntry:TNTFSDiskEntry):Boolean; override;  
function UpdateAttribute(AEntry:TNTFSDiskEntry):Boolean; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS attribute list

TNTFSAttributeListAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
public
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS file name attribute

TNTFSFileNameAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FParentReference:Int64; File reference to the parent directory
FCreateTime:TFileTime; C Time - File Creation

Note: These fields are only updated when the filename is changed (See Standard Information instead)

FWriteTime:TFileTime; A Time - File Altered

Note: These fields are only updated when the filename is changed (See Standard Information instead)

FChangeTime:TFileTime; M Time - MFT Changed

Note: These fields are only updated when the filename is changed (See Standard Information instead)

FAccessTime:TFileTime; R Time - File Read

Note: These fields are only updated when the filename is changed (See Standard Information instead)

FFileAllocated:Int64; Allocated size of the file (As for CreateTime/WriteTime/ChangeTime etc)
FFileSize:Int64; Real size of the file (As for CreateTime/WriteTime/ChangeTime etc)
FFileFlags:LongWord; Flags, e.g. Directory, compressed, hidden (As for CreateTime/WriteTime/ChangeTime etc)
FReparseTag:LongWord; Used by EAs and Reparse
FNameSpace:Byte; Filename namespace
FFileName:String; File name
 
FFileHash:LongWord;  
 
function GetFileName:String;  
procedure SetFileName(const AFileName:String);  
public
property ParentReference:Int64 read FParentReference write FParentReference;  
property CreateTime:TFileTime read FCreateTime write FCreateTime;  
property WriteTime:TFileTime read FWriteTime write FWriteTime;  
property ChangeTime:TFileTime read FChangeTime write FChangeTime;  
property AccessTime:TFileTime read FAccessTime write FAccessTime;  
property FileAllocated:Int64 read FFileAllocated write FFileAllocated;  
property FileSize:Int64 read FFileSize write FFileSize;  
property FileFlags:LongWord read FFileFlags write FFileFlags;  
property ReparseTag:LongWord read FReparseTag write FReparseTag;  
property NameSpace:Byte read FNameSpace write FNameSpace;  
property FileName:String read GetFileName write SetFileName;  
 
property FileHash:LongWord read FFileHash;  
 
function FileNameSize:Word;  
function FileNameLength:Byte; Filename length in characters
 
function ParentRecord:Int64;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function UpdateEntry(AEntry:TNTFSDiskEntry):Boolean; override;  
function UpdateAttribute(AEntry:TNTFSDiskEntry):Boolean; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS object Id attribute

TNTFSObjectIdAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FObjectId:TGUID; GUID Object Id Unique Id assigned to file
FBirthVolumeId:TGUID; GUID Birth Volume Id Volume where file was created
FBirthObjectId:TGUID; GUID Birth Object Id Original Object Id of file
FDomainId:TGUID; GUID Domain Id Domain in which object was created
public
property ObjectId:TGUID read FObjectId write FObjectId;  
property BirthVolumeId:TGUID read FBirthVolumeId write FBirthVolumeId;  
property BirthObjectId:TGUID read FBirthObjectId write FBirthObjectId;  
property DomainId:TGUID read FDomainId write FDomainId;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS volume version attribute

TNTFSVolumeVersionAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS security descriptor attribute

TNTFSSecurityDescriptorAttribute = class(TNTFSDiskAttribute)

Note: This is the same structure that is used for all security in Windows (File/Kernel/Registry etc). See TSecurityDescriptor and associated values in Security unit for more information.
 
constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FSecurity:TNTFSSecurity;  
public
property Security:TNTFSSecurity read FSecurity;  
 
function CreateSecurity:Boolean;  
function NewSecurity(ASecurity:TNTFSSecurity):Boolean;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadSecurity(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteSecurity(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS volume name attribute

TNTFSVolumeNameAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FVolumeName:String; Volume name
 
function GetVolumeName:String;  
procedure SetVolumeName(const AVolumeName:String);  
public
property VolumeName:String read GetVolumeName write SetVolumeName;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS volume information attribute

TNTFSVolumeInformationAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FMajorVersion:Byte; Major version number
FMinorVersion:Byte; Minor version number
FVolumeFlags:Word; Flags
public
property MajorVersion:Byte read FMajorVersion write FMajorVersion;  
property MinorVersion:Byte read FMinorVersion write FMinorVersion;  
property VolumeFlags:Word read FVolumeFlags write FVolumeFlags;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS data attribute

TNTFSDataAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  
public
function UpdateEntry(AEntry:TNTFSDiskEntry):Boolean; override;  
function UpdateAttribute(AEntry:TNTFSDiskEntry):Boolean; override;  

NTFS index root attribute

TNTFSIndexRootAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FIndexType:LongWord; Attribute Type
FCollateRule:LongWord; Collation Rule
FIndexRecordSize:LongWord; Size of Index Allocation Entry (bytes)
FIndexCounterOffset:LongWord; Index Record Number increment
public
property IndexType:LongWord read FIndexType write FIndexType;  
property CollateRule:LongWord read FCollateRule write FCollateRule;  
property IndexRecordSize:LongWord read FIndexRecordSize write FIndexRecordSize;  
property IndexCounterOffset:LongWord read FIndexCounterOffset write FIndexCounterOffset;  
 
function CreateIndex(AVersion,ASector:Word):Boolean; override;  
function NewIndex(AVersion,ASector:Word; AType,ARule,ASize,AOffset:LongWord):Boolean; override;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS index allocation attribute

TNTFSIndexAllocationAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS bitmap attribute

TNTFSBitmapAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FBitmap:Pointer;  
FBitmapSize:LongWord;  
protected
procedure SetDataSize(AValue:LongWord); override;  
procedure SetBitmapSize(AValue:LongWord);  
public
property Bitmap:Pointer read FBitmap;  
property BitmapSize:LongWord read FBitmapSize write SetBitmapSize;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  

NTFS reparse point attribute

TNTFSReparsePointAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FReparseTag:LongWord; Reparse Type (and Flags)
FReparseSize:Word; Reparse Data Length
FReparseGUID:TGUID; Reparse GUID
 
FReparse:TNTFSReparse;  
 
function GetIsAlias:Boolean;  
procedure SetIsAlias(AValue:Boolean);  
function GetIsHighLatency:Boolean;  
procedure SetIsHighLatency(AValue:Boolean);  
function GetIsMicrosoft:Boolean;  
procedure SetIsMicrosoft(AValue:Boolean);  
public
property IsAlias:Boolean read GetIsAlias write SetIsAlias;  
property IsHighLatency:Boolean read GetIsHighLatency write SetIsHighLatency;  
property IsMicrosoft:Boolean read GetIsMicrosoft write SetIsMicrosoft;  
 
property ReparseTag:LongWord read FReparseTag write FReparseTag;  
property ReparseSize:Word read FReparseSize write FReparseSize;  
property ReparseGUID:TGUID read FReparseGUID write FReparseGUID;  
 
property Reparse:TNTFSReparse read FReparse;  
 
function CreateReparse:Boolean;  
function NewReparse(AReparseTag:LongWord):Boolean;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS symbolic link attribute

TNTFSSymbolicLinkAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS extended attribute information

TNTFSExtendedAttrInformationAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FPackedSize:Word; Size of the packed Extended Attributes
FFlagCount:Word; Number of Extended Attributes with NEED_EA
FUnpackedSize:LongWord; Size of the unpacked Extended Attributes
public
property PackedSize:Word read FPackedSize write FPackedSize;  
property FlagCount:Word read FFlagCount write FFlagCount;  
property UnpackedSize:LongWord read FUnpackedSize write FUnpackedSize;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS extended attribute

TNTFSExtendedAttrAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
private
FExtendeds:TNTFSExtendeds; List of attributes of this attribute
public
property Extendeds:TNTFSExtendeds read FExtendeds;  
 
function CreateExtended:TNTFSExtended;  
function DestroyExtended(AExtended:TNTFSExtended):Boolean;  
function NewExtended(const AName:String):TNTFSExtended;  
function GetExtended(const AName:String):TNTFSExtended;  
function RemoveExtended(AExtended:TNTFSExtended):Boolean;  
 
function ExtendedCount:LongWord;  
 
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadExtendeds(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteExtendeds(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
 
function ReadData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  
function WriteData(ABuffer:Pointer; var AOffset:LongWord; AVersion:Word):Boolean; override;  

NTFS property set attribute

TNTFSPropertySetAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS logged utility stream attribute

TNTFSLoggedUtilityStreamAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS end attribute

TNTFSEndAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
public
function CalculatedSize(AVersion:Word):LongWord; override;  
function CalculatedDataSize(AVersion:Word):LongWord; override;  
function CalculatedStreamSize(AVersion:Word):Int64; override;  
 
function ReadAttribute(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteAttribute(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS unknown attribute

TNTFSUnknownAttribute = class(TNTFSDiskAttribute)

constructor Create(ALocalLock:TMutexHandle; AParent:TNTFSDiskRecord);  
destructor Destroy; override;  
protected
procedure SetDataSize(AValue:LongWord); override;  

NTFS object Id

TNTFSObjId = class(TObject)

Note: Data of index $O in file $ObjId (Not Used)
 
private
 
public
 

NTFS quota

TNTFSQuota = class(TObject)

Note: Data of index $Q in file $Quota (Not Used)
 
private
 
public
 

NTFS owner

TNTFSOwner = class(TObject)

Note: Data of index $O in file $Quota (Not Used)
 
private
 
public
 

NTFS upper case

TNTFSUpCase = class(TObject)

Note: Data of file $UpCase
 
constructor Create;  
destructor Destroy; override;  
private
FLock:TSynchronizerHandle;  
 
FData:Pointer;  
 
function ReaderLock:Boolean;  
function ReaderUnlock:Boolean;  
function WriterLock:Boolean;  
function WriterUnlock:Boolean;  
public
property Data:Pointer read FData;  
 
function Init(AVersion:Word):Boolean;  
 
function Convert(ASource,ADest:Pointer; ASize:LongWord):Boolean;  
 
function ReadUpCase(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteUpCase(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS attribute definitions

TNTFSAttrDefs = class(TFileSysList)

constructor Create;  
destructor Destroy; override;  
private
FAttrDefLocal:TMutexHandle;  
 
function GetPrevious(AAttrDef:TNTFSAttrDef):TNTFSAttrDef;  
public
function CreateAttrDef(AType:LongWord; AVersion:Word; ANew:Boolean):TNTFSAttrDef;  
function DestroyAttrDef(AAttrDef:TNTFSAttrDef):Boolean;  
function NewAttrDef(AType:LongWord; const AName:String; AVersion:Word):TNTFSAttrDef;  
function GetAttrDef(AType:LongWord; const AName:String):TNTFSAttrDef;  
function GetAttrDefByIndex(AIndex:Integer; AVersion:Word):TNTFSAttrDef;  
function GetAttrDefByIndexEx(AIndex:Integer; AVersion:Word; AWrite:Boolean):TNTFSAttrDef;  
function GetAttrDefByAttribute(AAttribute:TNTFSDiskAttribute):TNTFSAttrDef;  
function RemoveAttrDef(AAttrDef:TNTFSAttrDef):Boolean;  
 
function CheckSize(AAttribute:TNTFSDiskAttribute;const ASize:Int64):Boolean;  
function CheckIndexed(AAttribute:TNTFSDiskAttribute):Boolean;  
function CheckResident(AAttribute:TNTFSDiskAttribute):Boolean;  
function CheckUncompressed(AAttribute:TNTFSDiskAttribute):Boolean;  
 
function TotalSize:Int64;  
 
function AttrDefCount:LongWord;  
 
function Init(AVersion:Word):Boolean;  
 
function ReadAttrDefs(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteAttrDefs(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS attribute definition

TNTFSAttrDef = class(TListObject)

Note: Data of file $AttrDef
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FAttributeName:String; Label in Unicode
FAttributeType:LongWord; Type
FDisplayRule:LongWord; Display rule
FCollateRule:LongWord; Collation rule
FAttrDefFlags:LongWord; Flags (See Consts)
FMinimumSize:Int64; Minimum size
FMaximumSize:Int64; Maximum size
 
FAttributeHash:LongWord;  
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetAttributeName:String;  
procedure SetAttributeName(const AAttributeName:String);  
 
function GetIsIndexed:Boolean;  
function GetIsResident:Boolean;  
function GetIsUncompressed:Boolean;  
 
function Compare(AAttrDef:TNTFSAttrDef):Integer; virtual;  
public
property AttributeName:String read GetAttributeName write SetAttributeName;  
property AttributeType:LongWord read FAttributeType write FAttributeType;  
property DisplayRule:LongWord read FDisplayRule write FDisplayRule;  
property CollateRule:LongWord read FCollateRule write FCollateRule;  
property AttrDefFlags:LongWord read FAttrDefFlags write FAttrDefFlags;  
property MinimumSize:Int64 read FMinimumSize write FMinimumSize;  
property MaximumSize:Int64 read FMaximumSize write FMaximumSize;  
 
property IsIndexed:Boolean read GetIsIndexed;  
property IsResident:Boolean read GetIsResident;  
property IsUncompressed:Boolean read GetIsUncompressed;  
 
function Init(AIndex:Integer;AVersion:Word):Boolean;  
 
property AttributeHash:LongWord read FAttributeHash;  
 
function ReadAttrDef(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteAttrDef(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS reparse

TNTFSReparse = class(TDiskReparse)

Note: Data of attribute $REPARSE_POINT
 
constructor Create(ALocalLock:TMutexHandle; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
FData:Pointer;  
 
FDataSize:Word;  
 
FAttribute:TNTFSDiskAttribute; Attribute owning this index
 
procedure SetData(AData:Pointer); virtual;  
 
function GetDataSize:Word; virtual;  
procedure SetDataSize(ASize:Word); virtual;  
public
property Data:Pointer read FData write SetData;  
 
property DataSize:Word read GetDataSize write SetDataSize;  
 
property Attribute:TNTFSDiskAttribute read FAttribute;  
 
function CalculatedSize(AVersion:Word):Word; virtual;  
 
function ReadReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  
function WriteReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; virtual;  

NTFS reparse symbolic link

TNTFSReparseSymLink = class(TNTFSReparse)

Note: Data of attribute $REPARSE_POINT (Tag 0xA000000C)
 
constructor Create(ALocalLock:TMutexHandle; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
private
procedure SetData(AData:Pointer); override;  
 
procedure SetDataSize(ASize:Word); override;  
protected
FPrintName:String; Path Buffer
FSubstituteName:String; Path Buffer
 
FPrintHash:LongWord;  
FSubstituteHash:LongWord;  
 
function GetTarget:String; override;  
 
function GetPrintName:String;  
procedure SetPrintName(const APrintName:String);  
function GetSubstituteName:String;  
procedure SetSubstituteName(const ASubstituteName:String);  
public
property PrintName:String read GetPrintName write SetPrintName;  
property SubstituteName:String read GetSubstituteName write SetSubstituteName;  
 
property PrintHash:LongWord read FPrintHash;  
property SubstituteHash:LongWord read FSubstituteHash;  
 
function PrintNameSize:Word; virtual;  
function PrintNameOffset:Word; virtual; Print Name Offset
function PrintNameLength:Word; virtual; Print Name Length
function SubstituteNameSize:Word; virtual;  
function SubstituteNameOffset:Word; virtual; Substitute Name Offset
function SubstituteNameLength:Word; virtual; Substitute Name Length
 
function CalculatedSize(AVersion:Word):Word; override;  
 
function ReadReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS reparse mount point

TNTFSReparseMountPoint = class(TNTFSReparseSymLink)

Note: Data of attribute $REPARSE_POINT (Tag 0xA0000003)
 
constructor Create(ALocalLock:TMutexHandle; AAttribute:TNTFSDiskAttribute);  
destructor Destroy; override;  
public
function PrintNameSize:Word; override;  
function PrintNameOffset:Word; override; Print Name Offset
function PrintNameLength:Word; override; Print Name Length
function SubstituteNameSize:Word; override;  
function SubstituteNameOffset:Word; override; Substitute Name Offset
function SubstituteNameLength:Word; override; Substitute Name Length
 
function CalculatedSize(AVersion:Word):Word; override;  
 
function ReadReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  
function WriteReparse(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean; override;  

NTFS extendeds

TNTFSExtendeds = class(TFileSysListEx)

constructor Create(AExtendedLocal:TMutexHandle; ALock:TSynchronizerHandle);  
destructor Destroy; override;  
private
FExtendedLocal:TMutexHandle;  
public
function TotalSize:Int64;  
 
function ExtendedCount:LongWord;  

NTFS extended

TNTFSExtended = class(TListObject)

Note: Data of attribute $EA
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FExtendedOffset:LongWord; Offset to next Extended Attribute (Offset to next EA is the size of this EA)
FExtendedFlags:Byte; Flags
FExtendedName:String; Name Note: No offset so always in the same location (Not Unicode)
FExtendedData:Pointer; Value
FExtendedDataSize:Word; Value Length
 
FExtendedHash:LongWord;  
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function GetExtendedName:String;  
procedure SetExtendedName(const AExtendedName:String);  
procedure SetExtendedDataSize(ASize:Word);  
public
property ExtendedOffset:LongWord read FExtendedOffset write FExtendedOffset;  
property ExtendedFlags:Byte read FExtendedFlags write FExtendedFlags;  
property ExtendedName:String read GetExtendedName write SetExtendedName;  
property ExtendedData:Pointer read FExtendedData;  
property ExtendedDataSize:Word read FExtendedDataSize write SetExtendedDataSize;  
 
property ExtendedHash:LongWord read FExtendedHash;  
 
function ExtendedSize:LongWord;  
 
function ExtendedNameSize:Word;  
function ExtendedNameLength:Byte; Name Length
 
function ReadExtended(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteExtended(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS security items

TNTFSSecurityItems = class(TFileSysList)

constructor Create;  
destructor Destroy; override;  
private
FSecurityLocal:TMutexHandle;  
 
function GetPrevious(ASecurityItem:TNTFSSecurityItem):TNTFSSecurityItem;  
public
function CreateSecurityItem(ANew:Boolean):TNTFSSecurityItem;  
function DestroySecurityItem(ASecurityItem:TNTFSSecurityItem):Boolean;  
function NewSecurityItem(ASecurityId:LongWord; const ASecurityOffset:Int64; ASecurity:TNTFSSecurity):TNTFSSecurityItem;  
function GetSecurityItem(ASecurityId:LongWord):TNTFSSecurityItem;  
function GetSecurityItemEx(ASecurityId:LongWord; AWrite:Boolean):TNTFSSecurityItem;  
function UpdateSecurityItem(ASecurityItem:TNTFSSecurityItem; ASecurityId:LongWord; ASecurity:TNTFSSecurity):Boolean;  
function DeleteSecurityItem(ASecurityItem:TNTFSSecurityItem):Boolean;  
function RemoveSecurityItem(ASecurityItem:TNTFSSecurityItem; AFree:Boolean):Boolean;  
 
function TotalSize:Int64;  
 
function SecurityItemCount:LongWord;  
 
function Init(AVersion:Word):Boolean;  
 
function ReadSecurityItems(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteSecurityItems(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS security item

TNTFSSecurityItem = class(TListObject)

Note: Data of stream $SDS in file $Secure
 
constructor Create(ALocalLock:TMutexHandle);  
destructor Destroy; override;  
private
FLocalLock:TMutexHandle;  
 
FSecurityHash:LongWord; Hash of Security Descriptor
FSecurityId:LongWord; Security Id
FSecurityOffset:Int64; Offset of this entry in $SDS
FSecuritySize:LongWord; Size of this entry in $SDS
 
FSecurity:TNTFSSecurity; Self-relative Security Descriptor
 
function AcquireLock:Boolean;  
function ReleaseLock:Boolean;  
 
function Compare(ASecurityItem:TNTFSSecurityItem):Integer; virtual;  
function CompareOld(ASecurityItem:TNTFSSecurityItem):Integer; virtual;  
public
property SecurityHash:LongWord read FSecurityHash write FSecurityHash;  
property SecurityId:LongWord read FSecurityId write FSecurityId;  
property SecurityOffset:Int64 read FSecurityOffset write FSecurityOffset;  
property SecuritySize:LongWord read FSecuritySize write FSecuritySize;  
 
property Security:TNTFSSecurity read FSecurity;  
 
function CreateSecurity:Boolean;  
function NewSecurity(ASecurity:TNTFSSecurity):Boolean;  
function UpdateSecurity(ASecurity:TNTFSSecurity):Boolean;  
function DeleteSecurity:Boolean;  
function RemoveSecurity(AFree:Boolean):Boolean;  
 
function MirrorOffset:Int64;  
 
function Init(ASecurityId:LongWord; AVersion:Word):Boolean;  
 
function ReadSecurityItem(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteSecurityItem(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  

NTFS security

TNTFSSecurity = class(TDiskSecurity)

Note: Data of attribute $SECURITY_DESCRIPTOR and stream $SDS in file $Secure
Note: This is the same structure that is used for all security in Windows (File/Kernel/Registry etc). See TSecurityDescriptor and associated values in Security unit for more information.
 
constructor Create(ALocalLock:TMutexHandle);  
constructor CreateFromSecurity(ALocalLock:TMutexHandle; ASecurity:TDiskSecurity); override;  
constructor CreateFromDescriptor(ALocalLock:TMutexHandle; ADescriptor:Pointer); override;  
destructor Destroy; override;  
private
FVolumeVersion:Word;  
 
FRevision:Byte; Revision
FControl:Word; Control Flags
FSacl:PACL; SACL
FDacl:PACL; DACL
FOwner:PSID; Owner SID
FGroup:PSID; Group SID
 
procedure SetSacl(ASacl:PACL);  
procedure SetDacl(ADacl:PACL);  
procedure SetOwner(AOwner:PSID);  
procedure SetGroup(AGroup:PSID);  
procedure SetSaclSize(ASize:Word);  
procedure SetDaclSize(ASize:Word);  
procedure SetOwnerSize(ASize:Word);  
procedure SetGroupSize(ASize:Word);  
public
property VolumeVersion:Word read FVolumeVersion;  
 
property Revision:Byte read FRevision write FRevision;  
property Control:Word read FControl write FControl;  
property Sacl:PACL read FSacl write SetSacl;  
property Dacl:PACL read FDacl write SetDacl;  
property Owner:PSID read FOwner write SetOwner;  
property Group:PSID read FGroup write SetGroup;  
 
function SaclSize:Word;  
function DaclSize:Word;  
function OwnerSize:Word;  
function GroupSize:Word;  
function SaclOffset:LongWord; Offset to SACL
function DaclOffset:LongWord; Offset to DACL
function OwnerOffset:LongWord; Offset to Owner SID
function GroupOffset:LongWord; Offset to Group SID
 
function SaclOffsetEx(ALocal:Boolean):LongWord; Offset to SACL
function DaclOffsetEx(ALocal:Boolean):LongWord; Offset to DACL
function OwnerOffsetEx(ALocal:Boolean):LongWord; Offset to Owner SID
function GroupOffsetEx(ALocal:Boolean):LongWord; Offset to Group SID
 
function SecuritySize:LongWord; override;  
function SecurityHash:LongWord;  
 
function SecurityDescriptor:Pointer; override;  
function SecurityDescriptorEx(ALocal:Boolean):Pointer; override;  
function InheritedDescriptor:Pointer; override;  
function MergedDescriptor(AChild:Pointer):Pointer; override;  
function ReleaseDescriptor(ADescriptor:Pointer; AInherited,AMerged:Boolean):Boolean; override;  
 
function CopyToSecurity(ASecurity:TDiskSecurity):Boolean; override;  
 
function CopyToDescriptor(ADescriptor:Pointer; ASize:LongWord):Boolean; override;  
function CopyToDescriptorEx(ADescriptor:Pointer; ASize:LongWord; ALocal:Boolean):Boolean; override;  
function CopyFromDescriptor(ADescriptor:Pointer; ASize:LongWord):Boolean; override;  
 
function ReadSecurity(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteSecurity(ABuffer:Pointer; var AOffset,ASize:LongWord; AVersion:Word):Boolean;  
function WriteSecurityEx(ABuffer:Pointer; var AOffset,ASize:LongWord; ALocal:Boolean; AVersion:Word):Boolean;  

NTFS security Id

TNTFSSecurityId = class(TObject)

Note: Data of index $SII in file $Secure (Not Used)
 
private
 
public
 

NTFS security hash

TNTFSSecurityHash = class(TObject)

Note: Data of index $SDH in file $Secure (Not Used)
 
private
 
public
 


Public variables


None defined

Function declarations


None defined


Return to Unit Reference