home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / utils / boots / prep.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-10-08  |  12.2 KB  |  380 lines

  1. (*========================================================*)
  2. (*                 PREP.PAS (Version 2.00a)               *)
  3. (*        Copyright (C) 1991 J. Braun & DMV-Verlag        *)
  4. (*                Compiler: Turbo Pascal 6.0              *)
  5. (*========================================================*)
  6.  
  7. {$A+,B-,E-,F-,I+,N-,O-,V-,X-,G-,M 4096,0,0}
  8. {.$DEFINE debug}
  9. {$IFDEF DEBUG}{$D+,L+,S+,R+}{$ELSE}{$D-,L-,S-,R-}{$ENDIF}
  10.  
  11. PROGRAM PrepareHarddisk;
  12.  
  13. USES
  14.   Crt,
  15.   Dos,
  16.   DOSCountry,
  17.   Absolute;
  18.  
  19. TYPE
  20.   tXtens = (SYS, BAT);
  21.  
  22. CONST
  23.   BS          = CHR(8);
  24.   LF          = CHR(10);
  25.   CRLF        = CHR(13) + LF;
  26.   Germany     = 49;
  27.   Switzerland = 41;
  28.   Austria     = 43;
  29.  
  30.   DrDos5   : BOOLEAN = FALSE;
  31.   german   : BOOLEAN = FALSE;
  32.   Lw       : STRING[2]                   = 'C:';
  33.   StdExt   : ARRAY[tXtens] OF STRING[3]  = ('SYS', 'BAT');
  34.   StartFile: ARRAY[tXtens] OF STRING[10] = ('\CONFIG.',
  35.                                             '\AUTOEXEC.');
  36.   Error    : ARRAY[1..2] OF BOOLEAN      = (FALSE, FALSE);
  37.   Copyright: STRING[50] = 'PrepareSwitch 2.00a, (C) '
  38.                         + '1991 DMV-Verlag, Eschwege';
  39.  
  40. VAR
  41.   CommandLine      : ComStr;
  42.   BootFileName,
  43.   PartFileName,
  44.   Name             : PathStr;
  45.   f1, f2           : FILE OF BYTE;
  46.   i, Attr          : WORD;
  47.   FileExists       : BOOLEAN;
  48.   OldDir           : PathStr;
  49.   sr               : SearchRec;
  50.   OldSystem        : tSystems;
  51.   Line             : STRING;
  52.   txt1, txt2       : TEXT;
  53.   FTime            : LONGINT;
  54.   BootSectorBuffer : ARRAY[0..MaxBufSize] OF BYTE;
  55.   PartSectorBuffer : ARRAY[0..MaxBufSize] OF BYTE;
  56.  
  57. (*--------------------------------------------------------*)
  58. (*    Überprüfung, welches System gerade bootfähig ist    *)
  59. FUNCTION CheckOldSystem: tSystems;
  60. VAR
  61.   i      : WORD; 
  62.   j      : BYTE;
  63.   k      : tSystems;
  64.   BufStr : STRING;
  65.  
  66. BEGIN
  67.   BufStr := '';
  68.   j := 0;
  69.   ReadBootSector(C, BootSectorBuffer);
  70.  
  71.   FOR i := 20 TO MaxBufSize - 2 DO
  72.     IF Chr(BootSectorBuffer[i]) IN
  73.        ['A' .. 'Z', 'a' .. 'z', '2', '$'] THEN
  74.       BufStr := BufStr + CHR(BootSectorBuffer[i]);
  75.  
  76.   FOR k := IBM TO SysCount DO
  77.     IF Pos(SysIDs[k], BufStr) > 0 THEN j := BYTE(k);
  78.  
  79.   IF (j = 1) AND ((Pos('Laden', BufStr) > 0) OR
  80.      (Pos('Loading', BufStr) > 0)) THEN DRDos5 := TRUE;
  81.      (* Die Meldung gibt's bei PC-DOS einfach nicht *)
  82.  
  83.   CheckOldSystem := tSystems(j);
  84. END;
  85.  
  86.  
  87. (*--------------------------------------------------------*)
  88. (*               Vorbereitung der Dateien                 *)
  89. PROCEDURE PrepareOrgFile;
  90. BEGIN
  91.   GetFTime(txt1, FTime);
  92.   Close(txt1);
  93.   GetFAttr(txt1, Attr);
  94.   SetFAttr(txt1, Archive);
  95.   {$I-}
  96.   Reset(txt1);
  97.   {$I+}
  98. END;
  99.  
  100. (*--------------------------------------------------------*)
  101. (*                Schließen aller Dateien                 *)
  102. PROCEDURE CloseAll;
  103. BEGIN
  104.   Close(txt1);
  105.   SetFAttr(txt1, Attr);
  106.   Close(txt2);
  107.   SetFAttr(txt2, Archive + ReadOnly);
  108.   SetFTime(txt2, FTime);
  109. END;
  110.  
  111. (*--------------------------------------------------------*)
  112. (*                Hilfe bei Parameter /?|/h               *)
  113. PROCEDURE Help;
  114. CONST
  115.   Tab = Chr(9);
  116.   LF  = Chr(10);
  117. VAR
  118.   t: TEXT;
  119. BEGIN
  120.   Assign(t, '');             (* Standardausgabe trotz Crt *)
  121.   {$I-}
  122.   ReWrite(t);
  123.   {$I+}
  124.   IF german THEN BEGIN
  125.     WriteLn(t, CRLF + 'Vorbereitung eines Betriebssystems ' +
  126.              'für den Bootswitcher. Es wird automatisch');
  127.     WriteLn(t, 'erkannt,  welches System gerade bootfähig' +
  128.              ' ist.  Hiernach wird die Endung der');
  129.     WriteLn(t, 'Dateien gewählt. Prep schreibt  den ' +
  130.              'Bootsektor,  die Partitionstabelle sowie');
  131.     WriteLn(t, 'CONFIG.SYS und AUTOEXEC.BAT in das ' +
  132.              'Verzeichnis ' + SysDir + '.');
  133.     WriteLn(t, 'Ist das Verzeichnis nicht vorhanden, ' +
  134.              'wird es angelegt.');
  135.     WriteLn(t, 'Achtung: Es wird nicht überprüft,  ' +
  136.              'ob genügend Platz auf der Festplatte ist,');
  137.     WriteLn(t, 'um die Dateien zu schreiben!' + LF);
  138.     WriteLn(t, 'Folgende Betriebssysteme werden' +
  139.              ' unterstützt:' + Chr(10));
  140.     WriteLn(t, Tab + 'MS-DOS 3.x/4.0x/5.x' + Tab
  141.            + Tab + '(.DOS-Dateien)');
  142.     WriteLn(t, Tab + 'PC-DOS / DR-DOS 5/6' + Tab
  143.            + Tab + '(.IBM-Dateien)');
  144.     WriteLn(t, Tab + 'DR-DOS 3.41        ' + Tab
  145.            + Tab + '(.DRS-Dateien)');
  146.     WriteLn(t, Tab + 'MS-OS/2 1.1        ' + Tab
  147.            + Tab + '(.OS1-Dateien)');
  148.     WriteLn(t, Tab + 'MS-OS/2 1.2/1.21/1.3'+ Tab
  149.            + Tab + '(.OS2-Dateien)');
  150.     WriteLn(t, Tab + 'PC-MOS/386 4.0     ' + Tab
  151.            + Tab + '(.MOS-Dateien)');
  152.     WriteLn(t, Tab + 'DOS-Plus V. 1.2    ' + Tab
  153.            + Tab + '(.PLS-Dateien)' + LF);
  154.     Write(t, 'Die Bootsektor- und Partitionsdateien werden');
  155.     WriteLn(t, ' automatisch »hidden« gesetzt.');
  156.   END ELSE BEGIN
  157.     WriteLn(t, CRLF +
  158.              'The program prepares an operating system for'
  159.            + '  bootswitch. It automatically');
  160.     WriteLn(t, 'recogizes the actual bootsystem. Correspondi'
  161.            + 'g to the  type  of bootsystem,');
  162.     WriteLn(t, 'the file extensions will be set. The bootsec'
  163.            + 'tor file,  the CONFIG.SYS, and');
  164.     WriteLn(t, 'the AUTOEXEC.BAT will be placed in the Direc'
  165.            + 'tory ' + SysDir + '.');
  166.     WriteLn(t, 'Is the directory not yet on the harddisk, it'
  167.            + ' will be created.');
  168.     WriteLn(t, 'Warning: The program does not check, if '
  169.            + 'there is not enough free space for');
  170.     WriteLn(t, 'for the files on the hard disk!' + LF);
  171.     WriteLn(t, 'The following operating systems are ' +
  172.              'supported:');
  173.     WriteLn(t, Tab + 'MS DOS 3.x/4.0x/5.0' + Tab +
  174.              Tab + '(.DOS files)');
  175.     WriteLn(t, Tab + 'PC DOS / DR-DOS 5/6' + Tab +
  176.              Tab + '(.IBM files)');
  177.     WriteLn(t, Tab + 'DOS-Plus V. 1.2    ' + Tab +
  178.              Tab + '(.PLS files)');
  179.     WriteLn(t, Tab + 'DR DOS 3.41        ' + Tab +
  180.              Tab + '(.DRS files)');
  181.     WriteLn(t, Tab + 'MS OS/2 1.1        ' + Tab +
  182.              Tab + '(.OS1 files)');
  183.     WriteLn(t, Tab + 'MS OS/2 1.2/1.21/1.3' + Tab +
  184.              Tab +'(.OS2 files)');
  185.     WriteLn(t, Tab + 'PC MOS/386 4.0     ' + Tab +
  186.              Tab + '(.MOS files)' + LF);
  187.     WriteLn(t, 'The bootsector and partition table files ' +
  188.              'will be set "hidden".');
  189.   END;
  190.   Close(t);
  191. END;
  192.  
  193. BEGIN
  194.   IF fGetCountry IN [Switzerland, Austria, Germany] THEN
  195.     german := TRUE;
  196.   ReadPartition(C, PartSectorBuffer);
  197.   i := WORD(CheckOldSystem);
  198.   GetDir(0, OldDir);
  199.   HighVideo;
  200.   WriteLn(Copyright);          (* Meldung nicht umleitbar *)
  201.   NormVideo;
  202.   IF ParamCount > 0 THEN
  203.     CommandLine := ParamStr(1)
  204.   ELSE
  205.     CommandLine := ' ';
  206.   IF (Pos('H', CommandLine) > 0) OR
  207.      (Pos('h', CommandLine) > 0) OR
  208.      (Pos('?', CommandLine) > 0) THEN Help
  209.   ELSE BEGIN
  210.     OldSystem := CheckOldSystem;
  211.     IF german THEN
  212.       WriteLn('Bootswitch für ' + Names[OldSystem] +
  213.               ' wird vorbereitet:' + LF)
  214.     ELSE
  215.       WriteLn('Preparing bootswitch for '
  216.             + Names[OldSystem] + ':' +  LF);
  217.  
  218.     IF OldSystem > none THEN BEGIN
  219.       {$I-}
  220.       ChDir(SysDir);
  221.       {$I+}
  222.       IF IOResult <> 0 THEN BEGIN
  223.         IF german THEN
  224.           WriteLn('Verzeichnis ' + SysDir +
  225.                   ' wird neu angelegt')
  226.         ELSE
  227.           WriteLn('Creating Directory ' + SysDir );
  228.         {$I-}
  229.         MkDir(SysDir);
  230.         ChDir(SysDir);
  231.         {$I+}
  232.       END;
  233.  
  234.       BootFileName := SysDir + '\' + BootFile
  235.                     + Systems[OldSystem];
  236.       Assign(f1, BootFileName);
  237.       FindFirst(BootFileName, AnyFile, sr);
  238.       FileExists := Pos(sr.Name, BootFileName) > 0;
  239.       IF FileExists THEN SetFAttr(f1, Archive);
  240.       {$I-}
  241.       ReWrite(f1);
  242.       {$I+}
  243.       IF IOResult <> 0 THEN BEGIN
  244.       IF german THEN
  245.         WriteLn('Bootsektordatei kann nicht geschrieben '
  246.               + 'werden!')
  247.       ELSE
  248.         WriteLn('Access on bootsector file denied!');
  249.         Halt;
  250.       END;
  251.       FOR i := 0 TO MaxBufSize DO
  252.          Write(f1, BootSectorBuffer[i]);
  253.       Close(f1);
  254.       SetFAttr(f1, Archive + Hidden);
  255.  
  256.       PartFileName := SysDir + '\' + PartFile
  257.                     + Systems[OldSystem];
  258.       Assign(f2, PartFileName);
  259.       FindFirst(PartFileName, AnyFile, sr);
  260.       FileExists := Pos(sr.Name, PartFileName) > 0;
  261.       IF FileExists THEN SetFAttr(f2, Archive);
  262.       {$I-}
  263.       ReWrite(f2);
  264.       {$I+}
  265.       IF IOResult <> 0 THEN
  266.       IF german THEN
  267.         WriteLn('Partitionsdatei kann ' +
  268.                 'nicht geschrieben werden!')
  269.       ELSE
  270.         WriteLn('Access on partition file denied!');
  271.       FOR i := 0 TO MaxBufSize DO
  272.         Write(f2, PartSectorBuffer[i]);
  273.       Close(f2);
  274.       SetFAttr(f2, Archive + Hidden);
  275.  
  276.       IF german THEN
  277.         WriteLn('Die Dateien ' + BootFile
  278.                + Systems[OldSystem] + ' und '
  279.                + PartFile + Systems[OldSystem]
  280.                + ' wurden geschrieben.')
  281.       ELSE
  282.          WriteLn('The files ' + BootFile
  283.                 + Systems[OldSystem] + ' and '
  284.                 + PartFile + Systems[OldSystem]
  285.                 + ' are backed up.');
  286.  
  287.       Assign(txt1, Lw + StartFile[BAT] + StdExt[BAT]);
  288.       {$I-}
  289.       Reset(txt1);
  290.       {$I+}
  291.       Error[1] := IOResult <> 0;
  292.       IF NOT Error[1] THEN BEGIN
  293.         PrepareOrgFile;
  294.         BootFileName := SysDir + StartFile[BAT]
  295.                       + Systems[OldSystem];
  296.         FindFirst(BootFileName, AnyFile, sr);
  297.         FileExists := (Pos(sr.Name, BootFileName) > 0);
  298.         Assign(txt2, BootFileName);
  299.         IF FileExists THEN SetFAttr(txt2, Archive);
  300.         {$I-}
  301.         ReWrite(txt2);
  302.         {$I+}
  303.         WHILE NOT EoF(txt1) DO BEGIN
  304.           Line := '';
  305.           ReadLn(txt1, Line);
  306.           IF Line <> '' THEN
  307.              WriteLn(txt2, Line);
  308.         END;
  309.         CloseAll;
  310.         Assign(txt1, Lw + StartFile[SYS] + StdExt[SYS]);
  311.         {$I-}
  312.         Reset(txt1);
  313.         {$I+}
  314.         Error[2] := IOResult <> 0;
  315.         IF NOT Error[2] THEN BEGIN
  316.           PrepareOrgFile;
  317.           BootFileName := SysDir + StartFile[SYS]
  318.                         + Systems[OldSystem];
  319.           FindFirst(BootFileName, AnyFile, sr);
  320.           FileExists := Pos(sr.Name, BootFileName) > 0;
  321.           Assign(txt2, BootFileName);
  322.           IF FileExists THEN SetFAttr(txt2, Archive);
  323.           {$I-}
  324.           ReWrite(txt2);
  325.           {$I+}
  326.           WHILE NOT EoF(txt1) DO BEGIN
  327.             ReadLn(txt1, Line);
  328.             IF Line <> '' THEN WriteLn(txt2, Line);
  329.           END;
  330.           CloseAll;
  331.         END;
  332.         IF NOT Error[1] THEN BEGIN
  333.            FOR i := 2 TO Length(StartFile[SYS]) DO
  334.              Write(StartFile[SYS][i]);
  335.            Write(Systems[OldSystem]);
  336.         END;
  337.         IF NOT (Error[1] AND Error[2]) THEN BEGIN
  338.           IF german THEN
  339.              Write(' und ')
  340.           ELSE
  341.              Write(' and ');
  342.         END;
  343.         IF NOT Error[2] THEN BEGIN
  344.           FOR i := 2 TO Length(StartFile[BAT]) DO
  345.             Write(StartFile[BAT][i]);
  346.           Write(Systems[OldSystem] + ' ');
  347.         END;
  348.         IF NOT (Error[1] OR Error[2]) THEN BEGIN
  349.           IF german THEN Write('wurde')
  350.                     ELSE Write('was');
  351.         END;
  352.         IF NOT (Error[1] AND Error[2]) THEN BEGIN
  353.           IF german THEN Write('n')
  354.                     ELSE Write(BS + BS +'ere');
  355.         END;
  356.         IF NOT (Error[1] AND Error[2]) THEN BEGIN
  357.           IF german THEN Write(' gesichert.')
  358.                     ELSE Write(' backed up.');
  359.         END;
  360.         IF Error[1] THEN
  361.            WriteLn(Lw + StartFile[SYS] + ParamMsg[none]);
  362.         IF Error[2] THEN
  363.            WriteLn(Lw + StartFile[BAT] + ParamMsg[none]);
  364.         WriteLn;
  365.       END;
  366.     END ELSE BEGIN
  367.       IF german THEN
  368.         WriteLn('Leider habe ich das System nicht erkannt,'
  369.          + CRLF + 'deshalb wurde keine Datei geschrieben.')
  370.       ELSE
  371.         WriteLn('Actual boot system not detected.' + CRLF +
  372.                 'No backup files written.');
  373.     END;
  374.   END;
  375.   ChDir(OldDir);       (* Zurück ins Ursprungsverzeichnis *)
  376. END.
  377.  
  378. (*========================================================*)
  379. (*                  Ende von PREP.PAS                     *)
  380.