00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __FAT12_H
00019 #define __FAT12_H
00020
00021 #include "common/string.h"
00022 #include "proc/proc.h"
00023 #include "mm/mm.h"
00024 #include "dev/core/cmos.h"
00025
00026 #define FORM_INT(a,b) ((b<<8)|a)
00027 #define FORM_LONG(a,b,c,d) ((d<<24)|(c<<16)|(b<<8)|a)
00028 #define MAX_FILE 10
00029 #define MAX_DIR 10
00030
00031 #define BYTE1(a) (a&0xff)
00032 #define BYTE2(a) ((a>>8)&0xff)
00033 #define BYTE3(a) ((a>>16)&0xff)
00034 #define BYTE4(a) ((a>>24)&0xff)
00035
00036
00037
00038 #define ATTR_READ_ONLY 0x01
00039 #define ATTR_HIDDEN 0x02
00040 #define ATTR_SYSTEM 0x04
00041 #define ATTR_VOLUME_ID 0x08
00042 #define ATTR_DIRECTORY 0x10
00043 #define ATTR_ARCHIVE 0x20
00044 #define ATTR_LONG_NAME 0xf
00045 #define ATTR_LONG_NAME_MASK 0x3F
00046
00047
00048
00049 #define BOOT_SEC 0
00050 #define FAT1_SEC 1
00051 #define FAT2_SEC 10
00052 #define ROOT_SEC 19
00053 #define DATA_SEC 33
00054 #define MAX_BLOCK 2849
00055 #define MAX_SECTOR 2880
00056
00057
00058
00059 #define DIR_ENTRIES 16
00060
00061
00062
00063
00064 #define UNUSED 0
00065 #define RESERVED1 0xff0
00066 #define RESERVED2 0xff6
00067 #define BADCLUSTER 0xff7
00068 #define EOF1 0xFF8
00069 #define EOF2 0xFFF
00070 #define EOF(in) (in >= EOF1 && in <= EOF2)
00071
00072
00073
00074 #define FREE 0xE5
00075 #define REST_FREE 0x0
00076 #define KANJI 0x05
00077
00078
00079
00080 #define E_DISK -1
00081 #define E_FS_NEXISTS -2
00082 #define E_FS_EXISTS -3
00083 #define E_FS_FNAME -4
00084 #define E_FS_SPACE -5
00085 #define E_FS_BUSY -6
00086 #define E_NOT_LONG -7
00087 #define E_FS_BADREQ -8
00088
00089 #define O_RDONLY 1
00090 #define O_RDWR 2
00091
00092 #define MAX_FS_REQ 50
00093
00094
00095
00096 #define OPEN 1
00097 #define CLOSE 2
00098 #define READ 3
00099 #define WRITE 4
00100 #define CREATEFIL 5
00101 #define OPENDIR 6
00102 #define CREATEDIR 7
00103 #define CLOSEDIR 8
00104 #define READDIR 9
00105 #define REMOVE 10
00106 #define RENAME 11
00107
00108 #define LOAD 12
00109
00110 struct boot_sector
00111 {
00112 char jumpBoot[3];
00113 char SysName[8];
00114 int charsPerSector;
00115 char SectorsPerCluster;
00116 int ReservedSectors;
00117 char FATcount;
00118 int MaxRootEntries;
00119 int TotalSectors1;
00120 char MediaDescriptor;
00121 int SectorsPerFAT;
00122 int SectorsPerTrack;
00123 int HeadCount;
00124 long HiddenSectors;
00125 long TotalSectors2;
00126 char DriveNumber;
00127 char Reserved1;
00128 char ExtBootSignature;
00129 long VolumeSerial;
00130 char VolumeLabel[11];
00131 char Reserved2[8];
00132 };
00133 struct dir_entry
00134 {
00135 char Filename[8];
00136 char Extension[3];
00137 char Attributes;
00138 char NTRes;
00139 char CrtTimeTenth;
00140 int CrtTime;
00141 int CrtDate;
00142 int LstAccDate;
00143 int FstClusHI;
00144 int WrtTime;
00145 int WrtDate;
00146 int FstClusLO;
00147 long FileSize;
00148 };
00149
00150 typedef struct
00151 {
00152 char name[256];
00153 char attribute;
00154 DATE crt_dt;
00155 TIME crt_time;
00156 DATE acc_dt;
00157 long clu;
00158 long size;
00159 DATE mod_dt;
00160 TIME mod_time;
00161 } DIRENT;
00162 struct long_dir_entry
00163 {
00164 char LDIR_Ord;
00165 unsigned char LDIR_Name1[10];
00166 char LDIR_Attr;
00167 char LDIR_Type;
00168 char LDIR_Chksum;
00169 unsigned char LDIR_Name2[12];
00170 int LDIR_FstClusLO;
00171 unsigned char LDIR_Name3[4];
00172 };
00173 struct sector
00174 {
00175 int base;
00176 int length;
00177 };
00178 struct file_des
00179 {
00180 int avl;
00181 char fname[256];
00182 int mode;
00183 int sec_offset;
00184 int offset;
00185 unsigned char buffer[512];
00186 long length;
00187 long tot_offset;
00188 struct dir_entry rs;
00189 int root_sec;
00190 int root_in;
00191 };
00192 extern struct file_des fd[MAX_PROC][MAX_FILE];
00193 struct dir_des
00194 {
00195 int avl;
00196 char fname[256];
00197 int sec_offset;
00198 int offset;
00199 unsigned char buffer[512];
00200 };
00201 extern struct dir_des dd[MAX_PROC][MAX_DIR];
00202
00203 typedef struct
00204 {
00205 int type;
00206 int from_pid;
00207 union
00208 {
00209 struct
00210 {
00211 char *fname;
00212 int mode;
00213 }op;
00214 struct
00215 {
00216 int fd_in;
00217 }cl;
00218 struct
00219 {
00220 int fd_in;
00221 char *buf;
00222 int len;
00223 }re;
00224 struct
00225 {
00226 int fd_in;
00227 char *buf;
00228 int len;
00229 }wr;
00230 struct
00231 {
00232 char *name;
00233 }cr;
00234
00235 struct
00236 {
00237 char *dir_name;
00238 }opd;
00239 struct
00240 {
00241 int dd_in;
00242 }cld;
00243 struct
00244 {
00245 char *name;
00246 }crd;
00247
00248 struct
00249 {
00250 int dd_in;
00251 DIRENT *dir;
00252 }red;
00253 struct
00254 {
00255 char *old_name;
00256 char *new_name;
00257 }ren;
00258 struct
00259 {
00260 char *name;
00261 }rem;
00262 struct
00263 {
00264 char *fname;
00265 }load;
00266 };
00267 }fs_request;
00268
00269 int form_time();
00270 void get_time(int ti,TIME *t);
00271 int form_date();
00272
00273 unsigned char ChkSum (unsigned char *name);
00274 void parse_fat(int * fat_entry,int fat1,int fat2,int in);
00275 int read_fat(int *fat_entry,int in,int st_sec);
00276 int write_fat(int fat,int in,int st_sec);
00277 int write_dir(struct dir_entry *rs,int in,int st_sec);
00278 void print_dir(struct dir_entry *rs);
00279 void parse_dir(unsigned char *a,int in,struct dir_entry *rs);
00280 int read_dir(struct dir_entry *rs,int in,int st_sec);
00281 int write_long_dir(struct long_dir_entry *rs,int in,int st_sec);
00282 void parse_long_dir(struct long_dir_entry *rs,unsigned char *a,int i);
00283 void print_long_dir(struct long_dir_entry *rs);
00284 int read_long_dir(struct long_dir_entry *rs,int in,int st_sec);
00285 void print_boot_sector(struct boot_sector *bs);
00286 int read_boot_sector(struct boot_sector *bs);
00287 int write_boot_sector(struct boot_sector *bs);
00288 int read_sector(int offs,unsigned char *a);
00289 int write_sector(int offs,unsigned char *a);
00290 int clear_sec(int sec);
00291 void print_DIRENT(DIRENT *ds);
00292 int format(char *vlab);
00293 int get_next_sector(int sec);
00294 int get_free_sector(int prev);
00295 int get_free_entry(int *sec,int no_ent);
00296 int remove_chain(long clu);
00297 int get_long_name(char *long_name,unsigned char *a,int j,int *prev_sec,int cur);
00298 int rem_long_name(unsigned char *a,int j,int *prev_sec,int *c);
00299 int search(char *name,struct sector sec,struct dir_entry *rs,int *root_sec,int *root_in,int *prev_sec,int *s_cur);
00300 int get_part(char *name,int i);
00301 int get_dir_entry(char * dirname,struct dir_entry *rs,int *root_sec,int *root_in,int *prev,int *cur);
00302 int do_ls(int pid,char *dirname);
00303 int do_load(char *fname,int pid);
00304
00305 int do_open(int pid,char *fname,int mode);
00306 int do_opendir(int pid,char *fname);
00307 int do_read(int pid,int fd_in,char *buf,int length);
00308 int do_readdir(int pid,int dd_in,DIRENT *dir);
00309 int do_write(int pid,int fd_in,char *buf,int length);
00310 int do_close(int pid,int fd_in);
00311 int do_closedir(int pid,int dd_in);
00312 int do_create(int pid,char *name,int is_dir);
00313 int fs_create(int pid,char *name);
00314 int do_createdir(int pid,char *name);
00315 int do_remove(int pid,char *name);
00316 int do_rename(int pid,char *old_name,char *new_name);
00317 void fs_init();
00318 int do_copy(int pid,char *src,char *dest);
00319 void runFS();
00320 int addfsreq(fs_request *r);
00321 void fscloseAll(DW pid);
00322
00323
00324 #endif