dosfs.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. typedef struct Dosboot Dosboot;
  2. typedef struct Dos Dos;
  3. typedef struct Dosdir Dosdir;
  4. typedef struct Dosfile Dosfile;
  5. typedef struct Dospart Dospart;
  6. struct Dospart
  7. {
  8. uchar flag; /* active flag */
  9. uchar shead; /* starting head */
  10. uchar scs[2]; /* starting cylinder/sector */
  11. uchar type; /* partition type */
  12. uchar ehead; /* ending head */
  13. uchar ecs[2]; /* ending cylinder/sector */
  14. uchar start[4]; /* starting sector */
  15. uchar len[4]; /* length in sectors */
  16. };
  17. struct Dosboot{
  18. uchar magic[3];
  19. uchar version[8];
  20. uchar sectbytes[2];
  21. uchar clustsize;
  22. uchar nresrv[2];
  23. uchar nfats;
  24. uchar rootsize[2];
  25. uchar volsize[2];
  26. uchar mediadesc;
  27. uchar fatsize[2];
  28. uchar trksize[2];
  29. uchar nheads[2];
  30. uchar nhidden[4];
  31. uchar bigvolsize[4];
  32. uchar driveno;
  33. uchar reserved0;
  34. uchar bootsig;
  35. uchar volid[4];
  36. uchar label[11];
  37. uchar reserved1[8];
  38. };
  39. struct Dosfile{
  40. Dos * dos; /* owning dos file system */
  41. int pdir; /* sector containing directory entry */
  42. int odir; /* offset to same */
  43. char name[8];
  44. char ext[3];
  45. uchar attr;
  46. long length;
  47. long pstart; /* physical start cluster address */
  48. long pcurrent; /* physical current cluster address */
  49. long lcurrent; /* logical current cluster address */
  50. long offset;
  51. };
  52. struct Dos{
  53. int dev; /* device id */
  54. long (*read)(int, void*, long); /* read routine */
  55. vlong (*seek)(int, vlong); /* seek routine */
  56. long (*write)(int, void*, long); /* write routine */
  57. int start; /* start of file system (sector no.) */
  58. int sectbytes; /* size of a sector */
  59. int clustsize; /* size of a cluster (in sectors) */
  60. int clustbytes; /* size of a cluster (in bytes) */
  61. int nresrv; /* sectors */
  62. int nfats; /* usually 2 */
  63. int rootsize; /* number of entries */
  64. int volsize; /* in sectors */
  65. int mediadesc;
  66. int fatsize; /* size of a fat (in sectors) */
  67. int fatbytes; /* size of a fat (in bytes) */
  68. int fatclusters; /* no. of clusters governed by fat */
  69. int fatbits; /* 12 or 16 */
  70. long fataddr; /* sector address of first fat */
  71. long rootaddr; /* sector address of root directory */
  72. long dataaddr; /* sector address of first data block */
  73. long freeptr; /* for cluster allocation */
  74. Dosfile root;
  75. };
  76. struct Dosdir{
  77. uchar name[8];
  78. uchar ext[3];
  79. uchar attr;
  80. uchar reserved[10];
  81. uchar time[2];
  82. uchar date[2];
  83. uchar start[2];
  84. uchar length[4];
  85. };
  86. #define DRONLY 0x01
  87. #define DHIDDEN 0x02
  88. #define DSYSTEM 0x04
  89. #define DVLABEL 0x08
  90. #define DOSDIR 0x10
  91. #define DARCH 0x20
  92. extern int dosinit(Dos*);
  93. extern Dosfile* dosopen(Dos*, char*, Dosfile*);
  94. extern int dostrunc(Dosfile*);
  95. extern long dosread(Dosfile*, void*, long);
  96. extern long doswrite(Dosfile*, void*, long);
  97. extern Dos dos;