home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / novirus.lzh / NOVIRUS.C next >
C/C++ Source or Header  |  1988-01-24  |  3KB  |  120 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3.  
  4. #define DOS 0x21
  5. #define READ 2
  6. #define CLEAR 0
  7. #define CORRUPT 1
  8. #define DONE 2
  9.  
  10. main(argc,argv)
  11. int argc;
  12. char *argv[];
  13.    {
  14.  
  15.    int logged_drive, com1_drive, com2_drive, ret_code;
  16.    int i, j, sector, flag, count1, count2;
  17.    char com1_ver[9], com2_ver[9], buffer1[528], buffer2[528];
  18.    FILE *com1_fp, *com2_fp;
  19.  
  20. /* if two  args are not specified, print message and quit */
  21.    if(argc != 3) {
  22.       printf("usage: novirus [drive][path]com1 [drive][path]com2\n");
  23.       printf("   where com1 is command processor to be checked\n");
  24.       printf("   com2 is known good command processor\n");
  25.       exit(0);
  26.       }
  27.  
  28. /* maybe later find out how big sectors are */
  29.    sector = 512;
  30.  
  31. /* find what drive we're logged to */
  32.    _AH = 0x19;
  33.    geninterrupt(DOS);
  34.    logged_drive = _AL;
  35.  
  36.    printf("logged drive: %d\n",logged_drive);
  37.  
  38. /* are drives specified on command line? */
  39.    if(*(argv[1]+1) == ':') com1_drive = *(argv[1]) & 0xDF - 'A' + 1;
  40.    else com1_drive = logged_drive;
  41.  
  42.    if(*(argv[2]+1) == ':') com2_drive = *(argv[2]) & 0xDF - 'A' + 1;
  43.    else com2_drive = logged_drive;
  44.  
  45.    printf("drive 1: %d\n",com1_drive);
  46.    printf("drive 2: %d\n",com2_drive);
  47.  
  48. /* are both drives formatted with same DOS version? */
  49.    if(com1_drive != com2_drive) {
  50.       get_form_ver(com1_drive,com1_ver);
  51.       get_form_ver(com2_drive,com2_ver);
  52.       if(strcmp(com1_ver, com2_ver) != 0) {
  53.          printf("cannot compare two different verions: %s and %s\n",
  54.             com1_ver, com2_ver);
  55.          exit(1);
  56.          }
  57.       }
  58.  
  59.    com1_fp = fopen(argv[1],"r");
  60.    com2_fp = fopen(argv[2],"r");
  61.  
  62.    if(com1_fp == 0 || com2_fp == 0) {
  63.       printf("cannot find command processors as specified:\n1: %s\n2: %s\n",
  64.          argv[1],argv[2]);
  65.       exit(3);
  66.       }
  67.  
  68.    flag = CLEAR;
  69.    j = 0;
  70.    while(flag == CLEAR) {
  71.       j++;
  72.       count2 = fread((void *)buffer1,1,sector,com2_fp);
  73.       count1 = fread((void *)buffer2,1,sector,com1_fp);
  74.       if(count1 != count2) flag = CORRUPT;
  75.       else {
  76.          if(count2 < sector) flag = DONE;
  77.          for(i = 0; i < count2; i++) 
  78.             if(buffer1[i] != buffer2[i]) flag = CORRUPT;
  79.          }
  80.       }
  81.  
  82.    printf("flag: %d; j: %d\n",flag,j);
  83.  
  84.    fclose(com2_fp);
  85.    fclose(com1_fp);
  86.  
  87.    if(flag == CORRUPT) {
  88.       fopen(argv[1],"w");
  89.       fopen(argv[2],"r");
  90.       while((count2 = fread((void *)buffer1,1,sector,com2_fp)) != 0)
  91.          fwrite((void *)buffer1,1,count2,com1_fp);
  92.       fclose(com2_fp);
  93.       fclose(com1_fp);
  94.       printf("%s corrupted, corrected from %s\n",argv[1],argv[2]);
  95.       printf("reboot your computer now\n");
  96.       }
  97.    }
  98.  
  99. get_form_ver(drive,version)
  100. int drive;
  101. char *version;
  102.    {
  103.    char buffer[528];
  104.    union REGS regs;
  105.  
  106.    regs.x.ax = drive + 0xff;
  107.    regs.x.cx = 1;
  108.    regs.x.dx = 0;
  109.    regs.x.bx = (int)(&buffer);
  110.    int86(0x25,®s,®s);
  111.    _SP += 2;
  112.    if(regs.x.cflag != 0) {
  113.       printf("error accessing drive %c: INT 25h error %xh",
  114.          'A'-1+drive,_doserrno);
  115.       exit(2);
  116.       }
  117.    strncpy(version,buffer+3,8);
  118.    version[8] = 0;
  119.    }
  120.