logdr_st.h
上传用户:yingdiyu
上传日期:2007-01-06
资源大小:116k
文件大小:6k
源码类别:

磁盘编程

开发平台:

Others

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module logdr_st.h
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/logdr_st.h 1.4 1995/01/19 00:01:27 schaefer Exp $
  6. Copyright (C) 1993 Arno Schaefer
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. Report problems and direct all questions to:
  19. schaefer@rbg.informatik.th-darmstadt.de
  20. */
  21. #ifndef LOGDR_ST_H
  22. #define LOGDR_ST_H
  23. #include "types.h"
  24. #include "disk_io.h"
  25. /* ----------------------------------------------------------------------- */
  26. /* Class boot_sector - derived from structure sector                       */
  27. /* Must be initialized with pointer to logical drive object                */
  28. /* Read() and write() read/write sector 0 of logical drive                 */
  29. /* ----------------------------------------------------------------------- */
  30. class boot_sector:public sector
  31. {
  32. class logical_drive *logical_drive;
  33. public:
  34. // constructor
  35. boot_sector (class logical_drive *logical_drive)
  36. { boot_sector::logical_drive = logical_drive; }
  37. // functions
  38. int read (void);
  39. int write (void);
  40. };
  41. /* ------------------------------------------------------------------------ */
  42. /* Bios Parameter Block structure                                           */
  43. /* This is not exactly the BPB as understood by DOS, because it contains    */
  44. /* the additional fields that are in the boot_sector like jump_instruction, */
  45. /* oem_name etc. Get() extracts info from the boot_sector, put() writes the */
  46. /* info back into the boot_sector buffer.                                   */
  47. /* ------------------------------------------------------------------------ */
  48. struct bios_parameter_block
  49. {
  50. byte jump_instruction[3]; // EB xx 90 or E9 xx xx
  51. char oem_name[9];
  52. word bytes_per_sector;          // usually 512
  53. byte sectors_per_cluster;       // may differ
  54. word reserved_sectors;          // usually 1 (boot_sector)
  55. byte no_of_fats;                // usually 2
  56. word no_of_rootdir_entries;     // usually 512 for HDs (?), 224 for
  57. // HD-Floppies, 112 for DD-Floppies
  58. word no_of_sectors;             // 0 on BIGDOS partitions
  59. byte media_descriptor;          // usually F8h
  60. word sectors_per_fat;           // depends on partition size
  61. word sectors_per_track;         // depends on drive
  62. word drive_heads;               // dto.
  63. dword hidden_sectors;           // first sector of partition or 0 for FDs
  64. dword no_of_sectors_long;       // number of sectors on BIGDOS partitions
  65. byte phys_drive_no;             // usually 80h
  66. byte signature;                 // usually 29h
  67. dword serial_number;            // random
  68. char volume_label[12];
  69. char file_system_id[9];
  70. void get (boot_sector *boot_sector);
  71. void put (boot_sector *boot_sector);
  72. };
  73. /* ----------------------------------------------------------------------- */
  74. /* Some miscellaneous figures about the drive                              */
  75. /* Get() extracts this info from the BPB                                   */
  76. /* ----------------------------------------------------------------------- */
  77. struct logical_drive_info
  78. {
  79. dword start_fat1;
  80. dword start_fat2;
  81. dword start_rootdir;
  82. dword start_data;
  83. dword no_of_clusters;
  84. virtual void get (const bios_parameter_block &bpb);
  85. };
  86. /* ----------------------------------------------------------------------- */
  87. /* Abstract Class logical_drive. This can be any DOS drive that allows     */
  88. /* direct reading and writing of sectors, like Harddisk Partitions, Floppy */
  89. /* disks or Ramdisks                                                       */
  90. /* ----------------------------------------------------------------------- */
  91. class logical_drive
  92. {
  93. // private data
  94. struct bios_parameter_block pr_bpb;
  95. struct logical_drive_info pr_info;
  96. public:
  97. // public data
  98. class boot_sector *boot_sector;
  99. // member access functions
  100. virtual bios_parameter_block &bpb() { return pr_bpb; }
  101. virtual logical_drive_info &info() { return pr_info; }
  102. // functions
  103. virtual int read_sector (dword number,sector *sector) = 0;
  104. virtual int write_sector (dword number,sector *sector) = 0;
  105. // pure virtual functions
  106. int read_boot_sector (void) { return (boot_sector->read ()); }
  107. int write_boot_sector (void) { return (boot_sector->write ()); }
  108. void get_bpb (void) { bpb().get (boot_sector); }
  109. void put_bpb (void) { bpb().put (boot_sector); }
  110. void get_info (void) { info().get (bpb ()); }
  111. };
  112. /* ----------------------------------------------------------------------- */
  113. /* Function to read boot_sector from logical drive                         */
  114. /* It must be in the header file because it is inline                      */
  115. /* ----------------------------------------------------------------------- */
  116. inline int boot_sector::read (void)
  117. {
  118. return logical_drive->read_sector (0,this);
  119. }
  120. /* ----------------------------------------------------------------------- */
  121. /* Function to write boot_sector to logical drive                          */
  122. /* ----------------------------------------------------------------------- */
  123. inline int boot_sector::write (void)
  124. {
  125. return logical_drive->write_sector (0,this);
  126. }
  127. #endif