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

磁盘编程

开发平台:

Others

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module fat.cpp
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/fat.cpp 1.4 1995/01/19 00:00:51 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 <stdlib.h>
  22. #include "logdr_st.h"
  23. #include "global.h"
  24. #include "fat.h"
  25. #include "input.h"
  26. fat::fat (class logical_drive *logical_drive,int number)
  27. {
  28. fat::logical_drive = logical_drive;
  29. fat::number = number;
  30. buffer = new sector;
  31. start_sector = (number == 1) ? logical_drive->info().start_fat1 : logical_drive->info().start_fat2;
  32. sector_in_buffer = -1;
  33. }
  34. dword fat16::next_cluster (dword cluster_number)
  35. {
  36. dword sector = cluster_number / 256;
  37. int offset = (cluster_number % 256) * 2;
  38. if (sector != sector_in_buffer)
  39. {
  40. read_sector (sector);
  41. }
  42. return ((dword) buffer->data[offset] | ((dword) buffer->data[offset + 1] << 8));
  43. }
  44. void fat::read_sector (dword sector)
  45. {
  46. if (logical_drive->read_sector (sector + start_sector,buffer))
  47. if (number == 1)
  48. error ("Error reading FAT 1");
  49. else
  50. error ("Error reading FAT 2");
  51. sector_in_buffer = sector;
  52. }
  53. void fat16::check_against (class fat16 *fat2)
  54. {
  55. printx ("Checking FAT ... ");
  56. for (int i=0;i<logical_drive->bpb().sectors_per_fat;i++)
  57. {
  58. read_sector (i);
  59. fat2->read_sector (i);
  60. for (int j=0;j<512;j++) if (buffer->data[j] != fat2->buffer->data[j])
  61. error ("FAT copies differ: FAT 1 -> %02Xh, FAT 2 -> %02Xh in sector %u, byte %u",buffer->data[j],fat2->buffer->data[j],i,j);
  62. if (i == 0)
  63. {
  64. if (buffer->data[0] != 0xf8)
  65. {
  66. warning (false, "Wrong media descriptor byte in FAT: %02Xh",buffer->data[0]);
  67. printx ("Continue (y/n)? ");
  68. if (ask_yes_no () == 'n') exit (-1);
  69. }
  70. if ((buffer->data[1] != 0xff) || (buffer->data[2] != 0xff) || (buffer->data[3] != 0xff))
  71. warning (true, "Wrong FAT entries 1 & 2: %02X %02X %02X %02X",buffer->data[0],buffer->data[1],buffer->data[2],buffer->data[3]);
  72. }
  73. }
  74. printx ("OKn");
  75. }
  76. void fat16::check_empty (dword new_start_sector)
  77. {
  78. dword first_cluster = (new_start_sector - logical_drive->info().start_data) / logical_drive->bpb().sectors_per_cluster + 2;
  79. dword last_cluster = logical_drive->info().no_of_clusters + 1;
  80. if (last_cluster > ((dword) 256 * logical_drive->bpb().sectors_per_fat - 1)) last_cluster = (dword) 256 * logical_drive->bpb().sectors_per_fat - 1;
  81. printx ("First Cluster: %lunLast Cluster: %lunn",first_cluster,last_cluster);
  82. printx ("Testing if empty ... ");
  83. for (dword i=first_cluster;i <= last_cluster;i++)
  84. {
  85. dword fat_entry = next_cluster (i);
  86. if (fat_entry != 0) if (fat_entry != 0xfff7)
  87. {
  88. if (fat_entry == 0xffff)
  89. {
  90. error ("New partition not empty: cluster %lu ( FAT entry: <EOF> )",i);
  91. }
  92. else
  93. {
  94. error ("New partition not empty: cluster %lu ( FAT entry: %lu )",i,fat_entry);
  95. }
  96. }
  97. }
  98. printx ("OKn");
  99. }
  100. dword fat16::min_free_cluster (void)
  101. {
  102. dword first_cluster = 2;
  103. dword last_cluster = logical_drive->info().no_of_clusters + 1;
  104. if (last_cluster > ((dword) 256 * logical_drive->bpb().sectors_per_fat - 1)) last_cluster = (dword) 256 * logical_drive->bpb().sectors_per_fat - 1;
  105. printx ("Searching for free space ... ");
  106. dword i;
  107. for (i=last_cluster;i >= first_cluster;i--)
  108. {
  109. dword fat_entry = next_cluster (i);
  110. if (fat_entry != 0) if (fat_entry != 0xfff7)
  111. {
  112. i++;
  113. break;
  114. }
  115. }
  116. printx ("OKnn");
  117. return (i);
  118. }