📄 fatmountvolumeid.c
字号:
#ifndef _FAT_DEFINE
#include "FAT.c"
#endif
BYTE FATMountVolumeID(BYTE Partition);
BYTE FATMountVolumeID(BYTE Partition)
{
pdata DWORD TotSec,DataSec,CountofCluster;
if (Partition>=StorageMedia.TotalPartitions) return(FAT_ERR_PARTITION_NOT_FOUND); //没找到指定扇区
StorageMedia.ReadSector(sDPT[Partition].LBABegin,DiskBuffer); //读FAT VolumeID扇区
//检查VolumeID扇区标记
if (DiskBuffer[510] != 0x55||DiskBuffer[511] != 0xaa)
return(FAT_ERR_MBR_FLAG); //不正常的引导扇区标志
//检查分区类型
StorageMedia.CurrentPartition = Partition; //当前分区号
BOOTSEC->BPB_RsvdSecCnt=MEMSwap16(BOOTSEC->BPB_RsvdSecCnt);
BOOTSEC->BPB_RootEntCnt=MEMSwap16(BOOTSEC->BPB_RootEntCnt);
BOOTSEC->FAT.F32.BPB_RootClus=MEMSwap32(BOOTSEC->FAT.F32.BPB_RootClus);
BOOTSEC->FAT.F32.BPB_FSInfo=MEMSwap16(BOOTSEC->FAT.F32.BPB_FSInfo);
BOOTSEC->BPB_TotSec16=MEMSwap16(BOOTSEC->BPB_TotSec16);
BOOTSEC->BPB_FATSz16=MEMSwap16(BOOTSEC->BPB_FATSz16);
BOOTSEC->BPB_TotSec32=MEMSwap32(BOOTSEC->BPB_TotSec32);
BOOTSEC->FAT.F32.BPB_FATSz32=MEMSwap32(BOOTSEC->FAT.F32.BPB_FATSz32);
FAT.RootSectors = (BOOTSEC->BPB_RootEntCnt * 32) / 512;
if (BOOTSEC->BPB_FATSz16!=0)
FAT.FATSz = BOOTSEC->BPB_FATSz16;
else
FAT.FATSz = BOOTSEC->FAT.F32.BPB_FATSz32;
if (BOOTSEC->BPB_TotSec16!=0)
TotSec = BOOTSEC->BPB_TotSec16;
else
TotSec = BOOTSEC->BPB_TotSec32;
DataSec = TotSec - (BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * FAT.FATSz) + FAT.RootSectors);
CountofCluster = DataSec / (DWORD)(BOOTSEC->BPB_SecPerClus);
if (CountofCluster<4085)
{
sDPT[Partition].FATType=FAT_TYPE_FAT12;
FAT.RootClus = BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * BOOTSEC->BPB_FATSz16);
}
else if (CountofCluster<65525)
{
sDPT[Partition].FATType=FAT_TYPE_FAT16;
FAT.RootClus = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * BOOTSEC->BPB_FATSz16);
}
else
{
sDPT[Partition].FATType=FAT_TYPE_FAT32;
FAT.RootClus = BOOTSEC->FAT.F32.BPB_RootClus; //根目录簇号
}
FAT.SecPerClus = BOOTSEC->BPB_SecPerClus; //每簇扇区数
FAT.CurrentDirectory = FAT.RootClus; //当前目录入口(簇号)
FAT.FATSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt; //FAT表开始的扇区号
FAT.ClusSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * FAT.FATSz) + FAT.RootSectors; //簇开始的扇区
FAT.FSISec = BOOTSEC->FAT.F32.BPB_FSInfo + sDPT[Partition].LBABegin; //FAT32扩展信息扇区号
//加载第一个FAT表
StorageMedia.ReadSector(FAT.FATSec,FATTable.FAT.F12);
FATTable.Sector=0;
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -