DISK_IO.H
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:4k
源码类别:

操作系统开发

开发平台:

C/C++

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module disk_io.h
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/disk_io.h 1.4 1995/01/19 00:01:25 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 DISK_IO_H
  22. #define DISK_IO_H
  23. #include "types.h"
  24. /* ----------------------------------------------------------------------- */
  25. /* Structure to hold information about the drive geometry                  */
  26. /* ----------------------------------------------------------------------- */
  27. struct drive_geometry
  28. {
  29. dword heads;
  30. dword cylinders;
  31. dword sectors;
  32. };
  33. /* ----------------------------------------------------------------------- */
  34. /* Low level structure physical_drive, contains drive number and geometry, */
  35. /* as well as low level sector read and write routines                     */
  36. /* Geometry is determined on initialization, errorcode contains error      */
  37. /* number after call to get_geometry() and reset().                        */
  38. /* Initialization requires number (e.g. physical_drive drive1 (0x80);).    */
  39. /*                                                                         */
  40. /* Read and write are called max. 3 times in case of failure, return code  */
  41. /* contains 0 if successful. Sector CRC is verified after write.           */
  42. /* sector_number is absolute logical sector number (0 = master boot record)*/
  43. /* ----------------------------------------------------------------------- */
  44. class physical_drive
  45. {
  46. protected:
  47. virtual void get_geometry (void);
  48. public:
  49. // constructors & operators
  50. physical_drive (int number);
  51. physical_drive (physical_drive &pd);
  52. void operator= (physical_drive &pd);
  53. // public data
  54. int number;
  55. int errorcode;
  56. drive_geometry geometry;
  57. // functions
  58. virtual void reset (void);
  59. int read_sector (struct sector* sector, dword sector_number);
  60. int write_sector (struct sector* sector, dword sector_number);
  61. };
  62. /* ----------------------------------------------------------------------- */
  63. /* Physical_sector_no holds and calculates physical sector number (Head,   */
  64. /* Cylinder, Sector). Number is calculated on initialization. Log_sector   */
  65. /* is absolute logical sector number (0 = master boot record). Usage:      */
  66. /* physical_sector_no mbr (0,geometry);                                    */
  67. /* physical_sector_no mbr (0,0,1);                                         */
  68. /* ----------------------------------------------------------------------- */
  69. struct physical_sector_no
  70. {
  71. // public data
  72. dword head;
  73. dword cylinder;
  74. dword sector;
  75. // constructors
  76. physical_sector_no (dword logical_sector, const drive_geometry &geometry);
  77. physical_sector_no (dword head, dword cylinder, dword sector)
  78. {
  79. physical_sector_no::head = head;
  80. physical_sector_no::cylinder = cylinder;
  81. physical_sector_no::sector = sector;
  82. }
  83. };
  84. /* ----------------------------------------------------------------------- */
  85. /* Structure sector - contains only sector data                            */
  86. /* ----------------------------------------------------------------------- */
  87. struct sector
  88. {
  89. byte data[512];
  90. };
  91. /* ----------------------------------------------------------------------- */
  92. /* Prototype for bios call get_disk_type - returns 0 if drive not present. */
  93. /* Valid drive numbers: 0 - 255, result: 1 - floppy without disk change    */
  94. /* detection, 2 - floppy with disk change detection, 3 - harddisk          */
  95. /* ----------------------------------------------------------------------- */
  96. int get_disk_type (int drive_number);
  97. /* Bios call get_no_of_drives */
  98. int get_no_of_drives (void);
  99. #endif