Partition changer

Autor: Adam Borowski (ab171958_at_rainbow.mimuw.edu.pl)
Data: Fri 17 Oct 1997 - 23:51:33 MET DST


Witam wszystkich!

Kilku ludzi z listy prosilo o zrodla boot managera nie pozostajacego w
tablicy partycji, ktorego mozna uruchamiac z np. menu w Wingrozie czy z
menu w Volkov Commanderze. Oto on. Nie jest napisany "porzadnie", ale
byc moze uda sie zainteresowanym wyciagnac z niego jakies potrzebne
informacje. Brak w nim interfejsu uzytkownika, ale zabezpieczen jest na
szczescie dosc, tak wiec mam nadzieje ze nikomu nic nie zepsuje (chyba
ze znowu sie znajdzie jakis biolog ;-) )

      _/ _/ _/ ____/ _/
     _/ _/ _/ _/ _/ _/ _____/
    _/_/ _/ ___/ _/ _/ _/ ___/
   __/ _/ _/ _/ _/ ____/ _/ _/ _/ _/ _/
  _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ____/
 _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
_/ _/ __/ __/ ___/ ____/ ___/ __/ ___/
Where do YOU want to die today? _/
                                  __/

const
 pdata=510-4*16;
var
 buf:array[0..511] of byte;
 partdata:array[1..4] of record
                            active:byte;
                            d1:array[1..3] of char;
                            typ:byte;
                            d2:array[5..15] of char
                          end;
 i,j:byte;
 names:array[byte] of string[20];
label nier,niew;
const
 actstr:array[boolean] of char='-A';
procedure err;
begin
  writeln('Press any key');
  asm { ReadKey bez wad modulu Crt }
   XOR AX,AX
   INT 16h
  end;
  halt(1)
end;
procedure error(const txt:string);
begin
  writeln(txt);
  err
end;
begin
 asm { wczytanie partycji }
  MOV AX,0201h
  MOV CX,1
  MOV DX,80h
  MOV BX,SEG buf
  MOV ES,BX
  MOV BX,OFFSET buf
  INT 13h
  JC nier
 end;
 for i:=0 to 255
   do begin
        str(i,names[i]);
        names[i]:='?????<'+names[i]+'>';
      end;
 names[0]:='unused';
 names[6]:='Dos';
 names[5]:='Extended Dos';
 names[1]:='Dos <32MB'; {do uzupelnienia, nie chce mi sie tablicy wklepywac}
 writeln('Partition table:');
 move(buf[pdata],partdata,SizeOf(partdata));
 for i:=1 to 4
   do with partdata[i]
        do writeln(i:2,' ',actstr[active=128],' (',names[typ],')');
 i:=0;
 if paramstr(1)='1'
   then i:=1;
 if paramstr(1)='2'
   then i:=2;
 if paramstr(1)='3'
   then i:=3;
 if paramstr(1)='4'
   then i:=4;
 if i=0
   then halt;
 if partdata[i].typ=0
   then error('Cannot make an empty partition active');
 if partdata[i].active=128
   then error('Partition is already active');
 for j:=1 to 4
   do partdata[j].active:=0;
 partdata[i].active:=128;
 move(partdata,buf[pdata],SizeOf(partdata));
 asm { zapisanie z powrotem tablicy partycji }
  MOV AX,0301h
  MOV CX,1
  MOV DX,80h
  MOV BX,SEG buf
  MOV ES,BX
  MOV BX,OFFSET buf
  INT 13h
  JC niew
 end;
 writeln('Partition ',i,' (',names[partdata[i].typ],') has been made active');
 for i:=1 to 4
   do with partdata[i]
        do writeln(i:2,' ',actstr[active=128],' (',names[typ],')');
 halt;
 niew:
 error('Error writing partition table');
 nier:
 error('Error reading partition table')
end.



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 16:28:08 MET DST