




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件: FAT.H/微控设计网原创 www.M 作者: debug版主typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;#pragma pack(1)typedef structuint8 BS_jmpBoot3;uint8 BS_OEMName8;uint16 BPB_BytesPerSec;uint8 BPB_SecPerClus;uint16 BPB_RsvdSecCnt;uint8 BPB_NumFATs;uint16 BPB_RootEntCnt;uint16 BPB_TotSec16;uint8 BPB_Media;uint16 BPB_FATSz16;uint16 BPB_SecPerTrk;uint16 BPB_NumHeads;uint32 BPB_HiddSec;uint32 BPB_TotSec32;uint8 BS_DrvNum;uint8 BS_Reservedl;uint8 BS_BootSig;uint32 BS_VolID;uint8 BS_VolLab11;uint8 BS_FilSysType8;uint8 ExecutableCode448;uint8 ExecutableMarker2; FAT_BPB;typedef structuint8 NAME8;uint8 TYPE3; FILE_NAME;typedef structuint16 Start;uint32 Size; FILE_POSIT;typedef structFILE_NAME FileName;uint8 FileAttrib;uint8 UnUsed10;uint8 FileUpdateTime2;uint8 FileUpdateData2;FILE_POSIT FilePosit; DIR;typedef structuint16 ClusID;uint16 SecOfClus;uint16 ByteOfSec; DATA_POSIT;#pragma pack()/*/读一个扇区void ReadBlock(uint32 LBA);/*/写一个扇区void WriteBlock(uint32 LBA);/*void CopyBytes(void* S, void* D, uint16 size);/*uint8 IsEqual(void* A, void* B, uint8 Size);/*void EmptyBytes(void* D, uint16 size);/*/读取BPB数据结构void ReadBPB(void);/*/获取根目录开始扇区号uint32 DirStartSec(void);/*/获取数据区开始扇区号uint32 DataStartSec(void);/*/目录项占用的扇区数uint16 GetDirSecCount(void);/*/获取一个簇的开始扇区uint32 ClusConvLBA(uint16 ClusID);/*/读取文件分配表的指定项uint16 ReadFAT(uint16 Index);/*/写文件分配表的指定项void WriteFAT(uint16 Index, uint16 Value);/*/获取根目录中可以使用的一项uint16 GetEmptyDIR(void);/*/获得和文件名对应的目录项uint8 GetFileID(uint8 Name11, DIR* ID);/*/获取一个空的FAT项uint16 GetNextFAT(void);/*/读取根目录的指定项void ReadDIR(uint16 Index, DIR* Value);/*/写根目录的指定项void WriteDIR(uint16 Index, DIR* Value);/*/创建一个空文件void CreateFile(uint8* FileName11, uint32 Size);/*/复制文件分配表,使其和备份一致void CopyFAT(void);/*/操作文件的数据void OperateFile(uint8 Write ,uint8 Name11, uint32 Start, uint32 Length, void* Data);/-文件:FAT.C/微控设计网原创 www.M 作者: debug版主#include #include FAT16.huint8 BUFFER512;uint16 BPB_BytesPerSec;uint8 BPB_SecPerClus;uint16 BPB_RsvdSecCnt;uint8 BPB_NumFATs;uint16 BPB_RootEntCnt;uint16 BPB_TotSec16;uint16 BPB_FATSz16;uint32 BPB_HiddSec;/*/读一个扇区void ReadBlock(uint32 LBA)/*return;/*/写一个扇区void WriteBlock(uint32 LBA)/*return;/*void CopyBytes(void* S, void* D, uint16 size)/*uint8 *s = S, *d = D;uint16 i;for(i = 0; i size; i+)*d+ = *s+;/*uint8 IsEqual(void* A, void* B, uint8 Size)/*uint8 i, *a = A, *b = B;for(i = 0; i Size; i+)if(ai != bi)return 0;return 1;/*void EmptyBytes(void* D, uint16 size)/*uint16 i;uint8* data = (uint8*)D;for(i = 0; i BPB_BytesPerSec;BPB_SecPerClus = BPB-BPB_SecPerClus;BPB_RsvdSecCnt = BPB-BPB_RsvdSecCnt;BPB_NumFATs = BPB-BPB_NumFATs;BPB_RootEntCnt = BPB-BPB_RootEntCnt;BPB_TotSec16 = BPB-BPB_TotSec16;BPB_FATSz16 = BPB-BPB_FATSz16;BPB_HiddSec = BPB-BPB_HiddSec;/*/获取根目录开始扇区号uint32 DirStartSec(void)/*return BPB_RsvdSecCnt + BPB_NumFATs * BPB_FATSz16;/*/获取数据区开始扇区号uint32 DataStartSec(void)/*return (uint32)(DirStartSec() + BPB_RootEntCnt * 32 / BPB_BytesPerSec);/*/目录项占用的扇区数uint16 GetDirSecCount(void)/*return BPB_RootEntCnt * 32 / 512;/*/获取一个簇的开始扇区uint32 ClusConvLBA(uint16 ClusID)/*return DataStartSec() + BPB_SecPerClus * (ClusID - 2);/*/读取文件分配表的指定项uint16 ReadFAT(uint16 Index)/*uint16 *RAM = (uint16*)BUFFER;ReadBlock(BPB_RsvdSecCnt + Index / 256);return RAMIndex % 256;/*/写文件分配表的指定项void WriteFAT(uint16 Index, uint16 Value)/*uint16 *RAM = (uint16*)BUFFER;uint32 SecID;SecID = BPB_RsvdSecCnt + Index / 256;ReadBlock(SecID);RAMIndex % 256 = Value;WriteBlock(SecID);/*/获取根目录中可以使用的一项uint16 GetEmptyDIR()/*uint16 DirSecCut, DirStart, i, m, ID = 0;DirSecCut = GetDirSecCount();DirStart = DirStartSec();for(i = 0; i DirSecCut; i+)ReadBlock(DirStart + i);for(m = 0; m 16; m+)if(BUFFERm * 32 = 0) | (BUFFERm * 32 = 0xe5)return ID;elseID+;return ID;/*/获得和文件名对应的目录项uint8 GetFileID(uint8 Name11, DIR* ID)/*uint16 DirSecCut, DirStart, i, m;DirSecCut = GetDirSecCount();DirStart = DirStartSec();for(i = 0; i DirSecCut; i+)ReadBlock(DirStart + i);for(m = 0; m FileName, 11)*ID = *(DIR*)&BUFFERm * 32);return 1; /找到对应的目录项,返回1.return 0; /没有找到对应的目录项,返回0./*/获取一个空的FAT项uint16 GetNextFAT(void)/*=*uint16 FAT_Count, i;FAT_Count = BPB_FATSz16 * 256; /FAT表总项数for(i = 0; i FAT_Count; i+)if(ReadFAT(i) = 0)return i;return 0;/*/读取根目录的指定项void ReadDIR(uint16 Index, DIR* Value)/*uint32 DirStart = DirStartSec();ReadBlock(DirStart + Index / 16);CopyBytes(&BUFFER(Index % 16) * 32, Value, 32);/*/写根目录的指定项void WriteDIR(uint16 Index, DIR* Value)/*uint32 LBA = DirStartSec() + Index / 16;ReadBlock(LBA);CopyBytes(Value, &BUFFER(Index % 16) * 32, 32);WriteBlock(LBA);/*/创建一个空文件void CreateFile(uint8* FileName11, uint32 Size)/*uint16 ClusID, ClusNum, ClusNext, i;DIR FileDir;ClusNum = Size / (BPB_SecPerClus * 512) + 1;EmptyBytes(&FileDir, sizeof(DIR);CopyBytes(FileName, &FileDir.FileName, 11);FileDir.FilePosit.Size = Size;FileDir.FilePosit.Start = GetNextFAT();ClusID = FileDir.FilePosit.Start;for(i = 0; i ClusNum - 1; i+)WriteFAT(ClusID, 0xffff);ClusNext = GetNextFAT();WriteFAT(ClusID, ClusNext);ClusID = ClusNext;WriteFAT(ClusID, 0xffff);WriteDIR(GetEmptyDIR(), &FileDir);/*/复制文件分配表,使其和备份一致void CopyFAT(void)/*uint16 FATSz16, RsvdSecCnt, i;FATSz16 = BPB_FATSz16;RsvdSecCnt = BPB_RsvdSecCnt;for(i = 0; i FATSz16; i+)ReadBlock(RsvdSecCnt + i);WriteBlock(RsvdSecCnt + FATSz16 + i);/*/操作文件的数据void OperateFile(uint8 Write ,uint8 Name11, uint32 Start, uint32 Length, void* Data)/*uint8 *data = Data;uint16 BytePerClus, SecPerClus, ClusNum, ClusID, m;uint32 LBA, i;DIR FileDir;SecPerClus = BPB_SecPerClus;BytePerClus = BPB_SecPerClus * 512; / 每簇的字节数GetFileID(Name, &FileDir);/计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一室户房屋租借合同书3篇
- 美术教研组工作计划范文2025(5篇)
- 数字营销在消费品行业的应用
- 电子竞技产业发展现状与挑战
- 农产品溯源体系在2025年农业产业链中的价值与作用报告
- 2025年技能工试题及答案
- 2025年生物行业笔试题及答案
- 2025年初二上册英语试卷及答案
- 2025年山东省潍坊市寒亭区事业单位教师招聘考试《教育基础知识》真题库及答案解析
- 新质生产力权威解释
- 四年级上册部编版作文教学计划
- 记者证考试复习题库汇总(含答案)
- 餐饮空间案例分析
- 第三章卫星链路设计
- 沪科版九年级物理导学案(全册)
- 计算流体力学完整课件
- 知名投资机构和投资人联系方式汇总
- 行政主管岗位职责及工作内容
- 生产安全事故应急救援演练记录
- 2023版初中化学跨学科实践活动(化学)
- 《新能源汽车驱动电机及传动技术》课程教案
评论
0/150
提交评论