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

389 lines
7.5 KiB
C++

/*++
Copyright (c) 1999-2001 Microsoft Corporation
Module Name:
mftinfo.hxx
Abstract:
This module contains the declarations for the NTFS_MFT_INFO
class, which stores extracted information from the NTFS MFT.
Author:
Daniel Chan (danielch) Oct 18, 1999
Environment:
ULIB, User Mode
--*/
#if !defined( _NTFS_MFT_INFO_DEFN_ )
#define _NTFS_MFT_INFO_DEFN_
#include "membmgr2.hxx"
DECLARE_CLASS( NTFS_UPCASE_TABLE );
typedef UCHAR FILE_NAME_SIGNATURE[4];
typedef UCHAR DUP_INFO_SIGNATURE[4];
DEFINE_POINTER_AND_REFERENCE_TYPES( FILE_NAME_SIGNATURE );
DEFINE_POINTER_AND_REFERENCE_TYPES( DUP_INFO_SIGNATURE );
struct _NTFS_FILE_NAME_INFO {
FILE_NAME_SIGNATURE Signature;
UCHAR Flags;
UCHAR Reserved[3];
};
struct _NTFS_FRS_INFO {
MFT_SEGMENT_REFERENCE SegmentReference;
DUP_INFO_SIGNATURE DupInfoSignature;
USHORT NumberOfFileNames;
USHORT Reserved;
struct _NTFS_FILE_NAME_INFO FileNameInfo[1];
};
DEFINE_TYPE( _NTFS_FRS_INFO, NTFS_FRS_INFO );
class NTFS_MFT_INFO : public OBJECT {
public:
UNTFS_EXPORT
DECLARE_CONSTRUCTOR( NTFS_MFT_INFO );
VIRTUAL
UNTFS_EXPORT
~NTFS_MFT_INFO(
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
Initialize(
IN BIG_INT NumOfFrs,
IN PNTFS_UPCASE_TABLE UpcaseTable,
IN UCHAR Major,
IN UCHAR Minor,
IN ULONG64 MaxMemUse
);
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
Initialize(
);
NONVIRTUAL
BOOLEAN
IsInRange(
IN VCN FileNumber
);
NONVIRTUAL
VOID
UpdateRange(
IN VCN FileNumber
);
NONVIRTUAL
VCN
QueryMinFileNumber(
);
NONVIRTUAL
VCN
QueryMaxFileNumber(
);
NONVIRTUAL
PVOID
QueryIndexEntryInfo(
IN VCN FileNumber
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
MFT_SEGMENT_REFERENCE
QuerySegmentReference(
IN PVOID FrsInfo
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
CompareFileName(
IN PVOID FrsInfo,
IN ULONG ValueLength,
IN PFILE_NAME FileName,
OUT PUSHORT FileNameIndex
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
BOOLEAN
CompareDupInfo(
IN PVOID FrsInfo,
IN PFILE_NAME FileName
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
UCHAR
QueryFlags(
IN PVOID FrsInfo,
IN USHORT FileNameIndex
);
NONVIRTUAL
BOOLEAN
ExtractIndexEntryInfo(
IN PNTFS_FILE_RECORD_SEGMENT Frs,
IN PMESSAGE Message,
IN BOOLEAN IgnoreFileName,
OUT PBOOLEAN OutOfMemory
);
private:
NONVIRTUAL
VOID
Construct(
);
NONVIRTUAL
VOID
Destroy(
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
VOID
ComputeFileNameSignature(
IN ULONG ValueLength,
IN PFILE_NAME FileName,
OUT FILE_NAME_SIGNATURE Signature
);
STATIC
NONVIRTUAL
UNTFS_EXPORT
VOID
ComputeDupInfoSignature(
IN PDUPLICATED_INFORMATION DupInfo,
OUT DUP_INFO_SIGNATURE Signature
);
VCN _min_file_number;
VCN _max_file_number;
PVOID *_mft_info;
STATIC PNTFS_UPCASE_TABLE _upcase_table;
STATIC UCHAR _major;
STATIC UCHAR _minor;
MEM_ALLOCATOR _mem_mgr;
ULONG64 _max_mem_use;
ULONG _num_of_files;
};
INLINE
VCN
NTFS_MFT_INFO::QueryMinFileNumber(
)
/*++
Routine Description:
This routine returns the minimum file number captured so far.
Arguments:
N/A
Return Value:
Minimum File Number
--*/
{
return _min_file_number;
}
INLINE
VCN
NTFS_MFT_INFO::QueryMaxFileNumber(
)
/*++
Routine Description:
This routine returns the maximum file number captured so far.
Arguments:
N/A
Return Value:
Maximum File Number
--*/
{
return _max_file_number;
}
INLINE
BOOLEAN
NTFS_MFT_INFO::IsInRange(
IN VCN FileNumber
)
/*++
Routine Description:
This routine checks the file number to see if it is within range of
an NTFS_MFT_INFO object.
Arguments:
FileNumber - file number to check
Return Value:
TRUE if FileNumber falls within the range of the NTFS_MFT_INFO object;
otherwise, FALSE.
--*/
{
return (_min_file_number <= FileNumber && FileNumber <= _max_file_number);
}
INLINE
PVOID
NTFS_MFT_INFO::QueryIndexEntryInfo(
IN VCN FileNumber
)
/*++
Routine Description:
This method returns a pointer to a frs information.
Arguments:
FileNumber - file number to check
Return Value:
Pointer to base frs information.
--*/
{
ASSERT(IsInRange(FileNumber));
return _mft_info[FileNumber.GetLowPart()];
}
INLINE
MFT_SEGMENT_REFERENCE
NTFS_MFT_INFO::QuerySegmentReference(
IN PVOID FrsInfo
)
/*++
Routine Description:
This method retrieves the Segment Reference of the frs
from the FrsInfo pointer.
Arguments:
FrsInfo -- Pointer to the FRS information block.
Returns:
Segment Reference of the FRS.
--*/
{
ASSERT(FrsInfo);
return ((PNTFS_FRS_INFO)FrsInfo)->SegmentReference;
}
INLINE
BOOLEAN
NTFS_MFT_INFO::CompareDupInfo(
IN PVOID FrsInfo,
IN PFILE_NAME FileName
)
/*++
Routine Description:
This method compares the given FileName signature to that in FrsInfo.
Arguments:
FrsInfo -- Pointer to the FRS information block.
FileName -- Pointer to the file name.
Returns:
TRUE -- if equals
FALSE -- if not equal
--*/
{
DUP_INFO_SIGNATURE dupinfo;
ASSERT(FrsInfo);
NTFS_MFT_INFO::ComputeDupInfoSignature(&(FileName->Info), dupinfo);
return memcmp(dupinfo,
((PNTFS_FRS_INFO)FrsInfo)->DupInfoSignature,
sizeof(DUP_INFO_SIGNATURE)) == 0;
}
INLINE
UCHAR
NTFS_MFT_INFO::QueryFlags(
IN PVOID FrsInfo,
IN USHORT FileNameIndex
)
/*++
Routine Description:
This method compares the given FileName signature to that in FrsInfo.
Arguments:
FrsInfo -- Pointer to the FRS information block.
FileNameIndex -- Supplies the index of the file name
Returns:
TRUE -- if equals
FALSE -- if not equal
--*/
{
ASSERT(FrsInfo);
ASSERT(((PNTFS_FRS_INFO)FrsInfo)->NumberOfFileNames > FileNameIndex);
return ((PNTFS_FRS_INFO)FrsInfo)->FileNameInfo[FileNameIndex].Flags;
}
#endif