windows-nt/Source/XPSP1/NT/base/fs/utils/untfs/inc/ntfssa.hxx
2020-09-26 16:20:57 +08:00

1392 lines
40 KiB
C++

/*++
Copyright (c) 1991-2001 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"
DECLARE_CLASS( NTFS_INDEX_TREE );
DECLARE_CLASS( NTFS_MFT_INFO );
#include "indxtree.hxx"
#define CHKDSK_ALGORITHM_NOT_SPECIFIED 0xffff
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;
VCN UsnJournalFileNumber;
VCN ReparseFileNumber;
BOOLEAN Verbose;
ULONG NumFiles;
ULONG BaseFrsCount;
BIG_INT TotalNumFileNames;
PUSHORT NumFileNames; // array of length 'NumFiles'
PSHORT ReferenceCount; // array of length 'NumFiles'
NTFS_BITMAP FilesWithIndices;
ULONG CountFilesWithIndices;
NTFS_BITMAP IndexEntriesToCheck;
BOOLEAN IndexEntriesToCheckIsSet;
NUMBER_SET FilesWithEas;
NUMBER_SET ChildFrs;
NUMBER_SET BadFiles;
NTFS_BITMAP 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;
NTFS_BITMAP FilesWithReparsePoint;
ULONG TotalNumSID;
ULONG ExitStatus; // To be returned to chkdsk.exe
#if defined(_AUTOCHECK_)
ULONG AvailablePages;
#endif
};
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_UPCASE_TABLE );
DECLARE_CLASS( DIGRAPH );
DECLARE_CLASS( NTFS_LOG_FILE );
DECLARE_CLASS( NTFS_MFT_FILE );
//
// Types of message for SynchronizeMft()
//
enum MessageMode {
CorrectMessage = 0,
SuppressMessage,
UpdateMessage
};
// This global variable used by CHKDSK to compute the largest
// LSN on the volume.
extern LSN LargestLsnEncountered;
extern LARGE_INTEGER LargestUsnEncountered;
extern ULONG64 FrsOfLargestUsnEncountered;
CONST ULONG LsnResetThreshholdHighPart = 0x10000;
CONST UCHAR UpdateSequenceArrayCheckValueMinorError = 2;// should always be non-zero
CONST UCHAR UpdateSequenceArrayCheckValueOk = 1; // should always be non-zero
BOOLEAN
ExtractExtendInfo(
IN OUT PNTFS_INDEX_TREE Index,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PMESSAGE Message
);
BOOLEAN
UpdateChkdskInfo(
IN OUT PNTFS_FRS_STRUCTURE Frs,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PMESSAGE Message
);
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,
IN LCN CvtStartZone DEFAULT 0,
IN BIG_INT CvtZoneSize DEFAULT 0
);
VIRTUAL
PVOID
GetBuf(
);
VIRTUAL
BOOLEAN
Create(
IN PCNUMBER_SET BadSectors,
IN OUT PMESSAGE Message,
IN PCWSTRING Label DEFAULT NULL,
IN ULONG Flags DEFAULT FORMAT_BACKWARD_COMPATIBLE,
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 BOOLEAN BackwardCompatible,
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 BOOLEAN BackwardCompatible,
IN BOOLEAN IsConvert,
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 ULONG Flags,
IN ULONG DesiredLogFileSize DEFAULT 0,
IN USHORT Algorithm 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
SetVolumeFlag(
IN USHORT FlagsToSet,
OUT PBOOLEAN CorruptVolume DEFAULT NULL
);
NONVIRTUAL
ULONG
QueryFrsSize(
) CONST;
NONVIRTUAL
PARTITION_SYSTEM_ID
QuerySystemId(
) CONST;
NONVIRTUAL
LCN
QueryCvtZone(
) CONST;
NONVIRTUAL
BIG_INT
QueryCvtZoneSize(
) CONST;
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
WriteRemainingBootCode(
);
UNTFS_EXPORT
NONVIRTUAL
USHORT
QueryVolumeFlagsAndLabel(
OUT PBOOLEAN CorruptVolume DEFAULT NULL,
OUT PUCHAR MajorVersion DEFAULT NULL,
OUT PUCHAR MinorVersion DEFAULT NULL,
OUT PWSTRING Label DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
ClearVolumeFlag(
IN USHORT FlagsToClear,
IN OUT PNTFS_LOG_FILE LogFile OPTIONAL,
IN BOOLEAN WriteSecondLogFilePage OPTIONAL,
IN LSN LargestVolumeLsn OPTIONAL,
OUT PBOOLEAN CorruptVolume DEFAULT NULL,
IN BOOLEAN UpdateMirror DEFAULT FALSE
);
STATIC
UCHAR
PostReadMultiSectorFixup(
IN OUT PVOID MultiSectorBuffer,
IN ULONG BufferSize,
IN OUT PIO_DP_DRIVE Drive,
IN ULONG VaildSize DEFAULT MAXULONG
);
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 SystemFile,
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
);
NONVIRTUAL
BOOLEAN
DownGradeNtfs(
IN OUT PMESSAGE Message,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo
);
NONVIRTUAL
UCHAR
GetNumberOfStages(
);
NONVIRTUAL
VOID
SetNumberOfStages(
IN UCHAR Number
);
NONVIRTUAL
NTSTATUS
FilesReadAhead(
IN BIG_INT TotalNumberOfFrs,
IN PVCN FirstFrsNumber,
IN PULONG NumberOfFrsToRead,
IN PNTFS_FRS_STRUCTURE FrsStruc1,
IN PNTFS_FRS_STRUCTURE FrsStruc2,
IN PHMEM Hmem1,
IN PHMEM Hmem2,
OUT HANDLE ReadAhead,
IN HANDLE ReadReady,
IN PNTFS_ATTRIBUTE MftData,
IN PNTFS_UPCASE_TABLE UpCaseTable
);
NONVIRTUAL
NTSTATUS
SDReadAhead(
IN BIG_INT TotalNumberOfFrs,
IN PVCN FirstFrsNumber,
IN PULONG NumberOfFrsToRead,
IN PNTFS_FILE_RECORD_SEGMENT Frs1,
IN PNTFS_FILE_RECORD_SEGMENT Frs2,
OUT HANDLE ReadAhead,
IN HANDLE ReadReady,
IN PNTFS_MASTER_FILE_TABLE Mft
);
VOID
PrintFormatReport (
IN OUT PMESSAGE Message,
IN PFILE_FS_SIZE_INFORMATION FsSizeInfo,
IN PFILE_FS_VOLUME_INFORMATION FsVolInfo
);
private:
NONVIRTUAL
BOOLEAN
FetchMftDataAttribute(
IN OUT PMESSAGE Message,
OUT PNTFS_ATTRIBUTE MftData
);
NONVIRTUAL
BOOLEAN
ValidateCriticalFrs(
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PMESSAGE Message,
IN FIX_LEVEL FixLevel
);
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 USHORT Algorithm,
IN BOOLEAN SkipEntriesScan,
IN BOOLEAN SkipCycleScan,
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 OUT PNUMBER_SET BadClusters,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN PCNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
OUT PBOOLEAN Tube,
IN OUT PLONG Order,
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 INDEX_ENTRY_TYPE IndexEntryType,
IN OUT PBOOLEAN RecoveredAttribute,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNUMBER_SET BadClusters,
OUT PINDEX_ENTRY FirstLeafIndexEntry,
OUT PINDEX_ENTRY LastLeafIndexEntry,
IN OUT PLONG Order,
IN ULONG CollationRule,
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,
IN OUT PULONG PercentDone,
IN OUT PBIG_INT NumFileNames,
OUT PBOOLEAN Changes,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN BOOLEAN SkipEntriesScan,
IN BOOLEAN SkipCycleScan,
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 PNTFS_MFT_INFO MftInfo,
IN OUT PDIGRAPH DirectoryDigraph,
IN OUT PULONG PercentDone,
IN OUT PBIG_INT NumFileNames,
OUT PBOOLEAN Changes,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN BOOLEAN SkipCycleScan,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PBOOLEAN DiskErrorsFound
);
NONVIRTUAL
BOOLEAN
ValidateEntriesInIndex2(
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 BOOLEAN SkipCycleScan,
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
ValidateEntriesInReparseIndex(
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 PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PDIGRAPH DirectoryDigraph,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN BOOLEAN SkipCycleScan,
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 BOOLEAN SkipCycleScan,
IN PCNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
OldOrphanRecovery(
IN OUT PNUMBER_SET Orphans,
IN PCNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
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 PNUMBER_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,
OUT PBOOLEAN Errors,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN MessageMode MsgMode
);
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 BOOLEAN SkipEntriesScan,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ValidateUsnJournal(
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
ResetUsns(
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN OUT PNTFS_MASTER_FILE_TABLE Mft
);
NONVIRTUAL
BOOLEAN
FindHighestLsn(
IN OUT PMESSAGE Message,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
OUT PLSN HighestLsn
);
NONVIRTUAL
BOOLEAN
LogFileMayNeedResize(
);
NONVIRTUAL
BOOLEAN
StartProcessingFiles(
IN BIG_INT TotalNumberOfFrs,
IN OUT PBOOLEAN DiskErrorFound,
IN FIX_LEVEL FixLevel,
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PNTFS_BITMAP MftBitmap,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN OUT PNTFS_UPCASE_TABLE UpcaseTable,
IN OUT PNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ProcessFiles(
IN BIG_INT TotalNumberOfFrs,
OUT PVCN FirstFrsNumber,
OUT PULONG NumberOfFrsToRead,
IN OUT PBOOLEAN DiskErrorFound,
IN PNTFS_FRS_STRUCTURE FrsStruc1,
IN PNTFS_FRS_STRUCTURE FrsStruc2,
IN HANDLE ReadReady,
OUT HANDLE ReadAhead,
IN HANDLE ThreadHandle,
IN FIX_LEVEL FixLevel,
IN OUT PNTFS_ATTRIBUTE MftData,
IN OUT PNTFS_BITMAP MftBitmap,
IN OUT PNTFS_BITMAP VolumeBitmap,
IN OUT PNTFS_UPCASE_TABLE UpcaseTable,
IN OUT PNTFS_ATTRIBUTE_COLUMNS AttributeDefTable,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
StartProcessingSD(
IN BIG_INT TotalNumberOfFrs,
IN FIX_LEVEL FixLevel,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_FILE_RECORD_SEGMENT SecurityFrs,
IN OUT PNUMBER_SET BadClusters,
IN OUT PULONG ErrFixedStatus,
IN BOOLEAN SecurityDescriptorStreamPresent,
IN OUT PNUMBER_SET SidEntries,
IN OUT PNUMBER_SET SidEntries2,
IN OUT PBOOLEAN HasErrors,
IN BOOLEAN SkipEntriesScan,
IN OUT PBOOLEAN ChkdskErrCouldNotFix,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ProcessSD(
IN BIG_INT TotalNumberOfFrs,
OUT PVCN FirstFrsNumber,
OUT PULONG NumberOfFrsToRead,
IN PNTFS_FILE_RECORD_SEGMENT Frs1,
IN PNTFS_FILE_RECORD_SEGMENT Frs2,
IN HANDLE ReadReady,
OUT HANDLE ReadAhead,
IN HANDLE ThreadHandle,
IN FIX_LEVEL FixLevel,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_FILE_RECORD_SEGMENT SecurityFrs,
IN OUT PNUMBER_SET BadClusters,
IN OUT PULONG ErrFixedStatus,
IN BOOLEAN SecurityDescriptorStreamPresent,
IN OUT PNUMBER_SET SidEntries,
IN OUT PNUMBER_SET SidEntries2,
IN OUT PBOOLEAN HasErrors,
IN BOOLEAN SkipEntriesScan,
IN OUT PBOOLEAN ChkdskErrCouldNotFix,
IN OUT PMESSAGE Message
);
NONVIRTUAL
BOOLEAN
ProcessSD2(
IN BIG_INT TotalNumberOfFrs,
IN FIX_LEVEL FixLevel,
IN OUT PNTFS_MASTER_FILE_TABLE Mft,
IN OUT PNTFS_CHKDSK_REPORT ChkdskReport,
IN OUT PNTFS_CHKDSK_INFO ChkdskInfo,
IN OUT PNTFS_FILE_RECORD_SEGMENT SecurityFrs,
IN OUT PNUMBER_SET BadClusters,
IN OUT PULONG ErrFixedStatus,
IN BOOLEAN SecurityDescriptorStreamPresent,
IN OUT PNUMBER_SET SidEntries,
IN OUT PNUMBER_SET SidEntries2,
IN OUT PBOOLEAN HasErrors,
IN BOOLEAN SkipEntriesScan,
IN OUT PBOOLEAN ChkdskErrCouldNotFix,
IN OUT PMESSAGE Message
);
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
UCHAR _NumberOfStages;// minimum number of stages for chkdsk
// to go thru
NONVIRTUAL
VOID
Construct (
);
NONVIRTUAL
VOID
Destroy(
);
BOOLEAN _cleanup_that_requires_reboot;
LCN _cvt_zone; // convert region for mft, logfile, etc.
BIG_INT _cvt_zone_size; // convert region size in terms of clusters
// 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
LCN
NTFS_SA::QueryCvtZone(
) CONST
/*++
Routine Description:
This routine returns the location of the convert zone.
Arguments:
None.
Return Value:
The LCN value of the convert zone.
--*/
{
return _cvt_zone;
}
INLINE
BIG_INT
NTFS_SA::QueryCvtZoneSize(
) CONST
/*++
Routine Description:
This routine returns the size of the convert zone.
Arguments:
None.
Return Value:
The size of the convert zone.
--*/
{
return _cvt_zone_size;
}
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;
}
INLINE
UCHAR
NTFS_SA::GetNumberOfStages(
)
{
return _NumberOfStages;
}
INLINE
VOID
NTFS_SA::SetNumberOfStages(
IN UCHAR Number
)
{
_NumberOfStages = Number;
}
#endif // _NTFS_SUPERAREA_DEFN_