msdos.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #ifndef MTOOLS_MSDOS_H
  2. #define MTOOLS_MSDOS_H
  3. /*
  4. * msdos common header file
  5. */
  6. #define MAX_SECTOR 8192 /* largest sector size */
  7. #define MDIR_SIZE 32 /* MSDOS directory entry size in bytes*/
  8. #define MAX_CLUSTER 8192 /* largest cluster size */
  9. #define MAX_PATH 128 /* largest MSDOS path length */
  10. #define MAX_DIR_SECS 64 /* largest directory (in sectors) */
  11. #define NEW 1
  12. #define OLD 0
  13. #define _WORD(x) ((unsigned char)(x)[0] + (((unsigned char)(x)[1]) << 8))
  14. #define _DWORD(x) (_WORD(x) + (_WORD((x)+2) << 16))
  15. #define DELMARK ((char) 0xe5)
  16. struct directory {
  17. char name[8]; /* 0 file name */
  18. char ext[3]; /* 8 file extension */
  19. unsigned char attr; /* 11 attribute byte */
  20. unsigned char Case; /* 12 case of short filename */
  21. unsigned char ctime_ms; /* 13 creation time, milliseconds (?) */
  22. unsigned char ctime[2]; /* 14 creation time */
  23. unsigned char cdate[2]; /* 16 creation date */
  24. unsigned char adate[2]; /* 18 last access date */
  25. unsigned char startHi[2]; /* 20 start cluster, Hi */
  26. unsigned char time[2]; /* 22 time stamp */
  27. unsigned char date[2]; /* 24 date stamp */
  28. unsigned char start[2]; /* 26 starting cluster number */
  29. unsigned char size[4]; /* 28 size of the file */
  30. };
  31. #define EXTCASE 0x10
  32. #define BASECASE 0x8
  33. #define MAX32 0xffffffff
  34. #define MAX_SIZE 0x7fffffff
  35. typedef struct InfoSector_t {
  36. unsigned char signature0[4];
  37. unsigned char filler[0x1e0];
  38. unsigned char signature[4];
  39. unsigned char count[4];
  40. unsigned char pos[4];
  41. } InfoSector_t;
  42. #define INFOSECT_SIGNATURE0 0x41615252
  43. #define INFOSECT_SIGNATURE 0x61417272
  44. /* FAT32 specific info in the bootsector */
  45. typedef struct fat32_t {
  46. unsigned char bigFat[4]; /* 36 nb of sectors per FAT */
  47. unsigned char extFlags[2]; /* 40 extension flags */
  48. unsigned char fsVersion[2]; /* 42 ? */
  49. unsigned char rootCluster[4]; /* 44 start cluster of root dir */
  50. unsigned char infoSector[2]; /* 48 changeable global info */
  51. unsigned char backupBoot[2]; /* 50 back up boot sector */
  52. unsigned char reserved[6]; /* 52 ? */
  53. } fat32; /* ends at 58 */
  54. typedef struct oldboot_t {
  55. unsigned char physdrive; /* 36 physical drive ? */
  56. unsigned char reserved; /* 37 reserved */
  57. unsigned char dos4; /* 38 dos > 4.0 diskette */
  58. unsigned char serial[4]; /* 39 serial number */
  59. char label[11]; /* 43 disk label */
  60. char fat_type[8]; /* 54 FAT type */
  61. unsigned char res_2m; /* 62 reserved by 2M */
  62. unsigned char CheckSum; /* 63 2M checksum (not used) */
  63. unsigned char fmt_2mf; /* 64 2MF format version */
  64. unsigned char wt; /* 65 1 if write track after format */
  65. unsigned char rate_0; /* 66 data transfer rate on track 0 */
  66. unsigned char rate_any; /* 67 data transfer rate on track<>0 */
  67. unsigned char BootP[2]; /* 68 offset to boot program */
  68. unsigned char Infp0[2]; /* 70 T1: information for track 0 */
  69. unsigned char InfpX[2]; /* 72 T2: information for track<>0 */
  70. unsigned char InfTm[2]; /* 74 T3: track sectors size table */
  71. unsigned char DateF[2]; /* 76 Format date */
  72. unsigned char TimeF[2]; /* 78 Format time */
  73. unsigned char junk[1024 - 80]; /* 80 remaining data */
  74. } oldboot_t;
  75. struct bootsector {
  76. unsigned char jump[3]; /* 0 Jump to boot code */
  77. char banner[8]; /* 3 OEM name & version */
  78. unsigned char secsiz[2]; /* 11 Bytes per sector hopefully 512 */
  79. unsigned char clsiz; /* 13 Cluster size in sectors */
  80. unsigned char nrsvsect[2]; /* 14 Number of reserved (boot) sectors */
  81. unsigned char nfat; /* 16 Number of FAT tables hopefully 2 */
  82. unsigned char dirents[2]; /* 17 Number of directory slots */
  83. unsigned char psect[2]; /* 19 Total sectors on disk */
  84. unsigned char descr; /* 21 Media descriptor=first byte of FAT */
  85. unsigned char fatlen[2]; /* 22 Sectors in FAT */
  86. unsigned char nsect[2]; /* 24 Sectors/track */
  87. unsigned char nheads[2]; /* 26 Heads */
  88. unsigned char nhs[4]; /* 28 number of hidden sectors */
  89. unsigned char bigsect[4]; /* 32 big total sectors */
  90. union {
  91. struct fat32_t fat32;
  92. struct oldboot_t old;
  93. } ext;
  94. };
  95. extern struct OldDos_t {
  96. unsigned int tracks;
  97. unsigned int sectors;
  98. unsigned int heads;
  99. unsigned int dir_len;
  100. unsigned int cluster_size;
  101. unsigned int fat_len;
  102. unsigned int media;
  103. } old_dos[];
  104. #define FAT12 4085 /* max. number of clusters described by a 12 bit FAT */
  105. #define FAT16 65525
  106. #define MAX_SECT_PER_CLUSTER 64
  107. /* Experimentally, it turns out that DOS only accepts cluster sizes
  108. * which are powers of two, and less than 128 sectors (else it gets a
  109. * divide overflow) */
  110. #define FAT_SIZE(bits, sec_siz, clusters) \
  111. ((((clusters)+2) * ((bits)/4) - 1) / 2 / (sec_siz) + 1)
  112. #define NEEDED_FAT_SIZE(x) FAT_SIZE((x)->fat_bits, (x)->sector_size, \
  113. (x)->num_clus)
  114. /* disk size taken by FAT and clusters */
  115. #define DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) \
  116. ((n) * FAT_SIZE(bits, sec_siz, clusters) + \
  117. (clusters) * (cluster_size))
  118. #define TOTAL_DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) \
  119. (DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) + 2)
  120. /* approx. total disk size: assume 1 boot sector and one directory sector */
  121. extern const char *mversion;
  122. extern const char *mdate;
  123. int init(char drive, int mode);
  124. #define MT_READ 1
  125. #define MT_WRITE 2
  126. #endif