📄 fat16.h
字号:
00021
00022 #ifndef FAT_H
00023 #define FAT_H
00024
00025 #include "global.h"
00026
00027
00028 // Some useful cluster numbers
00029 #define MSDOSFSROOT 0 // cluster 0 means the root dir
00030 #define CLUST_FREE 0 // cluster 0 also means a free cluster
00031 #define MSDOSFSFREE CLUST_FREE
00032 #define CLUST_FIRST 2 // first legal cluster number
00033 #define CLUST_RSRVD 0xfffffff6 // reserved cluster range
00034 #define CLUST_BAD 0xfffffff7 // a cluster with a defect
00035 #define CLUST_EOFS 0xfffffff8 // start of eof cluster range
00036 #define CLUST_EOFE 0xffffffff // end of eof cluster range
00037
00038 #define FAT12_MASK 0x00000fff // mask for 12 bit cluster numbers
00039 #define FAT16_MASK 0x0000ffff // mask for 16 bit cluster numbers
00040 #define FAT32_MASK 0x0fffffff // mask for FAT32 cluster numbers
00041
00042
00043 // Partition Type used in the partition record
00044 #define PART_TYPE_UNKNOWN 0x00
00045 #define PART_TYPE_FAT12 0x01
00046 #define PART_TYPE_XENIX 0x02
00047 #define PART_TYPE_DOSFAT16 0x04
00048 #define PART_TYPE_EXTDOS 0x05
00049 #define PART_TYPE_FAT16 0x06
00050 #define PART_TYPE_NTFS 0x07
00051 #define PART_TYPE_FAT32 0x0B
00052 #define PART_TYPE_FAT32LBA 0x0C
00053 #define PART_TYPE_FAT16LBA 0x0E
00054 #define PART_TYPE_EXTDOSLBA 0x0F
00055 #define PART_TYPE_ONTRACK 0x33
00056 #define PART_TYPE_NOVELL 0x40
00057 #define PART_TYPE_PCIX 0x4B
00058 #define PART_TYPE_PHOENIXSAVE 0xA0
00059 #define PART_TYPE_CPM 0xDB
00060 #define PART_TYPE_DBFS 0xE0
00061 #define PART_TYPE_BBT 0xFF
00062
00063 struct partrecord // length 16 bytes
00064 {
00065 BYTE prIsActive; // 0x80 indicates active partition
00066 BYTE prStartHead; // starting head for partition
00067 WORD prStartCylSect; // starting cylinder and sector
00068 BYTE prPartType; // partition type (see above)
00069 BYTE prEndHead; // ending head for this partition
00070 WORD prEndCylSect; // ending cylinder and sector
00071 DWORD prStartLBA; // first LBA sector for this partition
00072 DWORD prSize; // size of this partition (bytes or sectors ?)
00073 };
00074
00075
00076 struct partsector
00077 {
00078 CHAR psPartCode[512-64-2]; // pad so struct is 512b
00079 BYTE psPart[64]; // four partition records (64 bytes)
00080 BYTE psBootSectSig0; // two signature bytes (2 bytes)
00081 BYTE psBootSectSig1;
00082 #define BOOTSIG0 0x55
00083 #define BOOTSIG1 0xaa
00084 };
00085
00086
00087
00088 // Format of a boot sector. This is the first sector on a DOS floppy disk
00089 // or the first sector of a partition on a hard disk. But, it is not the
00090 // first sector of a partitioned hard disk.
00091 struct bootsector33 {
00092 BYTE bsJump[3]; // jump inst E9xxxx or EBxx90
00093 CHAR bsOemName[8]; // OEM name and version
00094 CHAR bsBPB[19]; // BIOS parameter block
00095 CHAR bsDriveNumber; // drive number (0x80)
00096 CHAR bsBootCode[479]; // pad so struct is 512b
00097 BYTE bsBootSectSig0; // boot sector signature byte 0x55
00098 BYTE bsBootSectSig1; // boot sector signature byte 0xAA
00099 #define BOOTSIG0 0x55
00100 #define BOOTSIG1 0xaa
00101 };
00102
00103 struct extboot {
00104 CHAR exDriveNumber; // drive number (0x80)
00105 CHAR exReserved1; // reserved
00106 CHAR exBootSignature; // ext. boot signature (0x29)
00107 #define EXBOOTSIG 0x29
00108 CHAR exVolumeID[4]; // volume ID number
00109 CHAR exVolumeLabel[11]; // volume label
00110 CHAR exFileSysType[8]; // fs type (FAT12 or FAT16)
00111 };
00112
00113 struct bootsector50 {
00114 BYTE bsJump[3]; // jump inst E9xxxx or EBxx90
00115 CHAR bsOemName[8]; // OEM name and version
00116 CHAR bsBPB[25]; // BIOS parameter block
00117 CHAR bsExt[26]; // Bootsector Extension
00118 CHAR bsBootCode[448]; // pad so structure is 512b
00119 BYTE bsBootSectSig0; // boot sector signature byte 0x55
00120 BYTE bsBootSectSig1; // boot sector signature byte 0xAA
00121 #define BOOTSIG0 0x55
00122 #define BOOTSIG1 0xaa
00123 };
00124
00125 struct bootsector710 {
00126 BYTE bsJump[3]; // jump inst E9xxxx or EBxx90
00127 CHAR bsOEMName[8]; // OEM name and version
00128 CHAR bsBPB[53]; // BIOS parameter block
00129 CHAR bsExt[26]; // Bootsector Extension
00130 CHAR bsBootCode[418]; // pad so structure is 512b
00131 BYTE bsBootSectSig2; // 2 & 3 are only defined for FAT32?
00132 BYTE bsBootSectSig3;
00133 BYTE bsBootSectSig0; // boot sector signature byte 0x55
00134 BYTE bsBootSectSig1; // boot sector signature byte 0xAA
00135 #define BOOTSIG0 0x55
00136 #define BOOTSIG1 0xaa
00137 #define BOOTSIG2 0
00138 #define BOOTSIG3 0
00139 };
00140
00141
00142 /***************************************************************/
00143 /***************************************************************/
00144
00145 // BIOS Parameter Block (BPB) for DOS 3.3
00146 struct bpb33 {
00147 WORD bpbBytesPerSec; // bytes per sector
00148 BYTE bpbSecPerClust; // sectors per cluster
00149 WORD bpbResSectors; // number of reserved sectors
00150 BYTE bpbFATs; // number of FATs
00151 WORD bpbRootDirEnts; // number of root directory entries
00152 WORD bpbSectors; // total number of sectors
00153 BYTE bpbMedia; // media descriptor
00154 WORD bpbFATsecs; // number of sectors per FAT
00155 WORD bpbSecPerTrack; // sectors per track
00156 WORD bpbHeads; // number of heads
00157 WORD bpbHiddenSecs; // number of hidden sectors
00158 };
00159
00160 // BPB for DOS 5.0
00161 // The difference is bpbHiddenSecs is a short for DOS 3.3,
00162 // and bpbHugeSectors is not present in the DOS 3.3 bpb.
00163 struct bpb50 {
00164 WORD bpbBytesPerSec; // bytes per sector
00165 BYTE bpbSecPerClust; // sectors per cluster
00166 WORD bpbResSectors; // number of reserved sectors
00167 BYTE bpbFATs; // number of FATs
00168 WORD bpbRootDirEnts; // number of root directory entries
00169 WORD bpbSectors; // total number of sectors
00170 BYTE bpbMedia; // media descriptor
00171 WORD bpbFATsecs; // number of sectors per FAT
00172 WORD bpbSecPerTrack; // sectors per track
00173 WORD bpbHeads; // number of heads
00174 DWORD bpbHiddenSecs; // # of hidden sectors
00175 // 3.3 compat ends here
00176 DWORD bpbHugeSectors; // # of sectors if bpbSectors == 0
00177 };
00178
00179 // BPB for DOS 7.10 (FAT32)
00180 // This one has a few extensions to bpb50.
00181 struct bpb710 {
00182 WORD bpbBytesPerSec; // bytes per sector
00183 BYTE bpbSecPerClust; // sectors per cluster
00184 WORD bpbResSectors; // number of reserved sectors
00185 BYTE bpbFATs; // number of FATs
00186 WORD bpbRootDirEnts; // number of root directory entries
00187 WORD bpbSectors; // total number of sectors
00188 BYTE bpbMedia; // media descriptor
00189 WORD bpbFATsecs; // number of sectors per FAT
00190 WORD bpbSecPerTrack; // sectors per track
00191 WORD bpbHeads; // number of heads
00192 DWORD bpbHiddenSecs; // # of hidden sectors
00193 // 3.3 compat ends here
00194 DWORD bpbHugeSectors; // # of sectors if bpbSectors == 0
00195 // 5.0 compat ends here
00196 DWORD bpbBigFATsecs;// like bpbFATsecs for FAT32
00197 WORD bpbExtFlags; // extended flags:
00198 #define FATNUM 0xf // mask for numbering active FAT
00199 #define FATMIRROR 0x80 // FAT is mirrored (like it always was)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -