diff options
Diffstat (limited to 'private/utils/ufat/inc/rfatsa.hxx')
-rw-r--r-- | private/utils/ufat/inc/rfatsa.hxx | 986 |
1 files changed, 986 insertions, 0 deletions
diff --git a/private/utils/ufat/inc/rfatsa.hxx b/private/utils/ufat/inc/rfatsa.hxx new file mode 100644 index 000000000..192102af4 --- /dev/null +++ b/private/utils/ufat/inc/rfatsa.hxx @@ -0,0 +1,986 @@ +/*++ + +Copyright (c) 1990 Microsoft Corporation + +Module Name: + + rfatsa.hxx + +Abstract: + +Author: + + Mark Shavlik (marks) 27-Mar-90 + Norbert Kusters (norbertk) 15-Jan-91 + Matthew Bradburn (mattbr) 01-Oct-93 + +--*/ + +#ifndef REAL_FAT_SA_DEFN +#define REAL_FAT_SA_DEFN + +#include "hmem.hxx" +#include "message.hxx" +#include "fatsa.hxx" +#include "bpb.hxx" + +#if defined ( _AUTOCHECK_ ) +#define UFAT_EXPORT +#elif defined ( _UFAT_MEMBER_ ) +#define UFAT_EXPORT __declspec(dllexport) +#else +#define UFAT_EXPORT __declspec(dllimport) +#endif + +// +// Forward references +// + +DECLARE_CLASS( ARRAY ); +DECLARE_CLASS( BITVECTOR ); +DECLARE_CLASS( EA_HEADER ); +DECLARE_CLASS( FAT ); +DECLARE_CLASS( FAT_SA ); +DECLARE_CLASS( FAT_DIRENT ); +DECLARE_CLASS( FATDIR ); +DECLARE_CLASS( GENERIC_STRING ); +DECLARE_CLASS( INTSTACK ); +DECLARE_CLASS( NUMBER_SET ); +DECLARE_CLASS( LOG_IO_DP_DRIVE ); +DECLARE_CLASS( MESSAGE ); +DECLARE_CLASS( ROOTDIR ); +DECLARE_CLASS( SORTED_LIST ); +DECLARE_CLASS( TIMEINFO ); +DECLARE_CLASS( WSTRING ); +DEFINE_POINTER_TYPES( PFATDIR ); + +class REAL_FAT_SA : public FAT_SA { + + public: + + UFAT_EXPORT + DECLARE_CONSTRUCTOR(REAL_FAT_SA); + + VIRTUAL + UFAT_EXPORT + ~REAL_FAT_SA( + ); + + NONVIRTUAL + UFAT_EXPORT + BOOLEAN + Initialize( + IN OUT PLOG_IO_DP_DRIVE Drive, + IN OUT PMESSAGE Message, + IN BOOLEAN Formatted DEFAULT TRUE + ); + + NONVIRTUAL + BOOLEAN + Create( + IN PCNUMBER_SET BadSectors, + IN OUT PMESSAGE Message, + IN PCWSTRING Label DEFAULT NULL, + IN ULONG ClusterSize DEFAULT 0, + IN ULONG VirtualSize DEFAULT 0 + ); + + NONVIRTUAL + BOOLEAN + RecoverFile( + IN PCWSTRING FullPathFileName, + IN OUT PMESSAGE Message + ); + + NONVIRTUAL + UFAT_EXPORT + BOOLEAN + Read( + IN OUT PMESSAGE Message + ); + + NONVIRTUAL + BOOLEAN + Write( + IN OUT PMESSAGE Message + ); + + NONVIRTUAL + VOID + QueryGeometry( + OUT PUSHORT SectorSize, + OUT PUSHORT SectorsPerTrack, + OUT PUSHORT Heads, + OUT PULONG HiddenSectors + ); + + NONVIRTUAL + USHORT + QuerySectorsPerCluster( + ) CONST; + + NONVIRTUAL + USHORT + QuerySectorsPerFat( + ) CONST; + + NONVIRTUAL + USHORT + QueryReservedSectors( + ) CONST; + + NONVIRTUAL + USHORT + QueryFats( + ) CONST; + + NONVIRTUAL + USHORT + QueryRootEntries( + ) CONST; + + NONVIRTUAL + PARTITION_SYSTEM_ID + QuerySystemId( + ) CONST; + + NONVIRTUAL + LBN + QueryStartDataLbn( + ) CONST; + + NONVIRTUAL + USHORT + QueryClusterCount( + ) CONST; + + NONVIRTUAL + UFAT_EXPORT + SECTORCOUNT + QueryFreeSectors( + ) CONST; + + NONVIRTUAL + FATTYPE + QueryFatType( + ) CONST; + + NONVIRTUAL + BYTE + QueryVolumeFlags( + ) CONST; + + NONVIRTUAL + VOID + SetVolumeFlags( + BYTE Flags, + BOOLEAN ResetFlags + ); + + NONVIRTUAL + BOOLEAN + RecoverChain( + IN OUT PUSHORT StartingCluster, + OUT PBOOLEAN ChangesMade, + IN USHORT EndingCluster DEFAULT 0, + IN BOOLEAN Replace DEFAULT FALSE + ); + + STATIC + USHORT + ComputeSecClus( + IN SECTORCOUNT Sectors, + IN FATTYPE FatType, + IN MEDIA_TYPE MediaType + ); + + NONVIRTUAL + BOOLEAN + IsCompressed( + ) CONST; + + NONVIRTUAL + BOOLEAN + ReadSectorZero( + ); + + NONVIRTUAL + PBIOS_PARAMETER_BLOCK + GetBpb( + ); + + private: + + HMEM _mem; // memory for SECRUN + + // _fat inherited from FAT_SA + // _fattype inherited from FAT_SA + // _dir inherited from FAT_SA + + LBN _StartDataLbn; // LBN of files, or data area + USHORT _ClusterCount; // number of clusters in Super Area + PARTITION_SYSTEM_ID _sysid; // system id + ULONG _sec_per_boot; // sectors for boot code. + EXTENDED_BIOS_PARAMETER_BLOCK + _sector_zero; + PUCHAR _sector_sig; // sector signature + + NONVIRTUAL + VOID + Construct( + ); + + NONVIRTUAL + VOID + Destroy( + ); + + NONVIRTUAL + BOOLEAN + SetBpb( + IN ULONG ClusterSize + ); + + NONVIRTUAL + BOOLEAN + SetBpb( + ); + + NONVIRTUAL + BOOLEAN + DupFats( + ); + + NONVIRTUAL + LBN + ComputeStartDataLbn( + ) CONST; + + NONVIRTUAL + USHORT + ComputeRootEntries( + ) CONST; + + NONVIRTUAL + BOOLEAN + ValidateDirent( + IN OUT PFAT_DIRENT Dirent, + IN PCWSTRING FilePath, + IN FIX_LEVEL FixLevel, + IN BOOLEAN RecoverAlloc, + IN OUT PMESSAGE Message, + IN OUT PBOOLEAN NeedErrorsMessage, + IN OUT PBITVECTOR FatBitMap, + OUT PBOOLEAN CrossLinkDetected, + OUT PUSHORT CrossLinkPreviousCluster + ); + + NONVIRTUAL + BOOLEAN + CopyClusters( + IN USHORT SourceChain, + OUT PUSHORT DestChain, + IN OUT PBITVECTOR FatBitMap, + IN FIX_LEVEL FixLevel, + IN OUT PMESSAGE Message + ); + + NONVIRTUAL + BOOLEAN + InitRelocationList( + IN OUT PINTSTACK RelocationStack, + IN OUT PUSHORT RelocatedChain, + IN OUT PSORTED_LIST ClustersToRelocate, + OUT PBOOLEAN Relocated + ); + + NONVIRTUAL + BOOLEAN + RelocateFirstCluster( + IN OUT PFAT_DIRENT Dirent + ); + + NONVIRTUAL + USHORT + RelocateOneCluster( + IN USHORT Cluster, + IN USHORT Previous + ); + + NONVIRTUAL + BOOLEAN + DoDirectoryCensusAndRelocation( + IN OUT PFATDIR Directory, + IN OUT PCENSUS_REPORT CensusReport, + IN OUT PSORTED_LIST ClustersToRelocate, + IN OUT PUSHORT RelocatedChain, + OUT PBOOLEAN Relocated + ); + + NONVIRTUAL + BOOLEAN + DoVolumeCensusAndRelocation( + IN OUT PCENSUS_REPORT CensusReport, + IN OUT PSORTED_LIST ClustersToRelocate, + IN OUT PUSHORT RelocatedChain, + OUT PBOOLEAN Relocated + ); + + NONVIRTUAL + ULONG + SecPerBoot( + ); + + NONVIRTUAL + VOLID + QueryVolId( + ) CONST; + + NONVIRTUAL + VOLID + SetVolId( + IN VOLID VolId + ); + + NONVIRTUAL + UCHAR + QueryMediaByte( + ) CONST; + + VIRTUAL + VOID + SetMediaByte( + UCHAR MediaByte + ); + + NONVIRTUAL + BOOLEAN + VerifyBootSector( + ); + + NONVIRTUAL + SECTORCOUNT + QueryVirtualSectors( + ) CONST; + + NONVIRTUAL + BOOLEAN + CreateBootSector( + IN ULONG ClusterSize + ); + + BOOLEAN + REAL_FAT_SA::SetBootCode( + ); + + NONVIRTUAL + BOOLEAN + SetPhysicalDriveType( + IN PHYSTYPE PhysType + ); + + NONVIRTUAL + BOOLEAN + SetOemData( + ); + + NONVIRTUAL + BOOLEAN + SetSignature( + ); + + NONVIRTUAL + BOOLEAN + SetBootSignature( + IN UCHAR Signature DEFAULT sigBOOTSTRAP + ); + + BOOLEAN + DosSaInit( + IN OUT PMEM Mem, + IN OUT PLOG_IO_DP_DRIVE Drive, + IN SECTORCOUNT NumberOfSectors, + IN OUT PMESSAGE Message + ); + + BOOLEAN + DosSaSetBpb( + ); + + BOOLEAN + RecoverOrphans( + IN OUT PBITVECTOR FatBitMap, + IN FIX_LEVEL FixLevel, + IN OUT PMESSAGE Message, + IN OUT PBOOLEAN NeedErrorsMessage + ); + + NONVIRTUAL + ULONG + QuerySectorFromCluster( + IN ULONG Cluster, + OUT PUCHAR NumSectors DEFAULT NULL + ); + + NONVIRTUAL + BOOLEAN + IsClusterCompressed( + IN ULONG Cluster + ) CONST; + + NONVIRTUAL + VOID + SetClusterCompressed( + IN ULONG Cluster, + IN BOOLEAN fCompressed + ); + + NONVIRTUAL + UCHAR + QuerySectorsRequiredForPlainData( + IN ULONG Cluster + ); + + NONVIRTUAL + BOOLEAN + VerifyFatExtensions( + IN FIX_LEVEL FixLevel, + IN PMESSAGE Message, + IN PBOOLEAN pfNeedMsg + ); + + NONVIRTUAL + BOOLEAN + CheckSectorHeapAllocation( + IN FIX_LEVEL FixLevel, + IN PMESSAGE Message, + IN PBOOLEAN pfNeedMsg + ); + + NONVIRTUAL + BOOLEAN + FreeClusterData( + ULONG Cluster + ); + + NONVIRTUAL + BOOLEAN + AllocateClusterData( + ULONG Cluster, + UCHAR NumSectors, + BOOLEAN bCompressed, + UCHAR PlainSize + ); + + +}; + +INLINE +USHORT +REAL_FAT_SA::QuerySectorsPerCluster( + ) CONST +/*++ + +Routine Description: + + This routine computes the number of sectors per cluster for + the volume. + +Arguments: + + None. + +Return Value: + + The number of sectors per cluster for the volume. + +--*/ +{ + return _sector_zero.Bpb.SectorsPerCluster ? + _sector_zero.Bpb.SectorsPerCluster : 256; +} + + +INLINE +USHORT +REAL_FAT_SA::QuerySectorsPerFat( + ) CONST +/*++ + +Routine Description: + + This routine computes the number of sectors per FAT for the volume. + +Arguments: + + None. + +Return Value: + + The number of sectors per FAT for the volume. + +--*/ +{ + return _sector_zero.Bpb.SectorsPerFat; +} + + +INLINE +USHORT +REAL_FAT_SA::QueryReservedSectors( + ) CONST +/*++ + +Routine Description: + + This routine computes the volume's number of Reserved Sectors, + i.e. the number of sectors before the first FAT. + +Arguments: + + None. + +Return Value: + + The number of Reserved Sectors. + +--*/ +{ + return _sector_zero.Bpb.ReservedSectors; +} + +INLINE +USHORT +REAL_FAT_SA::QueryFats( + ) CONST +/*++ + +Routine Description: + + This routine computes the number of FATs on the volume. + +Arguments: + + None. + +Return Value: + + The number of FATs on the volume. + +--*/ +{ + return _sector_zero.Bpb.Fats; +} + +INLINE +USHORT +REAL_FAT_SA::QueryRootEntries( + ) CONST +/*++ + +Routine Description: + + This routine returns the number of entries in the root + directory. + +Arguments: + + None. + +Return Value: + + The number of root directory entries. + +--*/ +{ + return _sector_zero.Bpb.RootEntries; +} + + +INLINE +PARTITION_SYSTEM_ID +REAL_FAT_SA::QuerySystemId( + ) CONST +/*++ + +Routine Description: + + This routine computes the system ID for the volume. + +Arguments: + + None. + +Return Value: + + The system ID for the volume. + +--*/ +{ + return _sysid; +} + + +INLINE +LBN +REAL_FAT_SA::QueryStartDataLbn( + ) CONST +/*++ + +Routine Description: + + This routine computes the LBN of the first logical cluster of the + volume. + +Arguments: + + None. + +Return Value: + + The LBN of the first logical cluster of the volume. + +--*/ +{ + return _StartDataLbn; +} + + +INLINE +USHORT +REAL_FAT_SA::QueryClusterCount( + ) CONST +/*++ + +Routine Description: + + This routine computes the total number of clusters for the volume. + That is to say that the largest addressable cluster on the disk + is cluster number 'QueryClusterCount() - 1'. Note that the + smallest addressable cluster on the disk is 2. + +Arguments: + + None. + +Return Value: + + The total number of clusters for the volume. + +--*/ +{ + return _ClusterCount; +} + +INLINE BOOLEAN +REAL_FAT_SA::IsCompressed( + ) CONST +/*++ + +Routine Description: + + This routine tells whether this volume is doublespaced or not. + Since the class is REAL_FAT_SA, we know it's not. + +Arguments: + +Return Value: + + TRUE - Compressed. + FALSE - Not compressed. + +--*/ +{ + return FALSE; +} + +INLINE BOOLEAN +REAL_FAT_SA::ReadSectorZero( + ) +/*++ + +Routine Description: + + This routine used to be DOS_SUPERAREA::Read(). + +Arguments: + +Return Value: + + TRUE - Success. + FALSE - Failure. + +--*/ +{ + BOOLEAN b; + PEXTENDED_BIOS_PARAMETER_BLOCK Pbios; + + b = SECRUN::Read(); + if (!b) + return FALSE; + + Pbios = (PEXTENDED_BIOS_PARAMETER_BLOCK)SECRUN::GetBuf(); + UnpackExtendedBios(&_sector_zero, Pbios); + + return TRUE; +} + +INLINE +PBIOS_PARAMETER_BLOCK +REAL_FAT_SA::GetBpb( + ) +{ + return &(_sector_zero.Bpb); +} + + + +INLINE +UCHAR +REAL_FAT_SA::QueryMediaByte( + ) CONST +/*++ + +Routine Description: + + This routine fetches the media byte from the super area's data. + +Arguments: + + None. + +Return Value: + + The media byte residing in the super area. + +--*/ +{ + return _sector_zero.Bpb.Media; +} + +INLINE +VOID +REAL_FAT_SA::SetMediaByte( + UCHAR MediaByte + ) +/*++ + +Routine Description: + + This routine sets the media byte in the super area's data. + +Arguments: + + MediaByte -- Supplies the new media byte. + +Return Value: + + None. + +--*/ +{ + _sector_zero.Bpb.Media = MediaByte; +} + +INLINE +SECTORCOUNT +REAL_FAT_SA::QueryVirtualSectors( + ) CONST +/*++ + +Routine Description: + + This routine computes the number of sectors on the volume according + to the file system. + +Arguments: + + None. + +Return Value: + + The number of sectors on the volume according to the file system. + +--*/ +{ + return _sector_zero.Bpb.Sectors ? _sector_zero.Bpb.Sectors : + _sector_zero.Bpb.LargeSectors; +} + +INLINE +VOLID +REAL_FAT_SA::QueryVolId( + ) CONST +/*++ + +Routine Description: + + This routine fetches the volume ID from the super area's data. + This routine will return 0 if volume serial numbers are not + supported by the partition. + +Arguments: + + None. + +Return Value: + + The volume ID residing in the super area. + +--*/ +{ + return (_sector_zero.Signature == 0x28 || _sector_zero.Signature == 0x29) ? + _sector_zero.SerialNumber : 0; +} + +INLINE +VOLID +REAL_FAT_SA::SetVolId( + IN VOLID VolId + ) +/*++ + +Routine Description: + + This routine puts the volume ID into the super area's data. + +Arguments: + + VolId - The new volume ID. + +Return Value: + + The volume ID that was put. + +--*/ +{ + return _sector_zero.SerialNumber = VolId; +} + +INLINE +BOOLEAN +REAL_FAT_SA::SetBootSignature( + IN UCHAR Signature + ) +/*++ + +Routine Description: + + This routine sets the boot signature in the super area. + +Arguments: + + Signature - Supplies the character to set the signature to. + +Return Value: + + FALSE - Failure. + TRUE - Success. + +--*/ +{ + _sector_zero.Signature = Signature; + return TRUE; +} + +INLINE +VOID +REAL_FAT_SA::QueryGeometry( + OUT PUSHORT SectorSize, + OUT PUSHORT SectorsPerTrack, + OUT PUSHORT Heads, + OUT PULONG HiddenSectors + ) +/*++ + +Routine Description: + + This method returns the geometry information stored in + the Bios Parameter Block. + +Arguments: + + SectorSize -- Receives the recorded sector size. + SectorsPerTrack -- Receives the recorded sectors per track. + Heads -- Receives the recorded number of heads. + HiddenSectors -- Receives the recorded number of hidden sectors. + +Return Value: + + None. + +--*/ +{ + *SectorSize = _sector_zero.Bpb.BytesPerSector; + *SectorsPerTrack = _sector_zero.Bpb.SectorsPerTrack; + *Heads = _sector_zero.Bpb.Heads; + *HiddenSectors = _sector_zero.Bpb.HiddenSectors; +} + +INLINE +BYTE +REAL_FAT_SA::QueryVolumeFlags( + ) CONST +/*++ + +Routine Description: + + This routine returns the volume flags byte from the bpb. + +Arguments: + + None. + +Return Value: + + The flags. + +--*/ +{ + return _sector_zero.CurrentHead; +} + +INLINE +VOID +REAL_FAT_SA::SetVolumeFlags( + BYTE Flags, + BOOLEAN ResetFlags + ) +/*++ + +Routine Description: + + This routine sets the volume flags in the bpb. + +Arguments: + + Flags -- flags to set or clear + ResetFlags -- if true, Flags are cleared instead of set + +Return Value: + + None. + +--*/ +{ + if (ResetFlags) { + _sector_zero.CurrentHead &= ~Flags; + } else { + _sector_zero.CurrentHead |= Flags; + } +} + +INLINE +BOOLEAN +AllocateClusterData( + ULONG Cluster, + UCHAR NumSectors, + BOOLEAN bCompressed, + UCHAR PlainSize + ) +{ + DebugAbort("Didn't expect REAL_FAT_SA::AllocateClusterData() to be called"); + return FALSE; +} + +#endif // REAL_FAT_SA_DEFN |