BigOS/kernel/fat32.c
2023-01-02 12:45:23 +08:00

948 lines
23 KiB
C
Raw 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.c //added by mingxuan 2019-5-17
***********************************************************/
#include "fat32.h"
#include "type.h"
#include "const.h"
#include "protect.h"
#include "string.h"
#include "proc.h"
#include "tty.h"
#include "console.h"
#include "global.h"
#include "proto.h"
#include "fs_const.h"
#include "hd.h"
#include "fs.h"
#include "fs_misc.h"
#include "string.h"
#include "stdio.h"
extern DWORD FAT_END;
extern DWORD TotalSectors;
extern WORD Bytes_Per_Sector;
extern BYTE Sectors_Per_Cluster;
extern WORD Reserved_Sector;
extern DWORD Sectors_Per_FAT;
extern UINT Position_Of_RootDir;
extern UINT Position_Of_FAT1;
extern UINT Position_Of_FAT2;
extern struct file_desc f_desc_table[NR_FILE_DESC];
CHAR VDiskPath[256] = {0};
CHAR cur_path[256] = {0};
u8 *buf;
STATE state;
File f_desc_table_fat[NR_FILE_DESC];
static void load_disk();
static void mkfs_fat();
STATE DeleteDir(const char *dirname)
{
CHAR fullpath[256] = {0};
CHAR parent[256] = {0};
CHAR name[256] = {0};
DWORD parentCluster = 0, startCluster = 0;
UINT tag = 0;
STATE state;
ToFullPath((PCHAR)dirname, fullpath);
GetParentFromPath(fullpath, parent);
GetNameFromPath(fullpath, name);
state = IsFile(fullpath, &tag);
if (state != OK)
{
return state;
}
if (tag == F)
{
return WRONGPATH;
}
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state;
}
state = ClearRecord(parentCluster, name, &startCluster);
if (state != OK)
{
return state;
}
DeleteAllRecord(startCluster);
return OK;
}
STATE CreateDir(const char *dirname)
{
Record record;
CHAR fullname[256] = {0};
CHAR name[256] = {0};
CHAR parent[256] = {0};
DWORD parentCluster = 0, startCluster = 0, sectorIndex = 0, off_in_sector = 0;
STATE state;
ToFullPath((PCHAR)dirname, fullname);
GetNameFromPath(fullname, name);
GetParentFromPath(fullname, parent);
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state; // 找不到路径
}
state = FindSpaceInDir(parentCluster, name, &sectorIndex, &off_in_sector);
if (state != OK)
{
return state; // 虚拟磁盘空间不足
}
state = FindClusterForDir(&startCluster);
if (state != OK)
{
return state; // 虚拟磁盘空间不足
}
CreateRecord(name, 0x10, startCluster, 0, &record);
WriteRecord(record, sectorIndex, off_in_sector);
WriteFAT(1, &startCluster); // 写FAT
CreateRecord(".", 0x10, startCluster, 0, &record); // 准备目录项.的数据
sectorIndex = Reserved_Sector + 2 * Sectors_Per_FAT + (startCluster - 2) * Sectors_Per_Cluster;
WriteRecord(record, sectorIndex, 0); // 写.目录项
CreateRecord("..", 0x10, parentCluster, 0, &record); // 准备目录项..的数据
WriteRecord(record, sectorIndex, sizeof(Record)); // 写..目录项
// fflush(fp);
return OK;
}
STATE OpenDir(const char *dirname)
{
DWORD parentCluster = 0;
CHAR fullpath[256] = {0}, parent[256] = {0}, name[256] = {0};
Record record;
STATE state;
if (strcmp(dirname, ".") == 0)
{
return OK;
}
else if (strcmp(dirname, "..") == 0 || strcmp(dirname, "\\") == 0)
{
ChangeCurrentPath((PCHAR)dirname);
return OK;
}
else
{
if (IsFullPath((PCHAR)dirname))
{
strcpy(fullpath, (PCHAR)dirname);
GetParentFromPath(fullpath, parent);
if (strlen(parent) == 0) // 说明dirname是根目录
{
memset(cur_path, 0, sizeof(cur_path));
strcpy(cur_path, fullpath);
cur_path[strlen(cur_path)] = '\\';
return OK;
}
GetNameFromPath(fullpath, name);
}
else
{
MakeFullPath(cur_path, (PCHAR)dirname, fullpath);
strcpy(parent, cur_path);
strcpy(name, (PCHAR)dirname);
}
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state;
}
state = ReadRecord(parentCluster, name, &record, NULL, NULL);
if (state != OK)
{
return state;
}
if (record.proByte == (BYTE)0x10)
{
strcpy(cur_path, fullpath);
return OK;
}
else
{
return WRONGPATH;
}
}
return OK;
}
STATE ReadFile(int fd, void *buf, int length)
{
int size = 0;
PBYTE sector = NULL;
DWORD curSectorIndex = 0, nextSectorIndex = 0, off_in_sector = 0, free_in_sector = 0, readsize = 0;
UINT isLastSector = 0, tag = 0;
PFile pfile = p_proc_current->task.filp[fd]->fd_node.fd_file;
if (pfile->flag != R && pfile->flag != RW && pfile->flag != (RW | C)) // modified by mingxuan 2019-5-18
{
return ACCESSDENIED;
}
kprintf("read:");
if (pfile->off >= pfile->size)
{
return 0;
}
sector = (PBYTE)K_PHY2LIN(sys_kmalloc(Bytes_Per_Sector * sizeof(BYTE)));
if (sector == NULL)
{
return SYSERROR;
}
GetFileOffset(pfile, &curSectorIndex, &off_in_sector, &isLastSector);
do
{
if (isLastSector) // 当前的扇区是该文件的最后一个扇区
{
if (pfile->size % Bytes_Per_Sector == 0)
{
free_in_sector = Bytes_Per_Sector - off_in_sector;
}
else
{
free_in_sector = pfile->size % Bytes_Per_Sector - off_in_sector; // 最后一个扇区的剩余量
}
tag = 1; // 置跳出标志
}
else
{
free_in_sector = Bytes_Per_Sector - off_in_sector; // 本扇区的剩余量
}
if (free_in_sector < length - (size)) // 缓冲区装不满
{
readsize = free_in_sector;
}
else
{ // 缓冲区能装满
readsize = length - (size);
tag = 1; // 置跳出标志
}
ReadSector(sector, curSectorIndex);
memcpy(buf + (size), sector + off_in_sector, readsize);
(size) += readsize;
pfile->off += readsize;
if (tag == 1) // 最后一个扇区或缓冲区装满了
{
break;
}
else
{ // 缓冲区还没装满并且还没到最后一个扇区
GetNextSector(pfile, curSectorIndex, &nextSectorIndex, &isLastSector);
curSectorIndex = nextSectorIndex;
off_in_sector = 0;
}
} while (1);
sys_free(sector);
// pfile->off = 0;
return size;
}
STATE WriteFile(int fd, const void *buf, int length)
{
PBYTE sector = NULL;
DWORD clusterNum = 0;
DWORD curSectorIndex = 0, nextSectorIndex = 0, off_in_sector = 0, free_in_sector = 0, off_in_buf = 0;
UINT isLastSector = 0;
STATE state;
PFile pfile = p_proc_current->task.filp[fd]->fd_node.fd_file;
// PFile pfile = &f_desc_table_fat[0];
// if(pfile->flag!=W) //deleted by mingxuan 2019-5-18
if (pfile->flag != W && pfile->flag != RW && pfile->flag != (RW | C)) // modified by mingxuan 2019-5-18
{
return ACCESSDENIED;
}
sector = (PBYTE)K_PHY2LIN(sys_kmalloc(Bytes_Per_Sector * sizeof(BYTE)));
if (sector == NULL)
{
return SYSERROR;
}
if (pfile->start == 0) // 此文件是个空文件原来没有分配簇
{
state = AllotClustersForEmptyFile(pfile, length); // 空间不足无法分配
if (state != OK)
{
sys_free(sector);
return state; // 虚拟磁盘空间不足
}
}
else
{
if (NeedMoreCluster(pfile, length, &clusterNum))
{
state = AddCluster(pfile->start, clusterNum); // 空间不足
if (state != OK)
{
sys_free(sector);
return state; // 虚拟磁盘空间不足
}
}
}
GetFileOffset(pfile, &curSectorIndex, &off_in_sector, &isLastSector);
free_in_sector = Bytes_Per_Sector - off_in_sector;
while (free_in_sector < length - off_in_buf) // 当前扇区的空闲空间放不下本次要写入的内容
{
ReadSector(sector, curSectorIndex);
memcpy(sector + off_in_sector, (void *)buf + off_in_buf, free_in_sector);
WriteSector(sector, curSectorIndex);
off_in_buf += free_in_sector;
pfile->off += free_in_sector;
GetNextSector(pfile, curSectorIndex, &nextSectorIndex, &isLastSector);
curSectorIndex = nextSectorIndex;
free_in_sector = Bytes_Per_Sector;
off_in_sector = 0;
}
ReadSector(sector, curSectorIndex);
memcpy(sector + off_in_sector, (void *)buf + off_in_buf, length - off_in_buf);
WriteSector(sector, curSectorIndex);
pfile->off += length - off_in_buf;
sys_free(sector);
// fflush(fp);
return OK;
}
STATE CloseFile(int fd)
{
PFile pfile;
pfile = p_proc_current->task.filp[fd]->fd_node.fd_file;
DWORD curSectorIndex = 0, curClusterIndex = 0, nextClusterIndex = 0, parentCluster = 0;
UINT isLastSector = 0;
Record record;
DWORD sectorIndex = 0, off_in_sector = 0;
// p_proc_current->task.filp_fat[fd] = 0;
f_desc_table_fat[fd].flag = 0;
p_proc_current->task.filp[fd]->flag = 0;
p_proc_current->task.filp[fd] = 0;
if (pfile->flag == R)
{
return OK;
}
else
{
if (pfile->off < pfile->size)
{
GetFileOffset(pfile, &curSectorIndex, NULL, &isLastSector);
if (isLastSector == 0)
{
curSectorIndex = (curClusterIndex - Reserved_Sector - 2 * Sectors_Per_FAT) / Sectors_Per_Cluster + 2;
GetNextCluster(curClusterIndex, &nextClusterIndex);
if (nextClusterIndex != FAT_END) // 说明当前簇不是此文件的最后一簇
{
WriteFAT(1, &curClusterIndex); // 把当前簇设置为此文件的最后一簇
ClearFATs(nextClusterIndex); // 清除此文件的多余簇
}
}
}
PathToCluster(pfile->parent, &parentCluster);
ReadRecord(parentCluster, pfile->name, &record, &sectorIndex, &off_in_sector);
record.highClusterNum = (WORD)(pfile->start >> 16);
record.lowClusterNum = (WORD)(pfile->start & 0x0000FFFF);
record.filelength = pfile->off;
WriteRecord(record, sectorIndex, off_in_sector);
}
return OK;
}
STATE OpenFile(const char *filename, int mode)
{
CHAR fullpath[256] = {0};
CHAR parent[256] = {0};
CHAR name[256] = {0};
Record record;
DWORD parentCluster;
STATE state;
DWORD sectorIndex = 0, off_in_sector = 0; // added by mingxuan 2019-5-19
ToFullPath((PCHAR)filename, fullpath);
GetParentFromPath(fullpath, parent);
GetNameFromPath(fullpath, name);
state = PathToCluster(parent, &parentCluster);
kprintf("\nstate=");
kprintf("%d", state);
if (state != OK)
{
return -1;
}
// added by mingxuan 2019-5-19
state = FindSpaceInDir(parentCluster, name, &sectorIndex, &off_in_sector); // 检测文件名是否存在
if (mode & O_CREAT) // 如果用户使用了O_CREAT
{
if (state == NAMEEXIST) // 文件存在使用O_CREAT是多余的继续执行OpenFile即可
{
kprintf("file exists, O_CREAT is no use!");
}
else // 文件不存在需要使用O_CREAT先创建文件再执行OpenFile
{
CreateRecord(name, 0x20, 0, 0, &record);
WriteRecord(record, sectorIndex, off_in_sector); // 写目录项
}
}
else // 用户没有使用O_CREAT
{
if (state != NAMEEXIST) // 文件不存在需要使用O_CREAT用户没有使用则报错并返回-1表示路径有误
{
kprintf("no file, use O_CREAT!");
return -1;
}
else
{
} // 文件存在使用O_CREAT是多余的继续执行OpenFile即可
}
//~mingxuan 2019-5-19
state = ReadRecord(parentCluster, name, &record, NULL, NULL);
kprintf("state=");
kprintf("%d", state);
if (state != OK)
{
kprintf("ReadRecord Fail!");
return -1;
}
int i;
int fd = -1;
for (i = 3; i < NR_FILES; i++)
{
if (p_proc_current->task.filp[i] == 0)
{
fd = i;
break;
}
}
if ((fd < 0) || (fd >= NR_FILES))
{
// panic("filp[] is full (PID:%d)", proc2pid(p_proc_current));
kprintf("filp[] is full (PID:");
kprintf("%d", (int)proc2pid(p_proc_current));
kprintf(")\n");
return -1;
}
// 找一个未用的文件描述符
for (i = 0; i < NR_FILE_DESC; i++)
if ((f_desc_table[i].flag == 0))
break;
if (i >= NR_FILE_DESC)
{
kprintf("f_desc_table[] is full (PID:");
kprintf("%d", (int)proc2pid(p_proc_current));
kprintf(")\n");
return -1;
}
p_proc_current->task.filp[fd] = &f_desc_table[i];
f_desc_table[i].flag = 1;
// 找一个未用的FILE
for (i = 0; i < NR_FILE_DESC; i++)
if (f_desc_table_fat[i].flag == 0)
break;
if (i >= NR_FILE_DESC)
{
kprintf("f_desc_table[] is full (PID:");
kprintf("%d", (int)proc2pid(p_proc_current));
kprintf(")\n");
}
// 以下是给File结构体赋值
memset(f_desc_table_fat[i].parent, 0, sizeof(f_desc_table_fat[i].parent)); // 初始化parent字段
memset(f_desc_table_fat[i].name, 0, sizeof(f_desc_table_fat[i].name)); // 初始化name字段
strcpy(f_desc_table_fat[i].parent, parent);
strcpy(f_desc_table_fat[i].name, name);
f_desc_table_fat[i].start = (record.highClusterNum << 16) + record.lowClusterNum;
f_desc_table_fat[i].off = 0;
f_desc_table_fat[i].size = record.filelength;
f_desc_table_fat[i].flag = mode;
// kprintf("flag:");
// deint(f_desc_table_fat[i].flag);
// kprintf("index:");
// deint(i);
p_proc_current->task.filp[fd]->fd_node.fd_file = &f_desc_table_fat[i];
return fd;
}
STATE CreateFile(const char *filename)
{
Record record;
CHAR fullpath[256] = {0};
CHAR parent[256] = {0};
CHAR name[256] = {0};
DWORD parentCluster = 0, sectorIndex = 0, off_in_sector = 0;
STATE state;
ToFullPath((PCHAR)filename, fullpath);
GetParentFromPath(fullpath, parent);
GetNameFromPath((PCHAR)filename, name);
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state; // 找不到路径
}
state = FindSpaceInDir(parentCluster, name, &sectorIndex, &off_in_sector);
if (state != OK)
{
return state;
}
CreateRecord(name, 0x20, 0, 0, &record);
WriteRecord(record, sectorIndex, off_in_sector); // 写目录项
return OK;
}
STATE DeleteFile(const char *filename)
{
CHAR fullpath[256] = {0};
CHAR parent[256] = {0};
CHAR name[256] = {0};
DWORD parentCluster = 0;
DWORD startCluster = 0;
UINT tag = 0;
STATE state;
ToFullPath((PCHAR)filename, fullpath);
GetParentFromPath(fullpath, parent);
GetNameFromPath(fullpath, name);
state = IsFile(fullpath, &tag);
if (state != OK)
{
return state;
}
if (tag == D)
{
return WRONGPATH;
}
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state;
}
state = ClearRecord(parentCluster, name, &startCluster);
if (state != OK)
{
return state;
}
if (startCluster != 0)
{
ClearFATs(startCluster);
}
return OK;
}
STATE IsFile(PCHAR path, PUINT tag)
{
CHAR fullpath[256] = {0};
CHAR parent[256] = {0};
CHAR name[256] = {0};
DWORD parentCluster = 0;
Record record;
STATE state;
ToFullPath(path, fullpath);
GetParentFromPath(fullpath, parent);
GetNameFromPath(fullpath, name);
state = PathToCluster(parent, &parentCluster);
if (state != OK)
{
return state; // 找不到路径
}
state = ReadRecord(parentCluster, name, &record, NULL, NULL);
if (state != OK)
{
return state; // 找不到路径
}
if (record.proByte == 0x10)
{
*tag = D;
}
else
{
*tag = F;
}
return OK;
}
void init_fs_fat()
{
kprintf("Initializing fat32 file system... \n");
buf = (u8 *)K_PHY2LIN(sys_kmalloc(FSBUF_SIZE));
int fat32_dev = get_fs_dev(PRIMARY_MASTER, FAT32_TYPE); // added by mingxuan 2020-10-27
// load_disk(FAT_DEV); // deleted by mingxuan 2020-10-27
load_disk(fat32_dev); // modified by mingxuan 2020-10-27
if (TotalSectors == 0)
{
mkfs_fat();
// load_disk(FAT_DEV); //deleted by mingxuan 2020-10-27
load_disk(fat32_dev); // modified by mingxuan 2020-10-27
}
int i;
for (i = 0; i < NR_FILE_DESC; ++i)
{
f_desc_table_fat[i].flag = 0;
}
}
static void load_disk(int dev)
{
MESSAGE driver_msg;
PCHAR cur = "V:\\";
driver_msg.type = DEV_READ;
driver_msg.DEVICE = MINOR(dev);
driver_msg.POSITION = SECTOR_SIZE * 1;
driver_msg.BUF = buf;
driver_msg.CNT = SECTOR_SIZE;
driver_msg.PROC_NR = proc2pid(p_proc_current); /// TASK_A
hd_rdwt(&driver_msg);
memcpy(&Bytes_Per_Sector, buf + 11, 2);
memcpy(&Sectors_Per_Cluster, buf + 13, 1);
memcpy(&Reserved_Sector, buf + 14, 2);
memcpy(&TotalSectors, buf + 32, 4);
memcpy(&Sectors_Per_FAT, buf + 36, 4);
Position_Of_RootDir = (Reserved_Sector + Sectors_Per_FAT * 2) * Bytes_Per_Sector;
Position_Of_FAT1 = Reserved_Sector * Bytes_Per_Sector;
Position_Of_FAT2 = (Reserved_Sector + Sectors_Per_FAT) * Bytes_Per_Sector;
strcpy(cur_path, cur);
}
static void mkfs_fat()
{
MESSAGE driver_msg;
int fat32_dev = get_fs_dev(PRIMARY_MASTER, FAT32_TYPE); // added by mingxuan 2020-10-27
/* get the geometry of ROOTDEV */
struct part_info geo;
driver_msg.type = DEV_IOCTL;
// driver_msg.DEVICE = MINOR(FAT_DEV); //deleted by mingxuan 2020-10-27
driver_msg.DEVICE = MINOR(fat32_dev); // modified by mingxuan 2020-10-27
driver_msg.REQUEST = DIOCTL_GET_GEO;
driver_msg.BUF = &geo;
driver_msg.PROC_NR = proc2pid(p_proc_current);
hd_ioctl(&driver_msg);
kprintf("dev size: ");
kprintf("%d", geo.size);
kprintf(" sectors\n");
TotalSectors = geo.size;
DWORD jump = 0x009058eb; // 跳转指令占3个字节
DWORD oem[2] = {0x4f44534d, 0x302e3553}; // 厂商标志OS版本号:占8个字节
// 以下是BPB的内容
WORD bytes_per_sector = 512; // 每扇区字节数占2个字节
WORD sectors_per_cluster = 8; // 每簇扇区数占1个字节
WORD reserved_sector = 32; // 保留扇区数占2个字节
WORD number_of_FAT = 2; // FAT数占1个字节
BYTE mediaDescriptor = 0xF8;
DWORD sectors_per_FAT = (TotalSectors * 512 - 8192) / 525312 + 1; // 每FAT所占扇区数用此公式可以算出来占4个字节
DWORD root_cluster_number = 2; // 根目录簇号占4个字节
// 以下是扩展BPB内容
CHAR volumeLabel[11] = {'N', 'O', ' ', 'N', 'A', 'M', 'E', ' ', ' ', ' ', ' '}; // 卷标占11个字节
CHAR systemID[8] = {'F', 'A', 'T', '3', '2', ' ', ' ', ' '}; // 系统IDFAT32系统中一般取为“FAT32”占8个字节
// 以下是有效结束标志
DWORD end = 0xaa55;
DWORD media_descriptor[2] = {0x0ffffff8, 0xffffffff}; // FAT介质描述符
DWORD cluster_tag = 0x0fffffff; // 文件簇的结束单元标记
Record vLabel; // 卷标的记录项。
// DWORD clearSize=sectors_per_cluster*bytes_per_sector-sizeof(Record);
char volumelabel[3] = "MZY";
memcpy(buf, &jump, 3); // 写入跳转指令:占3个字节(其实没有用)
memcpy(buf + 3, oem, 8); // 厂商标志OS版本号:占8个字节
// 以下是写 BPB
memcpy(buf + 11, &bytes_per_sector, 2); // 每扇区字节数占2个字节
memcpy(buf + 13, &sectors_per_cluster, 1); // 写入每簇扇区数占1个字节
memcpy(buf + 14, &reserved_sector, 2); // 写入保留扇区数占2个字节
memcpy(buf + 16, &number_of_FAT, 1); // 写入FAT数占1个字节
memcpy(buf + 21, &mediaDescriptor, 1); // 写入媒体描述符
memcpy(buf + 32, &TotalSectors, 4); // 写入总扇区数
memcpy(buf + 36, &sectors_per_FAT, 4); // 写入每FAT所占扇区数占4个字节
memcpy(buf + 44, &root_cluster_number, 4); // 写入根目录簇号占4个字节
// 以下是写 扩展BPB
memcpy(buf + 71, volumeLabel, 11); // 写卷标占11个字节
memcpy(buf + 82, systemID, 8); // 系统IDFAT32系统中一般取为“FAT32”占8个字节
// 由于引导代码对于本虚拟系统没有用,故省略
memcpy(buf + 510, &end, 2);
// WR_SECT_FAT(buf, 1); //deleted by mingxuan 2020-10-27
WR_SECT_FAT(fat32_dev, buf, 1); // modified by mingxuan 2020-10-27
// 初始化FAT
memset(buf, 0, SECTOR_SIZE); // 写介质描述单元
memcpy(buf, media_descriptor, 8);
memcpy(buf + 8, &cluster_tag, 4); // 写根目录的簇号
// WR_SECT_FAT(buf, reserved_sector); // deleted by mingxuan 2020-10-27
WR_SECT_FAT(fat32_dev, buf, reserved_sector); // modified by mingxuan 2020-10-27
// 初始化根目录
CreateRecord(volumelabel, 0x08, 0, 0, &vLabel); // 准备卷标的目录项的数据
memset(buf, 0, SECTOR_SIZE); // 将准备好的记录项数据写入虚拟硬盘
memcpy(buf, &vLabel, sizeof(Record));
// WR_SECT_FAT(buf, reserved_sector+2*sectors_per_FAT); // deleted by mingxuan 2020-10-27
WR_SECT_FAT(fat32_dev, buf, reserved_sector + 2 * sectors_per_FAT); // modified by mingxuan 2020-10-27
}
int rw_sector_fat(int io_type, int dev, u64 pos, int bytes, int proc_nr, void *buf)
{
MESSAGE driver_msg;
driver_msg.type = io_type;
driver_msg.DEVICE = MINOR(dev);
driver_msg.POSITION = pos;
driver_msg.CNT = bytes; /// hu is: 512
driver_msg.PROC_NR = proc_nr;
driver_msg.BUF = buf;
hd_rdwt(&driver_msg);
return 0;
}
int rw_sector_sched_fat(int io_type, int dev, int pos, int bytes, int proc_nr, void *buf)
{
MESSAGE driver_msg;
driver_msg.type = io_type;
driver_msg.DEVICE = MINOR(dev);
driver_msg.POSITION = pos;
driver_msg.CNT = bytes; /// hu is: 512
driver_msg.PROC_NR = proc_nr;
driver_msg.BUF = buf;
hd_rdwt_sched(&driver_msg);
return 0;
}
int sys_CreateFile(void *uesp)
{
state = CreateFile((PCHAR)(void *)get_arg(uesp, 1));
if (state == OK)
{
kprintf(" create file success");
}
else
{
DisErrorInfo(state);
}
return state;
}
int sys_DeleteFile(void *uesp)
{
state = DeleteFile((PCHAR)(void *)get_arg(uesp, 1));
if (state == OK)
{
kprintf(" delete file success");
}
else
{
DisErrorInfo(state);
}
return state;
}
int sys_OpenFile(void *uesp)
{
/* // state=OpenFile(get_arg(uesp, 1),
// get_arg(uesp, 2));
// if(state==OK)
// {
// kprintf("open file success");
// }
// else {
// DisErrorInfo(state);
// }
// return state;
state=OpenFile(get_arg(uesp, 1),
get_arg(uesp, 2));
kprintf(" open file success");
return state; */
return 0;
}
int sys_CloseFile(void *uesp)
{
state = CloseFile(get_arg(uesp, 1));
if (state == OK)
{
kprintf(" close file success");
}
else
{
DisErrorInfo(state);
}
return state;
}
int sys_WriteFile(void *uesp)
{
state = WriteFile(get_arg(uesp, 1),
(BYTE *)(void *)get_arg(uesp, 2),
get_arg(uesp, 3));
if (state == OK)
{
kprintf(" write file success");
}
else
{
DisErrorInfo(state);
}
return state;
}
int sys_ReadFile(void *uesp)
{
// state=ReadFile(get_arg(uesp, 1),
// get_arg(uesp, 2),
// get_arg(uesp, 3),
// get_arg(uesp, 4));
// if(state==OK)
// {
// //debug("read file success");
// debug(" read file success");
// }
// else {
// DisErrorInfo(state);
// }
// return state;
return 0;
}
int sys_OpenDir(void *uesp)
{
// state=OpenDir(get_arg(uesp, 1));
// if(state==OK)
// {
// //debug("open dir success");
// debug(" open dir success");
// }
// else {
// DisErrorInfo(state);
// }
// return state;
return 0;
}
int sys_CreateDir(void *uesp)
{
// state=CreateDir(get_arg(uesp, 1));
// if(state==OK)
// {
// //debug("create dir success");
// debug(" create dir success");
// }
// else {
// DisErrorInfo(state);
// }
// return state;
return 0;
}
int sys_DeleteDir(void *uesp)
{
// state=DeleteDir(get_arg(uesp, 1));
// if(state==OK)
// {
// debug("delete dir success");
// debug(" delete dir success");
// }
// else {
// DisErrorInfo(state);
// }
// return state;
return 0;
}
int sys_ListDir(void *uesp)
{
// DArray *array=NULL;
// char *s = get_arg(uesp, 1);
// CHAR temp[256]={0};
// UINT tag=0;
// array = InitDArray(10, 10);
// memset(temp, 0, sizeof(temp));
// if (strlen(s) != 0)
// {
// strcpy(temp,s);
// if(IsFile(temp,&tag))
// {
// if(tag==1)
// {
// printf("不是目录的路径\n\n");
// }
// }
// }
// else {
// GetCurrentPath(temp);
// }
// state=ListAll(temp, array);
// if(state==OK)
// {
// DirCheckup(array);
// }else {
// DisErrorInfo(state);
// kprintf("\n");
// }
// DestroyDArray(array);
return 0;
}
void DisErrorInfo(STATE state)
{
if (state == SYSERROR)
{
kprintf(" system error\n");
}
else if (state == VDISKERROR)
{
kprintf(" disk error\n");
}
else if (state == INSUFFICIENTSPACE)
{
kprintf(" no much space\n");
}
else if (state == WRONGPATH)
{
kprintf(" path error\n");
}
else if (state == NAMEEXIST)
{
kprintf(" name exists\n");
}
else if (state == ACCESSDENIED)
{
kprintf(" deny access\n");
}
else
{
kprintf(" unknown error\n");
}
}