📄 fat.h
字号:
USHORT MediaStatusNotification:2; // 127 Removable Media Status Notification Support
USHORT SecurityStatus; // 128 Security Status
USHORT Reserved8[31]; // 129-159 Vendor Specific
USHORT CFAPowerMode1; // 160
USHORT Reserved9[94]; // 161-254
USHORT IntegrityWord; // 255 Checksum & Signature
} IDENTIFY_DATA, *PIDENTIFY_DATA;
#endif
#pragma pack()
//DBR区(DOS BOOT RECORD)即操作系统引导记录区,通常占用分区的第0扇区共512个字节,这里只是fat16的
typedef struct _BOOTSECT {
UCHAR x86Jump[3]; // [00] x86跳转指令
UCHAR OEMName[8]; // [03] OOEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号
//接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS Parameter Block)。
UCHAR BytesPerSec[2]; // [0b] 扇区字节数合法的十进制值有512、1024、2048和4096
UCHAR SecPerAlloc; // [0d] 每簇扇区数合法十进制值有1、2、4、8、16、32、64和128
USHORT ResvSectors; // [0e] 保留扇区数,第一个FAT开始之前的扇区数,包括引导扇区,十进制值一般为32
UCHAR NumFATs; // [10] 该分区上FAT的副本数,一般为2
UCHAR RootDirEntries[2]; // [11] 保存在根目录中32字节长的文件或子目录项数,只有FAT12/FAT16使用此字段,FAT32分区本字段必须设置为 0
UCHAR LogSectors[2]; // [13] 小扇区数(Small Sector)(只有FAT12/FAT16使用此字段)对FAT32分区而言,本字段必须设置为0
UCHAR MediaDesc; // [15] 媒体描述符( Media Descriptor)提供有关媒体被使用的信息,媒体是硬盘、软盘等
USHORT SectorsPerFAT; // [16] 每FAT扇区数(Sectors Per FAT)只被FAT12/FAT16所使用,对FAT32分区而言,本字段必须设置为0
USHORT SectorsPerTrack; // [18] 每道扇区数(Sectors Per Track) 包含使用INT13h的磁盘的“每道扇区数”几何结构值。该分区被多个磁头的柱面分成了多个磁道
USHORT NumHeads; // [1a] 磁头数(Number of Head) 本字段包含使用INT 13h的磁盘的“磁头数”几何结构值
ULONG HiddenSectors; // [1c] 隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数
ULONG BigSectors; // [20] 大扇区数,如果小扇区不为0,那么这个为0
////////////////FAT16分区的扩展BPB字段///////////////////////////
// UCHAR PhysicalDriveNumber; // [24] 物理驱动器号( Physical Drive Number) 与BIOS物理驱动器号有关。软盘驱动器被标识为0x00,物理硬盘被标识为0x80,而与物理磁盘驱动器无关。
// UCHAR Reserved1; // [25] 保留(Reserved) FAT32分区总是将本字段的值设置为0
// UCHAR ExtendedBootSignature; // [26] 扩展引导标签(Extended Boot Signature) 本字段必须要有能被Windows 2000所识别的值0x28或0x29
// ULONG VolumeSerialNumber; // [27] 分区序号(Volume Serial Number) 在格式化磁盘时所产生的一个随机序号,它有助于区分磁盘
// UCHAR VolumeLabel[11]; // [2b] 卷标(Volume Label) 本字段只能使用一次,它被用来保存卷标号。现在,卷标被作为一个特殊文件保存在根目录中
// UCHAR SystemID[8]; // [36] 系统ID(System ID) FAT16文件系统中一般取为"FAT16"
} BOOTSECT;
//DBR区(DOS BOOT RECORD)即操作系统引导记录区,通常占用分区的第0扇区共512个字节,这里只是fat32的
typedef struct _BOOTSECT32 {
UCHAR x86Jump[3]; // [00] x86跳转指令
UCHAR OEMName[8]; // [03] OOEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号
//接下来的从偏移0x0B开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为BPB(BIOS Parameter Block)。
UCHAR BytesPerSec[2]; // [0b] 扇区字节数合法的十进制值有512、1024、2048和4096
UCHAR SecPerAlloc; // [0d] 每簇扇区数合法十进制值有1、2、4、8、16、32、64和128
USHORT ResvSectors; // [0e] 保留扇区数,第一个FAT开始之前的扇区数,包括引导扇区,十进制值一般为32
UCHAR NumFATs; // [10] 该分区上FAT的副本数,一般为2
UCHAR RootDirEntries[2]; // [11] 保存在根目录中32字节长的文件或子目录项数,只有FAT12/FAT16使用此字段,FAT32分区本字段必须设置为 0
UCHAR LogSectors[2]; // [13] 小扇区数(Small Sector)(只有FAT12/FAT16使用此字段)对FAT32分区而言,本字段必须设置为0
UCHAR MediaDesc; // [15] 媒体描述符( Media Descriptor)提供有关媒体被使用的信息,媒体是硬盘、软盘等,win2000未使用
USHORT SectorsPerFAT; // [16] 每FAT扇区数(Sectors Per FAT)只被FAT12/FAT16所使用,对FAT32分区而言,本字段必须设置为0
USHORT SectorsPerTrack; // [18] 每道扇区数(Sectors Per Track) 包含使用INT13h的磁盘的“每道扇区数”几何结构值。该分区被多个磁头的柱面分成了多个磁道
USHORT NumHeads; // [1a] 磁头数(Number of Head) 本字段包含使用INT 13h的磁盘的“磁头数”几何结构值
ULONG HiddenSectors; // [1c] 隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数
ULONG BigSectors; // [20] 大扇区数,fat32这里表示总扇区数
////////////////////FAT32 Section///////////////////////////////////////////////
ULONG SectorsPerFAT32; // [24] 每FAT扇区数(Sectors Per FAT)(只被FAT32使用)该分区每个FAT所占的扇区数。
USHORT ExtendedFlag; // [28] 扩展标志(Extended Flag)(只被FAT32使用)该两个字节结构中各位的值为:位0-3:活动 FAT数(从0开始计数,而不是1).只有在不使用镜像时才有效 位4-6:保留位7:0值意味着在运行时FAT被映射到所有的FAT 1值表示只有一个FAT是活动的 位8-15:保留
USHORT FileSystemVersion; // [2A] 文件系统版本(File ystem Version)只供FAT32使用,高字节是主要的修订号,而低字节是次要的修订号
ULONG RootClusterNumber; // [2C] 根目录簇号(Root Cluster Number)(只供FAT32使用) 根目录第一簇的簇号。本字段的值一般为2,但不总是如此
USHORT FSIS; // [30] 文件系统信息扇区号(File System Information SectorNumber)(只供FAT32使用) FAT32分区的保留区中的文件系统信息(File System Information, FSINFO)结构的扇区号。其值一般为1。在备份引导扇区(Backup Boot Sector)中保留了该FSINFO结构的一个副本,但是这个副本不保持更新
USHORT BackUpBootSect; // [32] 备份引导扇区(只供FAT32使用) 为一个非零值,这个非零值表示该分区保存引导扇区的副本的保留区中的扇区号。本字段的值一般为6,建议不要使用其他值
UCHAR Reseverd[12]; // [34] 保留(只供FAT32使用)供以后扩充使用的保留空间。本字段的值总为0
///////////////////////FAT32分区的扩展BPB字段 ////////////////////////////
// UCHAR PhysicalDriveNumber; // [40] 物理驱动器号( Physical Drive Number) 与BIOS物理驱动器号有关。软盘驱动器被标识为0x00,物理硬盘被标识为0x80,而与物理磁盘驱动器无关。
// UCHAR Reserved1; // [41] 保留(Reserved) FAT32分区总是将本字段的值设置为0
// UCHAR ExtendedBootSignature; // [42] 扩展引导标签(Extended Boot Signature) 本字段必须要有能被Windows 2000所识别的值0x28或0x29
// ULONG VolumeSerialNumber; // [43] 分区序号(Volume Serial Number) 在格式化磁盘时所产生的一个随机序号,它有助于区分磁盘
// UCHAR VolumeLabel[11]; // [47] 卷标(Volume Label) 本字段只能使用一次,它被用来保存卷标号。现在,卷标被作为一个特殊文件保存在根目录中
// UCHAR SystemID[8]; // [52] 系统ID(System ID) FAT32文件系统中一般取为"FAT32"
} BOOTSECT32;
typedef struct _DIRENTRY {
UCHAR FileName[8]; // [00] 文件名
UCHAR Extension[3]; // [08] 文件扩展名
UCHAR Attribute; // [0b] 属性0读写1只读10隐藏100系统1000卷标10000子目录100000归档
UCHAR Reserved[10]; // [0c] 系统保留
USHORT AccessTime; // [16] 最近修改时间
USHORT AccessDate; // [18] 最近修改日期
USHORT StartCluster; // [1a] 文件首簇号
ULONG Length; // [1c] 文件长度
} DIRENTRY;
////////////////FAT32短文件目录项32个字节的表示定义//////////////
typedef struct _DIRENTRY32 {
UCHAR FileName[8]; // [00] 文件名
UCHAR Extension[3]; // [08] 文件扩展名
UCHAR Attribute; // [0b] 属性0读写1只读10隐藏100系统1000卷标10000子目录100000归档
UCHAR Reserved; // [0c] 系统保留
UCHAR CreateTimeMs; // [0d] 文件创建10毫秒位
USHORT CreateTime; // [0e] 文件创建时间
USHORT CreateDate; // [10] 文件创建日期
USHORT AccessLastDate; // [12] 文件最后访问日期
USHORT StartClusterH; // [14] 文件起始簇号的高16位
USHORT AccessTime; // [16] 最近修改时间
USHORT AccessDate; // [18] 最近修改日期
USHORT StartClusterL; // [1a] 文件起始簇号的低16位
ULONG Length; // [1c] 文件长度
} DIRENTRY32;
//
// Partition Table structure. Currently only one partition is supported
//
//这里记录的是MBR除去引导信息的硬盘信息 0x1be+offset
typedef struct _PARTITION {
UCHAR BootFlag; // [00] 引导指示符,指示该分区是否活动分区
UCHAR Start[3]; // [01] 开始磁头开始扇区6位开始柱面10位,其中1位表示该柱面数
UCHAR SystemFlag; // [04] 分区类型
UCHAR End[3]; // [05] 结束……
ULONG StartSector; // [08] 从磁盘开始到该分区开始的偏移量,以扇区为单位
ULONG NumSectors; // [0c] 总扇区数
} PARTITION;
//
// ATA Device Structure
//
typedef struct _SECTORNUM {
BOOLEAN LBA; // TRUE if LBA Sector number
union {
ULONG LBASector; // Sector number in LBA form
struct {
USHORT Cylinder; // Cylinder
UCHAR Head; // Disk Head number
UCHAR Sector; // Sector
};
} u;
} SECTORNUM;
typedef struct _ATA_DEVICE {
UCHAR DriveNumberMask; // 0x00=Master 0x10=Slave
USHORT BytesPerSec; // # of bytes per sector
USHORT SecPerCluster; // Size of each allocation unit
USHORT SecPerTrack; // # of sectors per track
USHORT Heads; // # of heads
USHORT NumCyl; // # of Cylinders
USHORT ResvSectors; // # of Reserve Sectors
PARTITION Partition; // Primary Partition Information
UCHAR NumFATs; // FAT Number from boot sector
USHORT SecPerFAT; // Sectors per FAT from boot sector
ULONG DirEntries; // Number of root directory entries
volatile char *FATBuf; // Pointer to the device FAT
} ATA_DEVICE;
////////////////////////////////////////////////////
void CFBoot();
//extern void OEMLaunchCE(DWORD dwImageStart,DWORD dwImageLength,DWORD dwLaunchAddr);//game
ULONG CFATAInitializeDevice(IN ULONG DriveNumber);
ULONG CFFATExtractName(IN PUCHAR Pathname, IN PUCHAR Filename);
void CFFATFileClose(IN ULONG FileDesc);
BOOL CFFATReadBin(IN PUCHAR FileName,
OUT PULONG JumpAddress,
OUT PULONG pulSize,
OUT PULONG pulImageAddress);
ULONG CFFATGetNextCluster(IN OUT ATA_DEVICE *Disk,
IN ULONG Cluster);
ULONG CFFATFileSize(IN ULONG FileDesc);
ULONG CFFATFileSeek(IN ULONG FileDesc, IN ULONG Position);
ULONG CFFATFileRead(IN ULONG FileDesc,
IN ULONG Length,
OUT PUCHAR DataBuf);
ULONG CFFATFileOpen(IN PUCHAR Filename);
////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -