/*++ 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_