/*++

Copyright (c) 1991	Microsoft Corporation

Module Name:

    mftfile.hxx

Abstract:

    This module contains the declarations for the NTFS_MFT_FILE
	class.	The MFT is the root of the file system

Author:

	Bill McJohn (billmc) 13-June-91

Environment:

    ULIB, User Mode

--*/

#if !defined( _NTFS_MFT_FILE_DEFN_ )

#define _NTFS_MFT_FILE_DEFN_

#include "hmem.hxx"

#include "bitfrs.hxx"
#include "clusrun.hxx"
#include "frs.hxx"
#include "attrib.hxx"
#include "ntfsbit.hxx"
#include "mft.hxx"
#include "mftref.hxx"

DECLARE_CLASS( NTFS_MFT_FILE );


class NTFS_MFT_FILE : public NTFS_FILE_RECORD_SEGMENT {

	public:

        UNTFS_EXPORT
        DECLARE_CONSTRUCTOR( NTFS_MFT_FILE );

		VIRTUAL
        UNTFS_EXPORT
        ~NTFS_MFT_FILE(
			);

		NONVIRTUAL
        UNTFS_EXPORT
        BOOLEAN
		Initialize(
			IN OUT  PLOG_IO_DP_DRIVE    Drive,
			IN      LCN                 Lcn,
			IN      ULONG               ClusterFactor,
            IN      ULONG               FrsSize,
            IN      BIG_INT             VolumeSectors,
            IN OUT  PNTFS_BITMAP        VolumeBitmap    OPTIONAL,
            IN      PNTFS_UPCASE_TABLE  UpcaseTable     OPTIONAL
			);

		NONVIRTUAL
		BOOLEAN
		Create(
			IN      ULONG					InitialSize,
			IN      PCSTANDARD_INFORMATION	StandardInformation,
			IN OUT  PNTFS_BITMAP 			VolumeBitmap
            );

        NONVIRTUAL
        UNTFS_EXPORT
        BOOLEAN
        Read(
            );

		NONVIRTUAL
		BOOLEAN
		AllocateFileRecordSegment(
            OUT PVCN    FileNumber,
            IN  BOOLEAN IsMft
			);

		NONVIRTUAL
        BOOLEAN
		FreeFileRecordSegment(
            IN  VCN SegmentToFree
            );

        NONVIRTUAL
        BOOLEAN
        Extend(
            IN  ULONG   NumberOfSegmentsToAdd
            );

		NONVIRTUAL
        UNTFS_EXPORT
        BOOLEAN
		Flush(
			);

        NONVIRTUAL
        PNTFS_MASTER_FILE_TABLE
        GetMasterFileTable(
            );

	private:

		NONVIRTUAL
		VOID
		Construct(
			);

		NONVIRTUAL
		VOID
		Destroy(
            );

        NONVIRTUAL
        BOOLEAN
        SetUpMft(
            );

        NONVIRTUAL
        BOOLEAN
        CheckMirrorSize(
            IN OUT PNTFS_ATTRIBUTE  MirrorDataAttribute,
            IN     BOOLEAN          Fix,
            IN OUT PNTFS_BITMAP     VolumeBitmap,
            OUT    PLCN             FirstLcn
            );

        NONVIRTUAL
        BOOLEAN
        WriteMirror(
            IN OUT PNTFS_ATTRIBUTE  MirrorDataAttribute
            );



        LCN                     _FirstLcn;
        NTFS_ATTRIBUTE          _DataAttribute;
        NTFS_BITMAP             _MftBitmap;
        NTFS_MASTER_FILE_TABLE  _Mft;
        PNTFS_BITMAP            _VolumeBitmap;

        HMEM                    _MirrorMem;
        NTFS_CLUSTER_RUN        _MirrorClusterRun;

};


INLINE
BOOLEAN
NTFS_MFT_FILE::AllocateFileRecordSegment(
    OUT PVCN FileNumber,
    IN  BOOLEAN IsMft

	)
/*++

Routine Description:

	Allocate a File Record Segment from the Master File Table.

Arguments:

    FileNumber  -- receives the file number of the allocated segment.
    IsMft       -- supplies a flag which indicates, if TRUE, that
                   the allocation is being made on behalf of the
                   MFT itself.

Return Value:

	TRUE upon successful completion.

--*/
{
    return _Mft.AllocateFileRecordSegment(FileNumber, IsMft);
}


INLINE
BOOLEAN
NTFS_MFT_FILE::FreeFileRecordSegment(
	IN VCN SegmentToFree
	)
/*++

Routine Description:

	Free a File Record Segment in the Master File Table.

Arguments:

	SegmentToFree	-- supplies the virtual cluster number withing
						the Master File Table of the segment to be
						freed.

Return Value:

	TRUE upon successful completion.

--*/
{
    return _Mft.FreeFileRecordSegment(SegmentToFree);
}


INLINE
BOOLEAN
NTFS_MFT_FILE::Extend(
    IN ULONG NumberOfSegmentsToAdd
    )
/*++

Routine Description:

    This method grows the Master File Table.  It increases the
    size of the Data attribute (to hold more File Record Segments)
    and increases the size of the MFT Bitmap to match.

Arguments:

    NumberOfSegmentsToAdd   --  supplies the number of new File Record
                                Segments to add to the Master File Table.

Return Value:

    TRUE upon successful completion.

--*/
{
    return _Mft.Extend(NumberOfSegmentsToAdd);
}


INLINE
PNTFS_MASTER_FILE_TABLE
NTFS_MFT_FILE::GetMasterFileTable(
    )
/*++

Routine Description:

    This routine returns a pointer to master file table.

Arguments:

    None.

Return Value:

    A pointer to the master file table.

--*/
{
    return _Mft.AreMethodsEnabled() ? &_Mft : NULL;
}


#endif