FAT Mirroring

On all FAT drives, there may be multiple copies of the FAT. If an error occurs reading the primary copy, the file system will attempt to read from the backup copies.

On FAT16 and FAT12 drives, the first FAT is always the primary copy and any modifications will automatically be written to all copies.

However, on FAT32 drives, FAT mirroring can be disabled and a FAT other than the first one can be the primary (or "active") copy of the FAT.

Mirroring is enabled by clearing bit 0x0080 in the extdpb_flags member of a FAT32 Drive Parameter Block (DPB) structure.

FAT Mirroring

  • When Enabled (bit 0x0080 clear)

    With mirroring enabled, whenever a FAT sector is written, it will also be written to every other FAT. Also, a mirrored FAT sector can be read from any FAT. A FAT32 drive with multiple FATs will behave the same as FAT16 and FAT12 drives with multiple FATs. That is, the multiple FATs are backups of each other.

  • When Disabled (bit 0x0080 set)

    With mirroring disabled, only one of the FATs is active. The active FAT is the one specified by bits 0 through 3 of the extdpb_flags member of DPB. The other FATs are ignored. Disabling mirroring allows better handling of a drive with a bad sector in one of the FATs. If a bad sector exists, access to the damaged FAT can be completely disabled. Then, a new FAT can be built in one of the inactive FATs and then made accessible by changing the active FAT value in extdpb_flags.

DPB (FAT32)

The DPB was extended to include FAT32 information. Changes are effective for Windows 95 OEM Service Release 2 and later.

DPB STRUC
    dpb_drive            DB    ?
    dpb_unit             DB    ?
    dpb_sector_size      DW    ?
    dpb_cluster_mask     DB    ?
    dpb_cluster_shift    DB    ?
    dpb_first_fat        DW    ?
    dpb_fat_count        DB    ?
    dpb_root_entries     DW    ?
    dpb_first_sector     DW    ?
    dpb_max_cluster      DW    ?
    dpb_fat_size         DW    ?
    dpb_dir_sector       DW    ?
    dpb_reserved2        DD    ?
    dpb_media            DB    ?
ifdef NOTFAT32
    dpb_first_access     DB    ?
else
    dpb_reserved         DB    ?
endif
    dpb_reserved3        DD    ?
    dpb_next_free        DW    ?
    dpb_free_cnt         DW    ?
ifndef NOTFAT32
    extdpb_free_cnt_hi   DW    ?
    extdpb_flags         DW    ?
    extdpb_FSInfoSec     DW    ?
    extdpb_BkUpBootSec   DW    ?
    extdpb_first_sector  DD    ?
    extdpb_max_cluster   DD    ?
    extdpb_fat_size      DD    ?
    extdpb_root_clus     DD    ?
    extdpb_next_free     DD    ?
endif
DPB ENDS

DBP Members

Member Name Description
dpb_drive The drive number (0 = A, 1 = B, and so on)..
dpb_unit Specifies the unit number. The device driver uses the unit number to distinguish the specified drive from the other drives it supports.
dpb_sector_size The size of each sector, in bytes.
dpb_cluster_mask The number of sectors per cluster minus 1.
dpb_cluster_shift The number of sectors per cluster, expressed as a power of 2.
dpb_first_fat The sector number of the first sector containing the file allocation table (FAT).
dpb_fat_count The number of FATs on the drive.
dpb_root_entries The number of entries in the root directory.
dpb_first_sector The sector number of the first sector in the first cluster.
dpb_max_cluster The number of clusters on the drive plus 1. This member is undefined for FAT32 drives.
dpb_fat_size The number of sectors occupied by each FAT. The value of zero indicates a FAT32 drive. Use the value in extdpb_fat_size instead.
dpb_dir_sector The sector number of the first sector containing the root directory. This member is undefined for FAT32 drives.
dpb_reserved2 Reserved member. Do not use.
dpb_media Specifies the media descriptor for the medium in the specified drive.
reserved Reserved member. Do not use.
dpb_first_access Indicates whether the medium in the drive has been accessed. This member is initialized to -1 to force a media check the first time this DPB is used.
dpb_reserved3 Reserved member. Do not use.
dpb_next_free The cluster number of the most recently allocated cluster.
dpb_free_cnt The number of free clusters on the medium. This member is 0FFFFh if the number is unknown.
extdpb_free_cnt_hi The high word of free count.
extdpb_flags Flags describing the drive. The low 4 bits of this value contain the 0-based FAT number of the Active FAT. This member can contain a combination of the following values.
extdpb_flags Value Description
BGBPB_F_ActiveFATMsk (000Fh)BGBPB_F_NoFATMirror (0080h) Mask for low four bits.
Do not mirror active FAT to inactive FATs.Bits 4-6 and 8-15 are reserved.
extdpb_FSInfoSec The sector number of the file system information sector. This member is set to 0FFFFh if there is no FSINFO sector. Otherwise, this value must be non-zero and less than the reserved sector count.
extdpb_BkUpBootSec The sector number of the backup boot sector. This member is set to 0FFFFh if there is no backup boot sector. Otherwise, this value must be non-zero and less than the reserved sector count.
extdpb_first_sector The first sector of the first cluster.
extdpb_max_cluster The number of clusters on the drive plus 1.
extdpb_fat_size The number of sectors occupied by the FAT.
extdpb_root_clus The cluster number of the first cluster in the root directory.
extdpb_next_free The number of the cluster that was most recently allocated.