NT4/private/utils/uhpfs/inc/superb.hxx
2020-09-30 17:12:29 +02:00

537 lines
8.5 KiB
C++

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
superb.hxx
Abstract:
This class models the super block on an HPFS volume.
Author:
Dave Gilman (davegi) 23-Jul-90
--*/
#if ! defined( SUPERB_DEFN )
#define SUPERB_DEFN
#include "secrun.hxx"
DECLARE_CLASS( BADBLOCKLIST );
DECLARE_CLASS( HPFS_BITMAP );
DECLARE_CLASS( LOG_IO_DP_DRIVE );
DECLARE_CLASS( MEM );
DECLARE_CLASS( SUPERB );
typedef ULONG HPFSSIG;
typedef BYTE HPFSVER;
typedef ULONG HPFSDATE;
#define SIGSB1 0xF995E849
#define SIGSB2 0xFA53E9C5
#define LBN_SUPERB 16
#define SUPERB_VOLNAME 32
#define SUPERB_SECTORS 1
#define SUPERB_VERSION 2
#define SUPERB_FVERSION_2 2
#define SUPERB_FVERSION_3 3
#define SUPERB_PWLEN 15
struct _SUPERB {
struct _SUPERB_INFO {
HPFSSIG sig1;
HPFSSIG sig2;
HPFSVER bVersion;
HPFSVER bFuncVersion;
USHORT usDummy; // alignment bytes
LBN lbnRootFNode;
SECTORCOUNT culSectsOnVol;
SECTORCOUNT culNumBadSects;
LBN lbnMainrspBitMapIndBlk;
LBN lbnSparerspBitMapIndBlk;
LBN lbnMainrspBadBlkList;
LBN lbnSparerspBadBlkList;
HPFSDATE datLastChkdsk; // date of last CHKDSK
HPFSDATE datLastOptimize; // date of last Disk Optimize
SECTORCOUNT clbndbnd; // count LBN Dirblk Band
LBN lbndbndStart; // first LBN in DIRBLK band
LBN lbndbndEnd; // last LBN in DIRBLK band
LBN lbndbndbmStart; // first LBN of DIRBLK band
// bit map. Starts on a 2K
// boundary, 2K bytes maximum
CHAR achVolName[SUPERB_VOLNAME];
LBN lbnSidTab; // sector number of SID table
UCHAR bOldFuncVersion; // LM2.1 local security
UCHAR bFlags; // LM2.1 superblock flags
UCHAR Password[SUPERB_PWLEN]; // LM2.1 local security
UCHAR abPad[3]; // Padding to DWORD align
} _sbi;
BYTE abFill[cbSector - sizeof(_SUPERB_INFO)];
};
// Superblock flags: Note that UHPFS only uses SBF_BIGDISK.
//
#define SBF_LOCALSEC 1 /* Local security turned on */
#define SBF_BIGDISK 2 /* Disk is >= 2Gig in size */
#define SBF_TRKCNT 4 /* Dirty count tracking enabled */
#define SBF_LM21 8 /* LanMan 2.1 has seen the disk */
// Any volume larger than 2 Gigabytes will have the SBF_BIGDISK
// flag set and the functional version set 3 to prevent earlier
// versions of HPFS from mucking it up.
//
CONST ULONG BigDiskSectorCutoff = 0x400000;
class SUPERB : public SECRUN {
public:
DECLARE_CONSTRUCTOR( SUPERB );
VIRTUAL
~SUPERB(
);
NONVIRTUAL
BOOLEAN
Initialize(
IN OUT PMEM Mem,
IN OUT PLOG_IO_DP_DRIVE Drive
);
NONVIRTUAL
BOOLEAN
Create(
IN PCLOG_IO_DP_DRIVE Drive,
IN OUT PHPFS_BITMAP BitMap,
IN OUT PBADBLOCKLIST BadBlk,
IN LBN RootLbn,
IN LBN BmindLbn,
IN LBN BadBlkLbn,
IN SECTORCOUNT DirBandSc,
IN LBN FirstDirblkLbn,
IN LBN DirMapLbn,
IN LBN SidLbn
);
NONVIRTUAL
BOOLEAN
Verify(
);
NONVIRTUAL
BOOLEAN
IsValid(
) CONST;
NONVIRTUAL
LBN
QueryRootFnodeLbn(
) CONST;
NONVIRTUAL
HPFSVER
QueryVersion(
) CONST;
NONVIRTUAL
HPFSVER
QueryFuncVersion(
) CONST;
NONVIRTUAL
SECTORCOUNT
QueryBadSectors(
) CONST;
NONVIRTUAL
LBN
QueryBitMapIndLbn(
) CONST;
NONVIRTUAL
LBN
QueryBadBlkLbn(
) CONST;
NONVIRTUAL
SECTORCOUNT
QueryDirBandSize(
) CONST;
NONVIRTUAL
LBN
QueryDirBandLbn(
) CONST;
NONVIRTUAL
LBN
QueryDirblkMapLbn(
) CONST;
NONVIRTUAL
SECTORCOUNT
QuerySectors(
) CONST;
NONVIRTUAL
LBN
QuerySidTableLbn(
) CONST;
NONVIRTUAL
SECTORCOUNT
SetBadSectors(
IN SECTORCOUNT NewCount
);
NONVIRTUAL
VOID
Dump(
IN BOOLEAN TotalDump DEFAULT FALSE
) CONST;
private:
VOID
Construct (
);
NONVIRTUAL
VOID
Destroy(
);
_SUPERB* _psb;
};
INLINE
BOOLEAN
SUPERB::IsValid(
) CONST
/*++
Routine Description:
This routine verifies the two super block signatures.
Arguments:
None.
Return Value:
FALSE - The signatures are invalid.
TRUE - The signatures are valid.
--*/
{
return _psb && _psb->_sbi.sig1 == SIGSB1 && _psb->_sbi.sig2 == SIGSB2;
}
INLINE
LBN
SUPERB::QueryRootFnodeLbn(
) CONST
/*++
Routine Description:
This routine computes the root fnode lbn.
Arguments:
None.
Return Value:
The LBN of the root fnode.
--*/
{
return _psb ? _psb->_sbi.lbnRootFNode : 0;
}
INLINE
HPFSVER
SUPERB::QueryVersion (
) CONST
/*++
Routine Description:
This routine computes the version number for the super block.
Arguments:
None.
Return Value:
The version number of the super block.
--*/
{
return _psb ? _psb->_sbi.bVersion : 0;
}
INLINE
HPFSVER
SUPERB::QueryFuncVersion (
) CONST
/*++
Routine Description:
This routine computes the functional version number.
Arguments:
None.
Return Value:
The functional version number.
--*/
{
return _psb ? _psb->_sbi.bFuncVersion : 0;
}
INLINE
SECTORCOUNT
SUPERB::QueryBadSectors (
) CONST
/*++
Routine Description:
This routine computes the number of bad sectors recorded in the super
block.
Arguments:
None.
Return Value:
The number of bad sectors recorded in the super block.
--*/
{
return _psb ? _psb->_sbi.culNumBadSects : 0;
}
INLINE
LBN
SUPERB::QueryBitMapIndLbn(
) CONST
/*++
Routine Description:
This routine computes the LBN of the bit map indirect.
Arguments:
None.
Return Value:
The LBN of the bit map indirect.
--*/
{
return _psb ? _psb->_sbi.lbnMainrspBitMapIndBlk : 0;
}
INLINE
LBN
SUPERB::QueryBadBlkLbn(
) CONST
/*++
Routine Description:
This routine computes the LBN of the bad block.
Arguments:
None.
Return Value:
The LBN of the bad block.
--*/
{
return _psb ? _psb->_sbi.lbnMainrspBadBlkList : 0;
}
INLINE
SECTORCOUNT
SUPERB::QueryDirBandSize(
) CONST
/*++
Routine Description:
This routine computes the number of sectors in the dir block band.
Arguments:
None.
Return Value:
The number of sectors in the dir block band.
--*/
{
return _psb ? _psb->_sbi.clbndbnd : 0;
}
INLINE
LBN
SUPERB::QueryDirBandLbn(
) CONST
/*++
Routine Description:
This routine computes the LBN of the first dir band sector.
Arguments:
None.
Return Value:
The LBN of the first dir band sector.
--*/
{
return _psb ? _psb->_sbi.lbndbndStart : 0;
}
INLINE
LBN
SUPERB::QueryDirblkMapLbn(
) CONST
/*++
Routine Description:
This routine computes the LBN of the dir block map.
Arguments:
None.
Return Value:
The LBN of the dir block map.
--*/
{
return _psb ? _psb->_sbi.lbndbndbmStart : 0;
}
INLINE
SECTORCOUNT
SUPERB::QuerySectors(
) CONST
/*++
Routine Description:
This routine returns the number of the sectors on the volume
according to the superblock.
Arguments:
None.
Return Value:
The superblock's opinion on the number of sectors on the volume.
--*/
{
return _psb ? _psb->_sbi.culSectsOnVol : 0;
}
INLINE
LBN
SUPERB::QuerySidTableLbn(
) CONST
/*++
Routine Description:
This routine computes the LBN of the sid table.
Arguments:
None.
Return Value:
The LBN of the sid table.
--*/
{
return _psb ? _psb->_sbi.lbnSidTab : 0;
}
INLINE
SECTORCOUNT
SUPERB::SetBadSectors (
SECTORCOUNT NewCount
)
/*++
Routine Description:
This routine sets the number of bad sectors recorded in the super
block.
Arguments:
NewCount - the new number of bad sectors
Return Value:
The number of bad sectors recorded in the super block.
--*/
{
return _psb ? (_psb->_sbi.culNumBadSects = NewCount) : 0;
}
#endif // SUPERB_DEFN