HDSTRUCT.H
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:5k
源码类别:

操作系统开发

开发平台:

WINDOWS

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module hdstruct.h
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/hdstruct.h 1.4 1995/01/19 00:01:26 schaefer Exp schaefer $
  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 HDSTRUCT_H
  22. #define HDSTRUCT_H
  23. #include "types.h"
  24. #include "disk_io.h"
  25. /* ----------------------------------------------------------------------- */
  26. /* Class root_sector - derived from structure sector                        */
  27. /* Must be initialized with a pointer to a physical_drive object           */
  28. /* Read() and Write() read/write sector 0 of physical drive                */
  29. /* ----------------------------------------------------------------------- */
  30. class root_sector:public sector
  31. {
  32. physical_drive *drive;
  33. public:
  34. // constructors and operators
  35. root_sector (physical_drive *drive) { root_sector::drive = drive; }
  36. root_sector (root_sector &rs);
  37. void operator= (root_sector &rs);
  38. // functions
  39. int read (void) { return drive->read_sector (this, 0); }
  40. int write (void) { return drive->write_sector (this, 0); }
  41. };
  42. /* ----------------------------------------------------------------------- */
  43. /* Partition Info Structure                                                */
  44. /* Each entry in the partition table contains this information             */
  45. /* ----------------------------------------------------------------------- */
  46. struct partition_info
  47. {
  48. byte bootable;                  // 80h or 0
  49. byte start_head;                // location of first sector (boot_sector)
  50. word start_cylinder;
  51. byte start_sector;
  52. byte system; // 1 = 12-bit FAT
  53. // 4 = 16-bit FAT & 16-bit sector number
  54. // 6 = 16-bit FAT & 32-bit sector number (BIGDOS)
  55. byte end_head;                  // location of last sector
  56. word end_cylinder;
  57. byte end_sector;
  58. dword start_sector_abs;         // = start_cylinder * heads * sectors
  59. // + start_head * sectors + start_sector - 1
  60. dword no_of_sectors_abs;        // = end_cylinder * heads * sectors + end_head * sectors
  61. // + end_sector - start_sector_abs
  62. };
  63. /* ----------------------------------------------------------------------- */
  64. /* Partition Table Structure                                               */
  65. /* The partition table consists of 4 entries for the 4 possible partitions */
  66. /* Get() reads the partition table from the root_sector, put() writes the   */
  67. /* data back into the root_sector buffer                                    */
  68. /* ----------------------------------------------------------------------- */
  69. struct partition_table
  70. {
  71. partition_info partition_info[4];
  72. void get (root_sector *root_sector);
  73. void put (root_sector *root_sector);
  74. };
  75. /* ----------------------------------------------------------------------- */
  76. /* Harddrive Class, derived from physical_drive                            */
  77. /* Represents one physical harddrive. Must be initialized with the drive   */
  78. /* number (0x80 for 1st HDD). Contains the root_sector and partition table. */
  79. /* ----------------------------------------------------------------------- */
  80. class harddrive:public physical_drive
  81. {
  82. partition_table pr_partition_table;
  83. public:
  84. // constructors, destructors, operators
  85. harddrive (int number):physical_drive (number)
  86. {
  87. root_sector = new class root_sector (this);
  88. }
  89. harddrive (harddrive &hd):physical_drive (hd)
  90. {
  91. root_sector = new class root_sector (*(hd.root_sector));
  92. partition_table () = hd.partition_table ();
  93. }
  94. void operator= (harddrive &hd);
  95. ~harddrive (void) { delete root_sector; }
  96. // public data
  97. root_sector *root_sector;
  98. // member access functions
  99. virtual partition_table &partition_table() { return pr_partition_table; }
  100. // functions
  101. int read_root_sector (void) { return (root_sector->read ()); }
  102. int write_root_sector (void) { return (root_sector->write ()); }
  103. void get_partition_table (void); // extract pt data from root sector
  104. void put_partition_table (void) // put pt data into root sector
  105. {partition_table().put (root_sector);}
  106. };
  107. #endif