378 lines
8.5 KiB
C++
378 lines
8.5 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990-2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
fatntfs.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the FAT_NTFS conversion class.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Ramon J. San Andres (ramonsa) 23-Sep-1991
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#if !defined( _FAT_NTFS_)
|
|||
|
|
|||
|
#define _FATNTFS_
|
|||
|
|
|||
|
//
|
|||
|
// ULIB header files
|
|||
|
//
|
|||
|
#include "volume.hxx"
|
|||
|
#include "ifsentry.hxx"
|
|||
|
|
|||
|
// IFSUTIL header files
|
|||
|
|
|||
|
#include "numset.hxx"
|
|||
|
|
|||
|
//
|
|||
|
// FAT header files
|
|||
|
//
|
|||
|
#include "fat.hxx"
|
|||
|
#include "rfatsa.hxx"
|
|||
|
#include "eaheader.hxx"
|
|||
|
#include "easet.hxx"
|
|||
|
|
|||
|
//
|
|||
|
// NTFS header files
|
|||
|
//
|
|||
|
#include "untfs.hxx"
|
|||
|
#include "frs.hxx"
|
|||
|
#include "mft.hxx"
|
|||
|
#include "mftfile.hxx"
|
|||
|
#include "mftref.hxx"
|
|||
|
#include "ntfsbit.hxx"
|
|||
|
#include "ntfssa.hxx"
|
|||
|
#include "attrdef.hxx"
|
|||
|
#include "badfile.hxx"
|
|||
|
#include "bootfile.hxx"
|
|||
|
#include "bitfrs.hxx"
|
|||
|
#include "indxtree.hxx"
|
|||
|
#include "upcase.hxx"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Length of a buffer containing an file name.
|
|||
|
//
|
|||
|
#define NAMEBUFFERSIZE 255
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Forward references
|
|||
|
//
|
|||
|
DECLARE_CLASS( EA_HEADER );
|
|||
|
DECLARE_CLASS( FATDIR );
|
|||
|
DECLARE_CLASS( REAL_FAT_SA );
|
|||
|
DECLARE_CLASS( LOG_IO_DP_DRIVE );
|
|||
|
DECLARE_CLASS( MESSAGE );
|
|||
|
DECLARE_CLASS( FAT_NTFS );
|
|||
|
DECLARE_CLASS( NTFS_INDEX_TREE );
|
|||
|
DECLARE_CLASS( NTFS_FILE_RECORD_SEGMENT );
|
|||
|
|
|||
|
|
|||
|
class FAT_NTFS : public OBJECT {
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
DECLARE_CONSTRUCTOR( FAT_NTFS );
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
~FAT_NTFS (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Construct (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Initialize(
|
|||
|
IN OUT PLOG_IO_DP_DRIVE Drive,
|
|||
|
IN OUT PREAL_FAT_SA FatSa,
|
|||
|
IN PCWSTRING CvtZoneFileName,
|
|||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
|||
|
IN ULONG Flags DEFAULT 0
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Convert(
|
|||
|
OUT PCONVERT_STATUS Status
|
|||
|
);
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Destroy (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
CheckSpaceAndCreateHoles (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
LCN
|
|||
|
FatClusterToLcn (
|
|||
|
IN ULONG Cluster
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertDirectory (
|
|||
|
IN PFATDIR Directory,
|
|||
|
IN PFAT_DIRENT DirEntry,
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT FrsDir
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertDir (
|
|||
|
IN PFATDIR Directory,
|
|||
|
IN OUT PNTFS_INDEX_TREE Index,
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT FrsDir
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertExtendedAttributes (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT Frs
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertExtendedAttributes (
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT Frs,
|
|||
|
IN USHORT EaSetClusterNumber
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertFile (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT File
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertFileData (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN PNTFS_FILE_RECORD_SEGMENT Frs
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertFileDataNonResident (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN PNTFS_FILE_RECORD_SEGMENT Frs
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertFileDataResident (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN PNTFS_FILE_RECORD_SEGMENT Frs
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertFileSystem (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertOneExtendedAttribute (
|
|||
|
IN OUT PNTFS_FILE_RECORD_SEGMENT Frs,
|
|||
|
IN PEA Ea
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ConvertRoot (
|
|||
|
IN PFATDIR Directory
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
CreateBitmaps (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
CreateElementary (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
FreeReservedSectors (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
MakeDirectoryFrs (
|
|||
|
IN PFAT_DIRENT Dirent,
|
|||
|
IN PNTFS_FILE_RECORD_SEGMENT ParentFrs,
|
|||
|
OUT PNTFS_FILE_RECORD_SEGMENT FrsDir,
|
|||
|
OUT PNTFS_INDEX_TREE RootIndex
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
QueryNeededHoles (
|
|||
|
OUT PINTSTACK HoleStack
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
QuerySectorsNeededForConversion (
|
|||
|
IN PCENSUS_REPORT Census,
|
|||
|
IN PBIG_INT SectorsNeeded
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
ReserveCluster (
|
|||
|
IN ULONG Cluster
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
CheckGeometryMatch(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
WriteBoot (
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FAT stuff
|
|||
|
//
|
|||
|
PREAL_FAT_SA _FatSa; // Fat SuperArea
|
|||
|
HMEM _EAMemory; // Mem for EAHeader
|
|||
|
EA_HEADER _EAHeader; // EA header
|
|||
|
ULONG _EAFileFirstCluster; // EA file starting cluster
|
|||
|
ULONG _CvtZoneFileFirstCluster; // Convert Zone file starting cluster
|
|||
|
ULONG _CvtZoneSize; // convert zone file size in clusters
|
|||
|
|
|||
|
//
|
|||
|
// NTFS stuff
|
|||
|
//
|
|||
|
NTFS_SA _NtfsSa; // NTFS SuperArea
|
|||
|
ULONG _ClusterFactor; // Cluster factor
|
|||
|
ULONG _ClustersPerIndexBuffer;// Default clusters per index buffer
|
|||
|
|
|||
|
NTFS_BITMAP _ReservedBitmap; // Bitmap of reserved sectors
|
|||
|
NTFS_BITMAP _VolumeBitmap; // Volume Bitmap
|
|||
|
NTFS_UPCASE_TABLE _UpcaseTable; // Volume upcase table.
|
|||
|
NUMBER_SET _BadLcn; // Bad clusters
|
|||
|
ULONG _LogFileClusters; // Size of Log File
|
|||
|
NTFS_MFT_FILE _Mft; // Master File Table File
|
|||
|
DSTRING _RootIndexName; // Root index name
|
|||
|
ULONG _FrsSize;
|
|||
|
|
|||
|
//
|
|||
|
// Other stuff
|
|||
|
//
|
|||
|
PLOG_IO_DP_DRIVE _Drive; // Drive
|
|||
|
PMESSAGE _Message; // Message
|
|||
|
CONVERT_STATUS _Status; // Conversion status
|
|||
|
ULONG _Flags; // Flags passed to convert
|
|||
|
ULONG _NumberOfFiles; // Number of files on disk
|
|||
|
ULONG _NumberOfDirectories; // Number of dirs on disk
|
|||
|
LCN _FreeSectorsBefore; // Free sectors before conversion
|
|||
|
LCN _FreeSectorsAfter; // Free sectors after conversion
|
|||
|
PFILE_NAME _FileNameBuffer; // Buffer for file name attribute
|
|||
|
ULONG _ClusterRatio; // Sectors ratio between NTFS vs FAT clusters
|
|||
|
|
|||
|
#if DBG
|
|||
|
//
|
|||
|
// Debug stuff
|
|||
|
//
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
PrintAtLevel (
|
|||
|
);
|
|||
|
#endif
|
|||
|
|
|||
|
ULONG _Level; // Indentation level for verbose output
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
LCN
|
|||
|
FAT_NTFS::FatClusterToLcn (
|
|||
|
IN ULONG Cluster
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Converts a FAT cluster to an LCN
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Cluster - Supplies the cluster number
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
LCN - The first LCN of the cluster
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return _FatSa->QueryStartDataLbn() + (Cluster - FirstDiskCluster) * _FatSa->QuerySectorsPerCluster();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
FAT_NTFS::PrintAtLevel (
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Prints a certain number of spaces corresponding to the value of
|
|||
|
_Level. Is used to print the directory structure on the debug
|
|||
|
terminal in a nice way.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
ULONG l = _Level;
|
|||
|
|
|||
|
while ( l-- ) {
|
|||
|
DebugPrintTrace(( " " ));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
|
|||
|
#endif // _FAT_NTFS_
|