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

操作系统开发

开发平台:

C/C++

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module calculat.cpp
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/calculat.cpp 1.4 1995/01/19 00:00:49 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. #include "hdstruct.h"
  22. #include "fipsspec.h"
  23. /* ----------------------------------------------------------------------- */
  24. /* Some calculations                                                       */
  25. /* ----------------------------------------------------------------------- */
  26. void fips_partition_table::calculate_new_root
  27. (
  28. dword new_start_cylinder,
  29. partition *partition,
  30. const drive_geometry &geometry
  31. )
  32. {
  33. for (int i = 0; i < 3; i++) if (!partition_info[i].system)
  34. // move DOS partitions to the beginning of the partition table
  35. {
  36. for (int j = i + 1; j < 4; j++) if
  37. (
  38. (partition_info[j].system == 1) ||
  39. (partition_info[j].system == 4) ||
  40. (partition_info[j].system == 6)
  41. )
  42. {
  43. struct partition_info tmppart = partition_info[i];
  44. partition_info[i] = partition_info[j];
  45. partition_info[j] = tmppart;
  46. if (partition->number == j) partition->number = i;
  47. break;
  48. }
  49. }
  50. int partition_no = partition->number;
  51. partition->partition_info = &partition_info[partition_no];
  52. for (i=0;i<4;i++) if (!partition_info[i].system) break;
  53. // search for first empty slot
  54. struct partition_info *newpart = &partition_info[i];
  55. struct partition_info *oldpart = &partition_info[partition_no];
  56. newpart->bootable = 0;
  57. newpart->start_sector_abs =
  58. new_start_cylinder *
  59. geometry.heads *
  60. geometry.sectors;
  61. newpart->no_of_sectors_abs =
  62. oldpart->start_sector_abs +
  63. oldpart->no_of_sectors_abs -
  64. newpart->start_sector_abs;
  65. if
  66. (
  67. (newpart->no_of_sectors_abs > 0xffff) ||
  68. (newpart->start_sector_abs > 0xffff)
  69. )
  70. {
  71. newpart->system = 6;
  72. }
  73. else if
  74. (
  75. newpart->no_of_sectors_abs >= 20740
  76. )
  77. {
  78. newpart->system = 4;
  79. }
  80. else
  81. {
  82. newpart->system = 1;
  83. }
  84. oldpart->no_of_sectors_abs =
  85. newpart->start_sector_abs -
  86. oldpart->start_sector_abs;
  87. if
  88. (
  89. (oldpart->no_of_sectors_abs > 0xffff) ||
  90. (oldpart->start_sector_abs > 0xffff)
  91. )
  92. {
  93. oldpart->system = 6;
  94. }
  95. else
  96. {
  97. oldpart->system = 4;
  98. }
  99. correct_physical (geometry);
  100. }
  101. void fips_bpb::calculate_new_boot (const partition_info &partition_info)
  102. {
  103. if ((partition_info.no_of_sectors_abs > 0xffff) || (partition_info.start_sector_abs > 0xffff))
  104. {
  105. no_of_sectors = 0;
  106. no_of_sectors_long = partition_info.no_of_sectors_abs;
  107. }
  108. else
  109. {
  110. no_of_sectors_long = 0;
  111. no_of_sectors = partition_info.no_of_sectors_abs;
  112. }
  113. }