NT4/private/utils/untfs/inc/ntfssa.hxx
2020-09-30 17:12:29 +02:00

1011 lines
26 KiB
C++

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
ntfssa.hxx
Abstract:
This class supplies the NTFS-only SUPERAREA methods.
Author:
Norbert P. Kusters (norbertk) 29-Jul-91
--*/
#if !defined(_NTFS_SUPERAREA_DEFN_)
#define _NTFS_SUPERAREA_DEFN_
#include "supera.hxx"
#include "hmem.hxx"
#include "untfs.hxx"
#include "message.hxx"
#include "ntfsbit.hxx"
#include "numset.hxx"
struct NTFS_CHKDSK_REPORT {
BIG_INT NumUserFiles;
BIG_INT BytesUserData;
BIG_INT NumIndices;
BIG_INT BytesInIndices;
BIG_INT BytesLogFile;
};
DEFINE_POINTER_TYPES( NTFS_CHKDSK_REPORT );
struct NTFS_CHKDSK_INFO {
UCHAR major;
UCHAR minor;
VCN QuotaFileNumber;
VCN ObjectIdFileNumber;
ULONG NumFiles;
PUSHORT NumFileNames; // array of length 'NumFiles'
PSHORT ReferenceCount; // array of length 'NumFiles'
NTFS_BITMAP FilesWithIndices;
ULONG CountFilesWithIndices;
NUMBER_SET FilesWithEas;
NUMBER_SET ChildFrs;
NUMBER_SET BadFiles;
NUMBER_SET FilesWhoNeedData;
BOOLEAN CrossLinkYet; // Is the following field valid.
ULONG CrossLinkedFile; // File cross-linked with following.
ULONG CrossLinkedAttribute;
DSTRING CrossLinkedName;
ULONG CrossLinkStart; // Start of cross-linked portion.
ULONG CrossLinkLength; // Length of cross-link.
NUMBER_SET FilesWithNoReferences;
NUMBER_SET FilesWithTooManyFileNames;
NUMBER_SET FilesWithObjectId;
ULONG ExitStatus; // To be returned to chkdsk.exe
};
DEFINE_POINTER_TYPES( NTFS_CHKDSK_INFO );
//
// NTFS_CENSUS_INFO -- this is used by convert to determine how
// much space will be needed to convert an NTFS volume.
//
struct NTFS_CENSUS_INFO {
ULONG NumFiles; // Total number of files on volume.
ULONG BytesLgResidentFiles; // Bytes in "large" resident files.
ULONG BytesIndices; // Bytes in indices.
ULONG BytesExternalExtentLists;
ULONG BytesFileNames; // Total bytes in file name attributes.
};
DEFINE_POINTER_TYPES( NTFS_CENSUS_INFO );
DECLARE_CLASS( LOG_IO_DP_DRIVE );
DECLARE_CLASS( WSTRING );
DECLARE_CLASS( NTFS_MASTER_FILE_TABLE );
DECLARE_CLASS( NTFS_BITMAP );
DECLARE_CLASS( NTFS_FILE_RECORD_SEGMENT );
DECLARE_CLASS( NTFS_ATTRIBUTE );
DECLARE_CLASS( NTFS_ATTRIBUTE_COLUMNS );
DECLARE_CLASS( NTFS_FRS_STRUCTURE );
DECLARE_CLASS( NTFS_ATTRIBUTE_LIST );
DECLARE_CLASS( CONTAINER );
DECLARE_CLASS( SEQUENTIAL_CONTAINER );
DECLARE_CLASS( LIST );
DECLARE_CLASS( NTFS_EXTENT_LIST );
DECLARE_CLASS( NUMBER_SET );
DECLARE_CLASS( NTFS_INDEX_TREE );
DECLARE_CLASS( NTFS_UPCASE_TABLE );
DECLARE_CLASS( DIGRAPH );
DECLARE_CLASS( NTFS_LOG_FILE );
DECLARE_CLASS( NTFS_MFT_FILE );
// This global variable used by CHKDSK to compute the largest
// LSN on the volume.
extern LSN LargestLsnEncountered;
CONST ULONG LsnResetThreshholdHighPart = 0x10000;
class NTFS_SA : public SUPERAREA {
public:
UNTFS_EXPORT
DECLARE_CONSTRUCTOR(NTFS_SA);
VIRTUAL
UNTFS_EXPORT
~NTFS_SA(
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
Initialize(
IN OUT PLOG_IO_DP_DRIVE Drive,
IN OUT PMESSAGE Message
);
VIRTUAL
PVOID
GetBuf(
);
VIRTUAL
BOOLEAN
Create(
IN PCNUMBER_SET BadSectors,
IN OUT PMESSAGE Message,
IN PCWSTRING Label DEFAULT NULL,
IN ULONG ClusterSize DEFAULT 0,
IN ULONG VirtualSectors DEFAULT 0
);
VIRTUAL
BOOLEAN
Create(
IN PCNUMBER_SET BadSectors,
IN ULONG ClusterFactor,
IN ULONG FrsSize,
IN ULONG ClustersPerIndexBuffer,
IN ULONG InitialLogFileSize,
IN OUT PMESSAGE Message,
IN PCWSTRING Label DEFAULT NULL
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
CreateElementaryStructures(
IN OUT PNTFS_BITMAP VolumeBitmap,
IN ULONG ClusterFactor,
IN ULONG FrsSize,
IN ULONG IndexBufferSize,
IN ULONG InitialLogFileSize,
IN PCNUMBER_SET BadSectors,
IN OUT PMESSAGE Message,
IN PBIOS_PARAMETER_BLOCK OldBpb OPTIONAL,
IN PCWSTRING Label DEFAULT NULL
);
STATIC
UNTFS_EXPORT
ULONG
QuerySectorsInElementaryStructures(
IN PCDP_DRIVE Drive,
IN ULONG ClusterFactor DEFAULT 0,
IN ULONG FrsSize DEFAULT 0,
IN ULONG ClustersPerIndexBuffer DEFAULT 0,
IN ULONG InitialLogFileSize DEFAULT 0
);
STATIC
ULONG
QueryDefaultClusterFactor(
IN PCDP_DRIVE Drive
);
STATIC
UNTFS_EXPORT
ULONG
QueryDefaultFrsSize(
IN PCDP_DRIVE Drive,
IN ULONG ClusterFactor
);
STATIC
UNTFS_EXPORT
ULONG
QueryDefaultClustersPerIndexBuffer(
IN PCDP_DRIVE Drive,
IN ULONG ClusterFactor
);
VIRTUAL
BOOLEAN
VerifyAndFix(
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN BOOLEAN Verbose DEFAULT FALSE,
IN BOOLEAN OnlyIfDirty DEFAULT FALSE,
IN BOOLEAN RecoverFree DEFAULT FALSE,
IN BOOLEAN RecoverAlloc DEFAULT FALSE,
IN BOOLEAN ResizeLogFile DEFAULT FALSE,
IN ULONG DesiredLogFileSize DEFAULT 0,
OUT PULONG ExitStatus DEFAULT NULL,
IN PCWSTRING DriveLetter DEFAULT NULL
);
VIRTUAL
BOOLEAN
RecoverFile(
IN PCWSTRING FullPathFileName,
IN OUT PMESSAGE Message
);
UNTFS_EXPORT
BOOLEAN
Read(
);
UNTFS_EXPORT
BOOLEAN
Read(
IN OUT PMESSAGE Message
);
VIRTUAL
BOOLEAN
Write(
);
VIRTUAL
BOOLEAN
Write(
IN OUT PMESSAGE Message
);
NONVIRTUAL
BIG_INT
QueryVolumeSectors(
) CONST;
NONVIRTUAL
VOID
SetVolumeSectors(
BIG_INT NewVolumeSectors
);
NONVIRTUAL
UNTFS_EXPORT
UCHAR
QueryClusterFactor(
) CONST;
NONVIRTUAL
LCN
QueryMftStartingLcn(
) CONST;
NONVIRTUAL
LCN
QueryMft2StartingLcn(
) CONST;
NONVIRTUAL
VOID
SetMftStartingLcn(
IN LCN Lcn
);
NONVIRTUAL
VOID
SetMft2StartingLcn(
IN LCN Lcn
);
UNTFS_EXPORT
NONVIRTUAL
BOOLEAN
SetVolumeDirty(
IN USHORT FlagsToSet,
OUT PBOOLEAN CorruptVolume DEFAULT NULL
);
NONVIRTUAL
ULONG
QueryFrsSize(
) CONST;
NONVIRTUAL
PARTITION_SYSTEM_ID
QuerySystemId(
) CONST;
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
WriteRemainingBootCode(
);
UNTFS_EXPORT
NONVIRTUAL
USHORT
QueryVolumeFlags(
OUT PBOOLEAN CorruptVolume DEFAULT NULL,
OUT PUCHAR MajorVersion DEFAULT NULL,
OUT PUCHAR MinorVersion DEFAULT NULL
) CONST;
NONVIRTUAL
BOOLEAN
SetVolumeClean(
IN USHORT FlagsToClear,
IN OUT PNTFS_LOG_FILE LogFile OPTIONAL,
IN BOOLEAN WriteSecondLogFilePage OPTIONAL,
IN LSN LargestVolumeLsn OPTIONAL,
OUT PBOOLEAN CorruptVolume DEFAULT NULL
);
STATIC
BOOLEAN
PostReadMultiSectorFixup(
IN OUT PVOID MultiSectorBuffer,
IN ULONG BufferSize
);
STATIC
VOID
PreWriteMultiSectorFixup(
IN OUT PVOID MultiSectorBuffer,
IN ULONG BufferSize
);
STATIC
UNTFS_EXPORT
BOOLEAN
IsDosName(
IN PCFILE_NAME FileName
);
STATIC
BOOLEAN
IsValidLabel(
IN PCWSTRING Label
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
QueryFrsFromPath(
IN PCWSTRING FullPathFileName,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNTFS_BITMAP VolumeBitmap,
OUT PNTFS_FILE_RECORD_SEGMENT TargetFrs,
OUT PBOOLEAN InternalError
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
TakeCensus(
IN PNTFS_MASTER_FILE_TABLE Mft,
IN ULONG ResidentSizeThreshhold,
OUT PNTFS_CENSUS_INFO Census
);
STATIC
VOID
SetVersionNumber(
IN UCHAR Major,
IN UCHAR Minor
);
STATIC
VOID
QueryVersionNumber(
OUT PUCHAR Major,
OUT PUCHAR Minor
);
STATIC
BOOLEAN
DumpMessagesToFile(
IN PCWSTRING FileName,
IN OUT PNTFS_MFT_FILE MftFile,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ResizeCleanLogFile(
IN OUT PMESSAGE Message,
IN BOOLEAN AlwaysResize,
IN ULONG DesiredSize
);
private:
NONVIRTUAL
BOOLEAN
FetchMftDataAttribute(
IN OUT PMESSAGE Message,
OUT PNTFS_ATTRIBUTE MftData
);
NONVIRTUAL
BOOLEAN
ValidateCriticalFrs(
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
QueryDefaultAttributeDefinitionTable(
OUT PNTFS_ATTRIBUTE_COLUMNS AttributeDefinitionTable,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
FetchAttributeDefinitionTable(
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PMESSAGE Message,
OUT PNTFS_ATTRIBUTE_COLUMNS AttributeDefinitionTable
);
NONVIRTUAL
BOOLEAN
FetchUpcaseTable(
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PMESSAGE Message,
OUT PNTFS_UPCASE_TABLE UpcaseTable
);
NONVIRTUAL
BOOLEAN
VerifyAndFixMultiFrsFile(
IN OUT PNTFS_FRS_STRUCTURE BaseFrs,
IN OUT PNTFS_ATTRIBUTE_LIST AttributeList,
IN PNTFS_ATTRIBUTE MftData,
IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN OUT PNTFS_BITMAP MftBitmap,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
QueryListOfFrs(
IN PCNTFS_FRS_STRUCTURE BaseFrs,
IN PCNTFS_ATTRIBUTE_LIST AttributeList,
IN OUT PNTFS_ATTRIBUTE MftData,
OUT PNUMBER_SET ChildFileNumbers,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
VerifyAndFixChildFrs(
IN PCNUMBER_SET ChildFileNumbers,
IN PNTFS_ATTRIBUTE MftData,
IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
IN PNTFS_UPCASE_TABLE UpcaseTable,
OUT PHMEM* ChildFrsHmemList,
IN OUT PCONTAINER ChildFrsList,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
EnsureWellDefinedAttrList(
IN PNTFS_FRS_STRUCTURE BaseFrs,
IN OUT PNTFS_ATTRIBUTE_LIST AttributeList,
IN PCSEQUENTIAL_CONTAINER ChildFrsList,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
VerifyAndFixAttribute(
IN PCLIST Attribute,
IN OUT PNTFS_ATTRIBUTE_LIST AttributeList,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN PCNTFS_FRS_STRUCTURE BaseFrs,
OUT PBOOLEAN ErrorsFound,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
EnsureSurjectiveAttrList(
IN OUT PNTFS_FRS_STRUCTURE BaseFrs,
IN PCNTFS_ATTRIBUTE_LIST AttributeList,
IN OUT PSEQUENTIAL_CONTAINER ChildFrsList,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
STATIC
BOOLEAN
AreBitmapsEqual(
IN OUT PNTFS_ATTRIBUTE BitmapAttribute,
IN PCNTFS_BITMAP Bitmap,
IN BIG_INT MinimumBitmapSize OPTIONAL,
IN OUT PMESSAGE Message,
OUT PBOOLEAN CompleteFailure,
OUT PBOOLEAN SecondIsSubset DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
ValidateIndices(
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
OUT PDIGRAPH DirectoryDigraph,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNUMBER_SET BadClusters,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
VerifyAndFixIndex(
IN PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_ATTRIBUTE RootIndex,
IN OUT PNTFS_ATTRIBUTE IndexAllocation OPTIONAL,
OUT PNTFS_BITMAP AllocationBitmap OPTIONAL,
IN VCN FileNumber,
IN PCWSTRING AttributeName,
IN OUT PNUMBER_SET BadClusters,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
OUT PBOOLEAN Tube,
IN FIX_LEVEL Fixlevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
TraverseIndexTree(
IN OUT PINDEX_HEADER IndexHeader,
IN ULONG IndexLength,
IN OUT PNTFS_ATTRIBUTE IndexAllocation OPTIONAL,
IN OUT PNTFS_BITMAP AllocationBitmap OPTIONAL,
IN ULONG BytesPerBlock,
OUT PBOOLEAN Tube,
OUT PBOOLEAN Changes,
IN VCN FileNumber,
IN PCWSTRING AttributeName,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
ValidateEntriesInIndex(
IN OUT PNTFS_INDEX_TREE Index,
IN OUT PNTFS_FILE_RECORD_SEGMENT IndexFrs,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PDIGRAPH DirectoryDigraph,
OUT PBOOLEAN Changes,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
ValidateEntriesInObjIdIndex(
IN OUT PNTFS_INDEX_TREE Index,
IN OUT PNTFS_FILE_RECORD_SEGMENT IndexFrs,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
OUT PBOOLEAN Changes,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
RecoverOrphans(
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PDIGRAPH DirectoryDigraph,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ProperOrphanRecovery(
IN OUT PNUMBER_SET Orphans,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PDIGRAPH DirectoryDigraph,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
OldOrphanRecovery(
IN OUT PNUMBER_SET Orphans,
IN PCNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_FILE_RECORD_SEGMENT RootFrs,
IN OUT PNTFS_INDEX_TREE RootIndex,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
HotfixMftData(
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN PCNUMBER_SET UnreadableFrs,
OUT PNUMBER_SET BadClusters,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
SynchronizeMft(
IN OUT PNTFS_INDEX_TREE RootIndex,
IN PNTFS_MASTER_FILE_TABLE InternalMft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
CheckAllForData(
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ValidateSecurityDescriptors(
IN PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNUMBER_SET BadClusters,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
CheckExtendSystemFiles(
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ResetLsns(
IN OUT PMESSAGE Message,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN BOOLEAN SkipRootIndex
);
NONVIRTUAL
BOOLEAN
FindHighestLsn(
IN OUT PMESSAGE Message,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
OUT PLSN HighestLsn
);
NONVIRTUAL
BOOLEAN
LogFileMayNeedResize(
) CONST;
HMEM _hmem; // memory for SECRUN
PPACKED_BOOT_SECTOR _boot_sector; // packed boot sector
BIOS_PARAMETER_BLOCK _bpb; // unpacked BPB
BIG_INT _boot2; // alternate boot sector
BIG_INT _boot3; // second alternate boot sector
NONVIRTUAL
VOID
Construct (
);
NONVIRTUAL
VOID
Destroy(
);
// This version number is used to determine what format
// is used for the compressed mapping pairs of sparse
// files. Ideally, this information should be tracked
// on a per-volume basis; however, that would require
// extensive changes to the UNTFS class interfaces.
//
STATIC UCHAR _MajorVersion, _MinorVersion;
};
INLINE
PVOID
NTFS_SA::GetBuf(
)
/*++
Routine Description:
This routine returns a pointer to the write buffer for the NTFS
SUPERAREA. This routine also packs the bios parameter block.
Arguments:
None.
Return Value:
A pointer to the write buffer.
--*/
{
PackBios(&_bpb, &(_boot_sector->PackedBpb));
return SECRUN::GetBuf();
}
INLINE
BOOLEAN
NTFS_SA::Write(
)
/*++
Routine Description:
This routine simply calls the other write with the default message
object.
Arguments:
None.
Return Value:
FALSE - Failure.
TRUE - Success.
--*/
{
MESSAGE msg;
return Write(&msg);
}
INLINE
BIG_INT
NTFS_SA::QueryVolumeSectors(
) CONST
/*++
Routine Description:
This routine returns the number of sectors on the volume as recorded in
the boot sector.
Arguments:
None.
Return Value:
The number of volume sectors.
--*/
{
return _boot_sector->NumberSectors;
}
INLINE
VOID
NTFS_SA::SetVolumeSectors(
BIG_INT NewNumberOfSectors
)
/*++
Routine Description:
This routine sets the number of sectors on the volume
in the boot sector.
Arguments:
NewVolumeSectors -- Supplies the new value of the number
of sectors on the volume.
Return Value:
None.
--*/
{
_boot_sector->NumberSectors.LowPart = NewNumberOfSectors.GetLowPart();
_boot_sector->NumberSectors.HighPart = NewNumberOfSectors.GetHighPart();
}
INLINE
LCN
NTFS_SA::QueryMftStartingLcn(
) CONST
/*++
Routine Description:
This routine returns the starting logical cluster number
for the Master File Table.
Arguments:
None.
Return Value:
The starting LCN for the MFT.
--*/
{
return _boot_sector->MftStartLcn;
}
INLINE
LCN
NTFS_SA::QueryMft2StartingLcn(
) CONST
/*++
Routine Description:
This routine returns the starting logical cluster number
for the mirror of the Master File Table.
Arguments:
None.
Return Value:
The starting LCN for the mirror of the MFT.
--*/
{
return _boot_sector->Mft2StartLcn;
}
INLINE
ULONG
NTFS_SA::QueryFrsSize(
) CONST
/*++
Routine Description:
This routine computes the number of clusters per file record segment.
Arguments:
None.
Return Value:
The number of clusters per file record segment.
--*/
{
if (_boot_sector->ClustersPerFileRecordSegment < 0) {
LONG temp = LONG(_boot_sector->ClustersPerFileRecordSegment);
return 1 << -temp;
}
return _boot_sector->ClustersPerFileRecordSegment *
_bpb.SectorsPerCluster * _drive->QuerySectorSize();
}
INLINE
PARTITION_SYSTEM_ID
NTFS_SA::QuerySystemId(
) CONST
/*++
Routine Description:
This routine computes the system ID for the volume.
Arguments:
None.
Return Value:
The system ID for the volume.
--*/
{
// unreferenced parameters
(void)(this);
return SYSID_IFS;
}
INLINE
VOID
NTFS_SA::SetMftStartingLcn(
IN LCN Lcn
)
/*++
836a861,879
Routine Description:
This routine sets the starting logical cluster number
for the Master File Table.
Arguments:
Lcn - The starting lcn.
Return Value:
None.
--*/
{
_boot_sector->MftStartLcn = Lcn;
}
INLINE
VOID
NTFS_SA::SetMft2StartingLcn(
IN LCN Lcn
)
/*++
Routine Description:
This routine sets the starting logical cluster number
for the mirror of the Master File Table.
Arguments:
Lcn - the starting lcn.
Return Value:
None.
--*/
{
_boot_sector->Mft2StartLcn = Lcn;
}
#endif // _NTFS_SUPERAREA_DEFN_