BigOS/include/fat32.h
2022-12-13 13:29:17 +08:00

189 lines
8.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**********************************************************
* fat32.h //added by mingxuan 2019-5-17
***********************************************************/
#ifndef FAT32_H
#define FAT32_H
#define TRUE 1//是
#define FALSE 0//否
#define OK 1//正常返回
#define SYSERROR 2//系统错误
#define VDISKERROR 3//虚拟磁盘错误
#define INSUFFICIENTSPACE 4//虚拟磁盘空间不足
#define WRONGPATH 5//路径有误
#define NAMEEXIST 6//文件或目录名已存在
#define ACCESSDENIED 7//读写权限不对拒绝访问
#define C 1//创建 //added by mingxuan 2019-5-18
#define R 5//读
#define W 6//写
#define RW 2 //读写 //added by mingxuan 2019-5-18
#define F 1//文件
#define D 0//目录
typedef int STATE;//函数返回状态
typedef unsigned char BYTE;//字节
typedef unsigned short WORD;//双字节
typedef unsigned long DWORD;//四字节
typedef unsigned int UINT;//无符号整型
typedef char CHAR;//字符类型
typedef unsigned char* PBYTE;
typedef unsigned short* PWORD;
typedef unsigned long* PDWORD;//四字节指针
typedef unsigned int* PUINT;//无符号整型指针
typedef char* PCHAR;//字符指针
typedef struct//定义目录项占32个字节
{
BYTE filename[8];//文件名占8个字节
BYTE extension[3];//扩展名占3个字节
BYTE proByte;//属性字节占1个字节
BYTE sysReserved;//系统保留占1个字节
BYTE createMsecond;//创建时间的10毫秒位占1个字节
WORD createTime;//文件创建时间占2个字节
WORD createDate;//文件创建日期占2个字节
WORD lastAccessDate;//文件最后访问日期占2个字节
WORD highClusterNum;//文件的起始簇号的高16位占2个字节
WORD lastModifiedTime;//文件的最近修改时间
WORD lastModifiedDate;//文件的最近修改日期
WORD lowClusterNum;//文件的起始簇号的低16位占2个字节
DWORD filelength;//文件的长度占4个字节
}Record,*PRecord;
typedef struct//定义长文件名目录项占32个字节
{
BYTE proByte;//属性字节
BYTE name1[10];//长文件名第1段
BYTE longNameFlag;//长文件名目录项标志取值0FH
BYTE sysReserved;//系统保留
BYTE name2[19];//长文件名第2段
}LONGNAME;
typedef struct{//文件类型
CHAR parent[256];//父路径
CHAR name[256];//文件名
DWORD start;//起始地址
DWORD off;//总偏移量,以字节为单位
DWORD size;//文件的大小,以字节为单位
UINT flag;//文件读写标志
}File,*PFile;
typedef struct{//动态数组元素类型,用于存储文件或目录的基本信息
CHAR fullpath[256];//绝对路径
CHAR name[256];//文件名或目录名
UINT tag;//1表示文件0表示目录
}DArrayElem;
typedef struct{//动态数组类型
DArrayElem *base;//数组基地址
UINT offset;//读取数组时的偏移量
UINT used;//数组当前已使用的容量
UINT capacity;//数组的总容量
UINT increment;//当数组容量不足时,动态增长的步长
}DArray;
typedef struct{//文件或目录属性类型
BYTE type;//0x10表示目录否则表示文件
CHAR name[256];//文件或目录名称
CHAR location[256];//文件或目录的位置,绝对路径
DWORD size;//文件的大小或整个目录中(包括子目录中)的文件总大小
CHAR createTime[20];//创建时间型如yyyy-MM-dd hh:mm:ss类型
CHAR lastModifiedTime[20];//最后修改时间
union{
CHAR lastAccessDate[11];//最后访问时间当type为文件值有效
UINT contain[2];//目录中的文件个数和子目录的个数当type为目录时有效
}share;
}Properties;
STATE CreateVDisk(DWORD size);
STATE FormatVDisk(PCHAR path,PCHAR volumelabel);
STATE LoadVDisk(PCHAR path);
STATE CreateDir(const char *dirname);
STATE CreateFile(const char *filename);
STATE OpenFile(const char *filename,int mode);
STATE CloseFile(int fd);
STATE OpenDir(const char *dirname);
STATE ReadFile(int fd,void *buf, int length);
STATE WriteFile(int fd, const void *buf, int length);
STATE CopyFileIn(PCHAR sfilename,PCHAR dfilename);
STATE CopyFileOut(PCHAR sfilename,PCHAR dfilename);
STATE DeleteFile(const char *filename);
STATE DeleteDir(const char *dirname);
STATE ListAll(PCHAR dirname,DArray *array);
STATE IsFile(PCHAR path,PUINT tag);
STATE GetFileLength(PCHAR filename,PDWORD length);
STATE Rename(PCHAR path,PCHAR newname);
STATE CopyFile(PCHAR sfilename,PCHAR dpath);
STATE CopyDir(PCHAR sdirname,PCHAR dpath);
STATE Move(PCHAR sfilename,PCHAR dpath);
STATE GetProperty(PCHAR filename,Properties *properties);
STATE GetParenetDir(PCHAR name,PCHAR parentDir);
STATE GetVDiskFreeSpace(PDWORD left);
STATE GetVDiskSize(PDWORD totalsize);
STATE GetCurrentPath(PCHAR path);
DArray* InitDArray(UINT initialCapacity,UINT capacityIncrement);
void AddElement(DArray *array,DArrayElem element);
DArrayElem* NextElement(DArray *array);
void DestroyDArray(DArray *array);
void TimeToBytes(WORD result[]);//t是一个WORD类型的数组长度为2第0个元素为日期第1个元素为时间
void BytesToTime(WORD date,WORD time,WORD result[]);//t是一个表示时间的WORD数组长度为6分别表示年、月、日、时、分、秒
void TimeToString(WORD result[],PCHAR timestring);
STATE IsFullPath(PCHAR path);//判断path是否是一个绝对路径
void ToFullPath(PCHAR path,PCHAR fullpath);//将path转换成绝对路径用fullpath返回
void GetParentFromPath(PCHAR fullpath,PCHAR parent);//从一个绝对路径中得到它的父路径(父目录)
void GetNameFromPath(PCHAR path,PCHAR name);//从一个路径中得到文件或目录的名称
void MakeFullPath(PCHAR parent,PCHAR name,PCHAR fullpath);//将父路径和文件名组合成一个绝对路径
void FormatFileNameAndExt(PCHAR filename,PCHAR name,PCHAR ext);//将一个文件名转换成带空格的文件名和后缀名的形式,为了写入目录项。
void FormatDirNameAndExt(PCHAR dirname,PCHAR name,PCHAR ext);//将一个目录名转换成带空格的目录名和后缀的形式,为了写入目录项。
void ChangeCurrentPath(PCHAR addpath);
void GetNameFromRecord(Record record,PCHAR fullname);//从目录项中得到文件或目录的全名
STATE PathToCluster(PCHAR path, PDWORD cluster);//将抽象的路径名转换成簇号
STATE FindSpaceInDir(DWORD parentCluster,PCHAR name,PDWORD sectorIndex,PDWORD off_in_sector);//在指定的目录中寻找空的目录项
STATE FindClusterForDir(PDWORD pcluster);//为目录分配簇
STATE ReadRecord(DWORD parentCluster,PCHAR name,PRecord record,PDWORD sectorIndex,PDWORD off_in_sector);//获得指定的目录项的位置(偏移量)
STATE WriteRecord(Record record,DWORD sectorIndex,DWORD off_in_sector);
STATE FindClusterForFile(DWORD totalClusters,PDWORD clusters);//为一个文件分配totalClusters个簇
STATE WriteFAT(DWORD totalClusters,PDWORD clusters);//写FAT1和FAT2
STATE GetNextCluster(DWORD curClusterIndex,PDWORD nextClusterIndex);
STATE AddCluster(DWORD startCluster,DWORD num);//cluster表示该文件或目录所在目录的簇,num表示增加几个簇
void CreateRecord(PCHAR filename,BYTE type,DWORD startCluster,DWORD size,PRecord precord);//创建一个目录项
void GetFileOffset(PFile pfile,PDWORD sectorIndex,PDWORD off_in_sector,PUINT isLastSector);//将文件当前位置转换成相对虚拟磁盘文件起始地址的偏移量,便于读写。
STATE AllotClustersForEmptyFile(PFile pfile,DWORD size);//为一个打开的空文件分配簇。
STATE NeedMoreCluster(PFile pfile,DWORD size,PDWORD number);//判断是否需要更多的簇,如果需要就返回需要的簇的个数
STATE ClearRecord(DWORD parentCluster,PCHAR name,PDWORD startCluster);//删除记录项
void ClearFATs(DWORD startcluster);//删除簇号
STATE FindNextRecord(PDWORD cluster,PDWORD off,PCHAR name,PUINT tag);
void DeleteAllRecord(DWORD startCluster);
void GetContent(DWORD startCluster,PDWORD size,PDWORD files,PDWORD folders);
void ClearClusters(DWORD cluster);
void ReadSector(BYTE*,DWORD sectorIndex);
void WriteSector(BYTE*,DWORD sectorIndex);
void GetNextSector(PFile pfile,DWORD curSectorIndex,PDWORD nextSectorIndex,PUINT isLastSector);
void init_fs_fat();
int rw_sector_fat(int io_type, int dev, unsigned long long pos, int bytes, int proc_nr, void* buf);
int rw_sector_sched_fat(int io_type, int dev, int pos, int bytes, int proc_nr, void* buf);
void DisErrorInfo(STATE state);
int sys_CreateFile(void *uesp);
int sys_DeleteFile(void *uesp);
int sys_OpenFile(void *uesp);
int sys_CloseFile(void *uesp);
int sys_WriteFile(void *uesp);
int sys_ReadFile(void *uesp);
int sys_OpenDir(void *uesp);
int sys_CreateDir(void *uesp);
int sys_DeleteDir(void *uesp);
int sys_ListDir(void *uesp);
#endif