mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
8.7 KiB
243 lines
8.7 KiB
/********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1990 **/
|
|
/********************************************************************/
|
|
#define SEC_SUPERB 16 /* superblock is after 8K boot block */
|
|
#define SEC_SPAREB 17 /* spareblock is after superblock */
|
|
#define SEC_BOOT 0 /* boot sector */
|
|
|
|
|
|
#define SUPERB_PWLEN 15
|
|
|
|
|
|
/** SUPERB.INC - Super Block Definition
|
|
*
|
|
* The Superblock is the first block of the file system.
|
|
* It starts at sector #4, leaving 2K for boot sectors.
|
|
*
|
|
* Pointer to the root directory
|
|
* Pointer to the bit map
|
|
* Clean pointer
|
|
* Pointer to the bad list
|
|
*/
|
|
|
|
struct RSP {
|
|
unsigned long P; /* main psector pointer */
|
|
unsigned long P2; /* spare pointer */
|
|
}; /* RSP */
|
|
|
|
|
|
struct SuperB {
|
|
unsigned long SB_SIG1; /* signature value 1 */
|
|
unsigned long SB_SIG2; /* signature value 2 */
|
|
|
|
unsigned char SB_VER; /* version # of filesystem structures */
|
|
unsigned char SB_FVER; /* functional version number - the smallest/
|
|
* oldest version of the filesystem that can
|
|
* understand this disk - some version
|
|
* enhancements may define fields which can be
|
|
* ignored by earlier versions */
|
|
|
|
short SB_DUMY; /* free */
|
|
|
|
unsigned long SB_ROOT; /* Psector # of root fnode */
|
|
|
|
unsigned long SB_SEC; /* # of sectors on volume */
|
|
unsigned long SB_BSEC; /* # of bad sectors on volume */
|
|
|
|
struct RSP SB_BII; /* Bitmap Indirect Block */
|
|
struct RSP SB_BBL; /* badblock list chain #1 */
|
|
|
|
unsigned long SB_CDDAT; /* date of last CHKDSK */
|
|
unsigned long SB_DODAT; /* date of last Disk Optimize */
|
|
|
|
unsigned long SB_DBSIZE; /* # of sectors in dirblk band */
|
|
unsigned long SB_DBLOW; /* first Psector in DIRBLK band */
|
|
unsigned long SB_DBHIGH; /* last Psector in DIRBLK band */
|
|
unsigned long SB_DBMAP; /* first Psector of DIRBLK band bit map. Starts
|
|
* on a 2K boundary, 2K bytes maximum */
|
|
|
|
unsigned char SB_VOLNAME[32]; /* Volume name */
|
|
|
|
unsigned long SB_SIDSEC; /* sector # of first sector in SIDTAB */
|
|
/* ID map is 4K - 8 contiguous sectors */
|
|
|
|
unsigned char BlankSpace[512-100];
|
|
/* MUST BE ZERO */
|
|
}; /* SuperB */
|
|
|
|
|
|
|
|
/** SpareB - Spare Block Definitions
|
|
*
|
|
* SpareB contains various emergency supplies and fixup information.
|
|
* This stuff isn't in the superblock in order for the superblock
|
|
* to be read only and decrease the liklihood that a flakey write
|
|
* will cause the superblock to become unreadable.
|
|
*
|
|
* This sector is located directly after the superblock - sector 5.
|
|
*
|
|
* Note that the number of spare DIRBLKs is a format option, given
|
|
* that they all have to fit into the SpareB, giving us a max of
|
|
* 101 of them.
|
|
*
|
|
* Access to the SpareB is complicated by the fact that we can't
|
|
* access it via the cache, since the cache may be unavailable.
|
|
* If every cache buffer is dirty, we could get a HotFix error when
|
|
* writing the first one, which would deadlock us if we needed to
|
|
* read this stuff via the cache. Instead, we read it directly into
|
|
* a private buffer via RdHF.
|
|
*
|
|
* This means that the disk layout must be such that each cache cluster
|
|
* that contains the SpareB or the hotfix list must not contain any
|
|
* other writable sector, to prevent us from having a modified
|
|
* direct-written sector overwritten by an earlier unmodified copy
|
|
* which was in a cache block. It's ok for the SuperB to be in the
|
|
* same cache group as the SpareB since the SuperB is RO to the filesys.
|
|
*
|
|
* Checksums. Done on both Super Block and the Spare Block.
|
|
* Both checksums are stored in the Spare Block. The checksum
|
|
* field for the Super Block (SPB_SUPERBSUM) must be set when
|
|
* calculating the checksum for the Spare Block. The checksum
|
|
* field for the Spare Block (SPB_SPAREBSUM) must be zero when
|
|
* calculating the checksum for the Spare Block.
|
|
* If both checksum fields are zero, the checksums have not been
|
|
* calculated for the volume.
|
|
*
|
|
*/
|
|
|
|
#define SPAREDB 20 /* 20 spare DIRBLKs */
|
|
|
|
struct SpareB {
|
|
|
|
unsigned long SPB_SIG1; /* signature value 1 */
|
|
unsigned long SPB_SIG2; /* signature value 2 */
|
|
|
|
unsigned char SPB_FLAG; /* cleanliness flag */
|
|
unsigned char SPB_ALIGN[3]; /* alignment */
|
|
|
|
unsigned long SPB_HFSEC; /* first hotfix list P sector */
|
|
unsigned long SPB_HFUSE; /* # of hot fixes in effect */
|
|
unsigned long SPB_HFMAX; /* max size of hot fix list */
|
|
|
|
unsigned long SPB_SDBCNT; /* # of spare dirblks */
|
|
unsigned long SPB_SDBMAX; /* maximum number of spare DB values. */
|
|
unsigned long SPB_CPSEC; /* code page sector */
|
|
unsigned long SPB_CPCNT; /* count of code pages on volume */
|
|
unsigned long SPB_SUPERBSUM; /* Checksum of Super Block */
|
|
unsigned long SPB_SPAREBSUM; /* Checksum of Spare Block */
|
|
unsigned long SPB_DUMY[15]; /* some extra space for future use */
|
|
unsigned long SPB_SPARDB[101]; /* Psector #s of spare dirblks */
|
|
}; /* SpareB */
|
|
|
|
|
|
/* Super Block and Spare Block Signatures */
|
|
|
|
#define SBSIG1 0xf995e849 /* two signatures cause we got lotsa */
|
|
#define SBSIG2 0xFA53E9C5 /* space */
|
|
#define SPSIG1 0xf9911849 /* two signatures cause we got lotsa */
|
|
#define SPSIG2 0xFA5229C5 /* space */
|
|
|
|
|
|
|
|
/* Superblock Versions */
|
|
|
|
#define SBBASEV 2 /* base version */
|
|
#define SBBASEFV 2 /* base functional version */
|
|
|
|
|
|
/* Superblock flags */
|
|
|
|
#define SBF_LOCALSEC 1
|
|
|
|
|
|
/* Spare Block Flags */
|
|
|
|
#define SPF_DIRT 0x0001 /* file system is dirty */
|
|
#define SPF_SPARE 0x0002 /* spare DIRBLKs have been used */
|
|
#define SPF_HFUSED 0x0004 /* hot fix sectors have been used */
|
|
#define SPF_BADSEC 0x0008 /* bad sector, corrupt disk */
|
|
#define SPF_BADBM 0x0010 /* bad bitmap block */
|
|
#define SPF_VER 0x0080 /* file system was written by a version
|
|
* < SB_VER, so some of the new fields
|
|
* may have not been updated */
|
|
|
|
|
|
/** Bit maps
|
|
*
|
|
* PFS keeps track of free space in a series of bit maps.
|
|
* Currently, each bit map is 2048 bytes, which covers about
|
|
* 8 megabytes of disk space. We could rearrange these to be
|
|
* more cylinder sensitive...
|
|
*
|
|
* The superblock has the address of a section of contiguous sectors
|
|
* that contains a double word sector # for each bit map block. This
|
|
* will be a maximum of 2048 bytes (4 sectors)
|
|
*
|
|
* Max # of size RAM (K) size 2nd lvl
|
|
* bitmaps (meg) to reside bitmap
|
|
* bitmap (bytes)
|
|
*
|
|
* 1 8.39 2 256
|
|
* 2 16.78 4 512
|
|
* 3 25.17 6 768
|
|
* 4 33.55 8 1024
|
|
* 5 41.94 10 1280
|
|
* 6 50.33 12 1536
|
|
* 7 58.72 14 1792
|
|
* 8 67.11 16 2048
|
|
* 9 75.50 18 2304
|
|
* 10 83.89 20 2560
|
|
* 15 125.83 30 3840
|
|
* 20 167.77 40 5120
|
|
* 30 251.66 60 7680
|
|
* 40 335.54 80 10240
|
|
* 50 419.43 100 12800
|
|
* 100 838.86 200 25600
|
|
* 200 1677.72 400 51200
|
|
* 300 2516.58 600 76800
|
|
* 400 3355.44 800 102400
|
|
* 500 4194.30 1000 128000
|
|
*/
|
|
|
|
|
|
|
|
/** Hot Fixing
|
|
*
|
|
* Each file system maintains a structure listing N "hot fix"
|
|
* disk clusters of HOTFIXSIZ sectors each, each starting on
|
|
* a multiple of HOTFIXSIZ. Whenever the file system discovers
|
|
* that it's trying to write to a bad spot on the disk it will
|
|
* instead select a free hot fix cluster and write there, instead.
|
|
* The substitution will be recorded in the hot fix list, and the
|
|
* SBF_SPARE bit will be set. The file system sill describes the
|
|
* data as being in the bad old sectors; the disk interface will
|
|
* do a mapping between the `believed' location and the true location.
|
|
*
|
|
* CHKDSK will be run as soon as possible; it will move the
|
|
* hot fixed data from the hot fix cluster to somewhere else,
|
|
* freeing that hot fix cluster, and adjusting the disk structure
|
|
* to point to the new location of the data. As a result, entrys
|
|
* on the hot fix list should be transient and few.
|
|
*
|
|
* The superblock contains the # of the first sector of the hot fix list.
|
|
* The list takes the following format, spread across as many sectors
|
|
* as necessary:
|
|
*
|
|
* long oldsec[SB_HFMAX]; sector # of start of bad clusters
|
|
* long newsec[SB_HFMAX]; sector # of start of subst. cluster
|
|
* long fnode [SB_HFMAX]; fnode sector of file/directory
|
|
* involved with bad cluster. May be
|
|
* 0 (don't know) or invalid. The
|
|
* repair program must verify that it
|
|
* *is* an FNODE and must see if other
|
|
* structures might also involve this
|
|
* bad cluster.
|
|
*
|
|
* the SB_HFUSE field describes the number of these records which is
|
|
* in use - unused ones should have oldsec[i] = 0. The list will
|
|
* be 'dense' - no oldsec[i] will be 0 where i < SB_HFUSE.
|
|
*
|
|
* The sector(s) which contain the hot fix list must be contiguous
|
|
* and may not themselves be defective.
|
|
*/
|