189 lines
8.5 KiB
C
189 lines
8.5 KiB
C
/**********************************************************
|
||
* 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 |