home *** CD-ROM | disk | FTP | other *** search
/ swCHIP 1991 January / swCHIP_95-1.bin / chip / copy / fips12 / restorrb / restorrb.c next >
C/C++ Source or Header  |  1995-12-11  |  7KB  |  227 lines

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