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

操作系统开发

开发平台:

C/C++

  1. /*
  2.     FIPS - the First nondestructive Interactive Partition Splitting program
  3.     Module restorrb.c
  4.     Copyright (C) 1993 Arno Schaefer
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 1, or (at your option)
  8.     any later version.
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program; if not, write to the Free Software
  15.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #include <stdio.h>
  18. #include <io.h>
  19. #include <stdlib.h>
  20. #include <dos.h>
  21. #include <bios.h>
  22. #include <alloc.h>
  23. #include <conio.h>
  24. #include <ctype.h>
  25. #include "rtypes.h"
  26. #include "rversion.h"
  27. #define DISK_INT 0x13
  28. #define RESET_DISK 0
  29. #define WRITE_SECTOR 3
  30. #define VERIFY_SECTOR 4
  31. #define DISK1 0x80
  32. /* ----------------------------------------------------------------------- */
  33. /* Copyright notice and version number                                     */
  34. /* ----------------------------------------------------------------------- */
  35. void notice (void)
  36. {
  37. printf ("nFIPS version " FIPS_VERSION ", Copyright (C) 1993/94 Arno Schaefern");
  38. printf ("Module RESTORRB.EXE - Please read the file README.1STn");
  39. printf ("FIPS comes with ABSOLUTELY NO WARRANTY, see file COPYING for detailsn");
  40. printf ("This is free software, and you are welcome to redistribute itn");
  41. printf ("under certain conditions; again see file COPYING for details.nn");
  42. }
  43. /* ----------------------------------------------------------------------- */
  44. /* Error Handling                                                          */
  45. /* ----------------------------------------------------------------------- */
  46. int getx (void)
  47. {
  48. int character = getch();
  49. if (character == 3)
  50. {
  51. printf ("n");
  52. exit (0);
  53. }
  54. return (character);
  55. }
  56. void error (char *message)
  57. {
  58. fprintf (stderr,"nError: %s!n",message);
  59. exit (-1);
  60. }
  61. /* ----------------------------------------------------------------------- */
  62. /* BIOS calls                                                              */
  63. /* ----------------------------------------------------------------------- */
  64. int reset_drives (void)
  65. {
  66. union REGS regs;
  67. regs.h.ah = RESET_DISK;
  68. regs.h.dl = DISK1;
  69. int86 (DISK_INT,&regs,&regs);
  70. if (regs.x.cflag) return (-1);
  71. return 0;
  72. }
  73. /* ----------------------------------------------------------------------- */
  74. /* read / write sectors                                                    */
  75. /* ----------------------------------------------------------------------- */
  76. int verify_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer)
  77. {
  78. if (biosdisk (VERIFY_SECTOR,drive_number,head,cylinder,sector,1,buffer)) return (-1);
  79. return 0;
  80. }
  81. int write_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer)
  82. {
  83. int i;
  84. boolean done=false;
  85. for (i=0;i<3;i++)
  86. {
  87. if (!biosdisk (WRITE_SECTOR,drive_number,head,cylinder,sector,1,buffer))
  88. {
  89. done=true;
  90. break;
  91. }
  92. reset_drives();
  93. }
  94. if (!done) return (-1);
  95. return (verify_sector (drive_number,head,cylinder,sector,buffer));
  96. }
  97. int write_root_sector (int drive_number,byte *buffer)
  98. {
  99. return (write_sector (drive_number,0,0,1,buffer));
  100. }
  101. /* ----------------------------------------------------------------------- */
  102. /* User Input                                                              */
  103. /* ----------------------------------------------------------------------- */
  104. void ask_for_write_permission (char *filename)
  105. {
  106. int character = 'x';
  107. printf ("nReady to write old root- and bootsector from file %s to diskn", filename);
  108. printf ("Do you want to proceed (y/n): ");
  109. while ((character != 'y') && (character != 'n')) character = getx();
  110. printf ("%cn",character);
  111. if (character == 'n') exit (0);
  112. }
  113. /* ----------------------------------------------------------------------- */
  114. /* Main                                                                    */
  115. /* ----------------------------------------------------------------------- */
  116. void main (void)
  117. {
  118. byte rootsector[512];
  119. byte bootsector[512];
  120. int drive_number,partition_number,i;
  121. FILE *handle;
  122. dword head,cylinder,sector;
  123. char *filename = "a:\rootboot.000";
  124. int no_of_savefiles = 0;
  125. char first = 'x';
  126. char list[10];
  127. notice();
  128. if (reset_drives ()) error ("Drive Initialization Failure");
  129. for (i='0';i<='9';i++)
  130. {
  131. filename[14] = i;
  132. if (access (filename,0) == 0)
  133. {
  134. if (first == 'x') first = i;
  135. list[no_of_savefiles++] = i;
  136. printf ("Found save file %sn",filename);
  137. }
  138. }
  139. if (no_of_savefiles == 0) error ("No savefile ROOTBOOT.00? found on disk A:");
  140. if (no_of_savefiles > 1)
  141. {
  142. printf ("nWhich file do you want to restore (");
  143. for (i = 0; i < no_of_savefiles; i++)
  144. {
  145. printf ("%c/", list[i]);
  146. }
  147. printf ("b)? ");
  148. while (true)
  149. {
  150. int c;
  151. if (isdigit (c = getx()))
  152. {
  153. boolean found = false;
  154. for (i = 0; i < no_of_savefiles; i++)
  155. {
  156. if (c == list[i]) found = true;
  157. }
  158. if (found)
  159. {
  160. printf ("%cn", c);
  161. filename[14] = c;
  162. break;
  163. }
  164. }
  165. }
  166. }
  167. else
  168. {
  169. filename[14] = first;
  170. }
  171. if ((handle = fopen (filename,"rb")) == NULL)
  172. error ("Can't open file");
  173. for (i=0;i<512;i++)
  174. {
  175. int character = fgetc (handle);
  176. if (character == EOF) error ("Error reading file from disk");
  177. *(rootsector + i) = character;
  178. }
  179. for (i=0;i<512;i++)
  180. {
  181. int character = fgetc (handle);
  182. if (character == EOF) error ("Error reading file from disk");
  183. *(bootsector + i) = character;
  184. }
  185. if ((drive_number = fgetc (handle)) == EOF) error ("Error reading file from disk");
  186. if ((partition_number = fgetc (handle)) == EOF) error ("Error reading file from disk");
  187. if (fclose (handle)) error ("Error closing file");
  188. head = (dword) rootsector[0x1be+16*partition_number+1];
  189. cylinder = (((dword) rootsector[0x1be+16*partition_number+2] << 2) & 0x300)
  190. | (dword) rootsector[0x1be+16*partition_number+3];
  191. sector = (dword) rootsector[0x1be+16*partition_number+2] & 0x3f;
  192. ask_for_write_permission(filename);
  193. if (write_root_sector (drive_number,rootsector))
  194. error ("Error writing rootsector");
  195. if (write_sector (drive_number,head,cylinder,sector,bootsector))
  196. error ("Error writing bootsector");
  197. }