1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
typedef struct Dosboot Dosboot;
typedef struct Dos Dos;
typedef struct Dosdir Dosdir;
typedef struct Dosfile Dosfile;
typedef struct Dospart Dospart;
struct Dospart
{
uchar flag; /* active flag */
uchar shead; /* starting head */
uchar scs[2]; /* starting cylinder/sector */
uchar type; /* partition type */
uchar ehead; /* ending head */
uchar ecs[2]; /* ending cylinder/sector */
uchar start[4]; /* starting sector */
uchar len[4]; /* length in sectors */
};
#define FAT12 0x01
#define FAT16 0x04
#define FATHUGE 0x06
#define DMDDO 0x54
struct Dosboot{
uchar magic[3];
uchar version[8];
uchar sectsize[2];
uchar clustsize;
uchar nresrv[2];
uchar nfats;
uchar rootsize[2];
uchar volsize[2];
uchar mediadesc;
uchar fatsize[2];
uchar trksize[2];
uchar nheads[2];
uchar nhidden[4];
uchar bigvolsize[4];
uchar driveno;
uchar reserved0;
uchar bootsig;
uchar volid[4];
uchar label[11];
uchar reserved1[8];
};
struct Dosfile{
Dos *dos; /* owning dos file system */
char name[8];
char ext[3];
uchar attr;
long length;
long pstart; /* physical start cluster address */
long pcurrent; /* physical current cluster address */
long lcurrent; /* logical current cluster address */
long offset;
};
struct Dos{
int dev; /* device id */
long (*read)(int, void*, long); /* read routine */
long (*seek)(int, long); /* seek routine */
int start; /* start of file system */
int sectsize; /* in bytes */
int clustsize; /* in sectors */
int clustbytes; /* in bytes */
int nresrv; /* sectors */
int nfats; /* usually 2 */
int rootsize; /* number of entries */
int volsize; /* in sectors */
int mediadesc;
int fatsize; /* in sectors */
int fatclusters;
int fatbits; /* 12 or 16 */
long fataddr; /* sector number */
long rootaddr;
long dataaddr;
long freeptr;
Dosfile root;
};
struct Dosdir{
uchar name[8];
uchar ext[3];
uchar attr;
uchar reserved[10];
uchar time[2];
uchar date[2];
uchar start[2];
uchar length[4];
};
#define DRONLY 0x01
#define DHIDDEN 0x02
#define DSYSTEM 0x04
#define DVLABEL 0x08
#define DDIR 0x10
#define DARCH 0x20
extern int chatty;
extern int dosboot(Dos*, char*);
extern int dosinit(Dos*, int, int);
extern long dosread(Dosfile*, void*, long);
extern int dosstat(Dos*, char*, Dosfile*);
extern int doswalk(Dosfile*, char*);
extern int plan9ini(Dos*, char*);
|