📄 disk.c
字号:
#define IN_FAT
#include "User.h"
#define MAX_DRIVES 1
Disk_Info DiskInfo[MAX_DRIVES];
void DiskInit(void)
{//初始化逻辑盘信息管理模块
INT8U i;
for(i=0; i<MAX_DRIVES; i++)
{
DiskInfo[i].DriveID = EMPTY_DRIVE;
DiskInfo[i].BytsPerSec = 0;
DiskInfo[i].SecPerClus = 0;
DiskInfo[i].RsvdSecCnt = 0;
DiskInfo[i].NumFATs = 0;
DiskInfo[i].RootEntCnt = 0;
DiskInfo[i].TotSec16 = 0;
DiskInfo[i].FATSz16 = 0;
DiskInfo[i].HiddSec = 0;
DiskInfo[i].TotSec32 = 0;
DiskInfo[i].FilSysType = 0;
DiskInfo[i].FATSz32 = 0;
DiskInfo[i].RootClus = 0;
DiskInfo[i].RelaStaSect = 0;
DiskInfo[i].RootDirSectors = 0;
DiskInfo[i].FirstDataSector = 0;
DiskInfo[i].DiskDrive = NULL;
}
}
Disk_Info * GetDiskInfo(INT8U DriveID)
{//获取逻辑盘信息
Disk_Info *Rt;
INT8U i;
Rt = NULL;
for (i=0; i < MAX_DRIVES; i++)
{
if (DiskInfo[i].DriveID == DriveID)
{
Rt = DiskInfo + i;
break;
}
}
return Rt;
}
Disk_Info * GetEmptyDiskInfoAddr(void)
{//获取空闲逻辑盘管理模块
INT8U i;
Disk_Info *Rt;
Rt = NULL;
for (i = 0; i < MAX_DRIVES; i++)
{
if (DiskInfo[i].DriveID == EMPTY_DRIVE) // 逻辑盘号空闲
{
Rt = DiskInfo + i;
break;
}
}
return Rt;
}
void RemoveFileDriver(INT8U DriveID)
{//移除一个逻辑盘
INT8U i;
for (i=0; i < MAX_DRIVES; i++)
{
if (DiskInfo[i].DriveID == DriveID)
{
break;
}
}
if (i <= MAX_DRIVES)
if (DiskInfo[DriveID].DriveID != EMPTY_DRIVE)
{
DiskInfo[i].DriveID = EMPTY_DRIVE;
DiskInfo[i].BytsPerSec = 0;
DiskInfo[i].SecPerClus = 0;
DiskInfo[i].RsvdSecCnt = 0;
DiskInfo[i].NumFATs = 0;
DiskInfo[i].RootEntCnt = 0;
DiskInfo[i].TotSec16 = 0;
DiskInfo[i].FATSz16 = 0;
DiskInfo[i].HiddSec = 0;
DiskInfo[i].TotSec32 = 0;
DiskInfo[i].FilSysType = 0;
DiskInfo[i].FATSz32 = 0;
DiskInfo[i].RootClus = 0;
DiskInfo[i].RelaStaSect = 0;
DiskInfo[i].RootDirSectors = 0;
DiskInfo[i].FirstDataSector = 0;
DiskInfo[i].DiskDrive = NULL;
}
}
void AddFileDriver(INT8U DriveID, INT8U (* DiskDrive)(INT8U Cammand, void *Parameter))
{//为逻辑盘加载底层驱动,并读取逻辑盘DBR数据
INT32U TotSector; //总扇区数
INT32U DataSector; //数据区中扇区数
INT32U CountOfCluster; //总簇数
INT32U FATSize; //FAT表所占扇区数
Disk_RW_Parameter DP;
Disk_Info *pDI;
INT8U Data_Buf[512];
if(DiskDrive == NULL)
{
return;
}
pDI = GetEmptyDiskInfoAddr();
pDI->DriveID = DriveID;
pDI->DiskDrive = DiskDrive;
DP.SectorIndex = 0;//扇区0
DP.Buf = Data_Buf;//数据缓冲
(* pDI->DiskDrive)(ReadSec, &DP);//读一扇区数据
if((( Data_Buf[0]==0xEB)&&( Data_Buf[2]==0x90))||( Data_Buf[0] == 0xE9))
{
pDI->RelaStaSect = 0;
}
else
{
pDI->RelaStaSect = (INT32U)(Data_Buf[455] << 8) |
(INT32U)(Data_Buf[456] << 16) |
(INT32U)(Data_Buf[457] << 24) |
Data_Buf[454];
DP.SectorIndex = pDI->RelaStaSect;
DP.Buf = Data_Buf;//数据缓冲
(* pDI->DiskDrive)(ReadSec, &DP);//读一扇区
}
pDI->BytsPerSec = ((INT16U)Data_Buf[OFBPB_BytsPerSec+1] << 8) |
Data_Buf[OFBPB_BytsPerSec];
pDI->SecPerClus = Data_Buf[OFBPB_SecPerClus];
pDI->RsvdSecCnt = ((INT16U)Data_Buf[OFBPB_RsvdSecCnt+1] << 8) |
Data_Buf[OFBPB_RsvdSecCnt];
pDI->NumFATs = Data_Buf[OFBPB_NumFATs];
pDI->RootEntCnt = ((INT16U)Data_Buf[OFBPB_RootEntCnt+1] << 8) |
Data_Buf[OFBPB_RootEntCnt];
pDI->TotSec16 = ((INT16U)Data_Buf[OFBPB_TotSec16+1] << 8) |
Data_Buf[OFBPB_TotSec16];
pDI->FATSz16 = ((INT16U)Data_Buf[OFBPB_FATSz16+1] << 8) |
Data_Buf[OFBPB_FATSz16];
pDI->HiddSec = ((INT32U)Data_Buf[OFBPB_HiddSec+3] << 24) |
((INT32U)Data_Buf[OFBPB_HiddSec+2] << 16) |
((INT32U)Data_Buf[OFBPB_HiddSec+1] << 8) |
Data_Buf[OFBPB_HiddSec];
pDI->TotSec32 = ((INT32U)Data_Buf[OFBPB_TotSec32+3] << 24) |
((INT32U)Data_Buf[OFBPB_TotSec32+2] << 16) |
((INT32U)Data_Buf[OFBPB_TotSec32+1] << 8) |
Data_Buf[OFBPB_TotSec32];
pDI->FATSz32 = ((INT32U)Data_Buf[OFBPB_FATSz32+3] << 24) |
((INT32U)Data_Buf[OFBPB_FATSz32+2] << 16) |
((INT32U)Data_Buf[OFBPB_FATSz32+1] << 8) |
Data_Buf[OFBPB_FATSz32];
pDI->RootClus = ((INT32U)Data_Buf[OFBPB_RootClus+3] << 24) |
((INT32U)Data_Buf[OFBPB_RootClus+2] << 16) |
((INT32U)Data_Buf[OFBPB_RootClus+1] << 8) |
Data_Buf[OFBPB_RootClus];
pDI->RootDirSectors = ((pDI->RootEntCnt * 32) + (pDI->BytsPerSec - 1)) / pDI->BytsPerSec;
if(pDI->FATSz16 != 0)
FATSize = pDI->FATSz16;
else
FATSize = pDI->FATSz32;
pDI->FirstDataSector = pDI->RsvdSecCnt + (pDI->NumFATs * FATSize) + pDI->RootDirSectors + pDI->RelaStaSect;
if(pDI->TotSec16 != 0)
TotSector = pDI->TotSec16;
else
TotSector = pDI->TotSec32;
DataSector = TotSector - (pDI->RsvdSecCnt + (pDI->NumFATs * FATSize) + pDI->RootDirSectors);
CountOfCluster = DataSector / pDI->SecPerClus;
if(CountOfCluster < 4085)
pDI->FilSysType = FAT12;
else if(CountOfCluster < 65525)
pDI->FilSysType = FAT16;
else
pDI->FilSysType = FAT32;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -