Contributor: SELOM OFORI
{please use only on floppy.
 It reads sector 0 which is the boot sector for a floppy and
 the partition table for a hard disk.
 It never writes to disk anyways....
}
program readboot;
uses dos, crt;
type
 boot_structure = record
 jmp_instruction : array[1..3] of byte;
 oem_name : array[1..8] of char;
 bytes_per_sector : word;
 sectors_per_cluster : byte;
 reserved_sectors : word;
 fat_copies : byte;
 root_entries : word;
 total_sectors : word;
 media_descriptor : byte;
 sectors_per_fat : word;
 sectors_per_track : word;
 number_of_heads : word;
 hidden_sectors : word;
 total_sector_fixed : array[1..2] of word;
 drive_number : byte;
 reserved : byte;
 ext_boot_sig : byte;
 serial_number : array[1..2] of word;
 volume_name : array[1..11] of char;
 file_system_id : array[1..8] of char;
 boot_program_code : array[1..450] of char;
 signature_bytes : array[1..2] of byte;
 end;
var
 bootbuf : boot_structure;
 ch : char;
 arg : string;
 drive : byte;
 result : word;
{ for this procedure.. its in ASM ( doesn't make it any faster.. :) )
 VAR BUF can either be an array, pointer or record
 DRIVE is the drive number ( A=0, B=1 etc )
 NUMBER is the number of sectors to read
 LOGICAL is the sector to which to start reading
}
procedure absread( var buf; drive : byte;
 number, logical : word ); assembler;
asm
 push bp
 push ds
 xor ax,ax
 mov result,ax
 mov al,drive
 mov cx,number
 mov dx,logical
 lds bx,buf
 int 25h { you can change to 26h to write to disk }
 pop bx
 pop ds
 pop bp
 jnb @1
 mov result,ax
 @1:
end;
procedure commandline_help;
begin
 writeln('Usage: Readboot < drive> ');
 halt;
end;
procedure commandline;
var regs : registers;
begin
 case paramcount of
 1 : begin
 arg := paramstr( 1 );
 ch := arg[ 1 ];
 ch := upcase( ch );
 if ch in [ #65..#90 ] then drive := ord( ch ) - 65;
 regs.AH := 36ドル;
 regs.DL := drive + 1;
 msdos( regs );
 if regs.AX = $FFFF then
 begin
 writeln('Drive ', ch, ':\ does not exist!');
 halt;
 end;
 end;
 else commandline_help;
 end;
end;
procedure display_boot;
begin
 with bootbuf do
 begin
 write('OEM Name......... : ':30 );
 highvideo; writeln( oem_name ); normvideo;
 write('Bytes Per Sector. : ':30 );
 highvideo; writeln( bytes_per_sector ); normvideo;
 { etc, etc.... }
 end;
end;
begin
 commandline;
 absread( bootbuf, drive, 1, 0 );
 display_boot;
end.
Here's the structure of the boot sector
{ DOS Volume Boot Sector Format [DVB]
 Offset Size Description
 00h 3 BYTEs jump instruction to boot program code
 03h 8 BYTEs OEM name and DOS version ("IBM 4.0")
 0Bh 1 WORD bytes per sector( usually 512 )
 0Dh 1 BYTE sectors per cluster( must be power of 2 )
 0Eh 1 WORD reserved sectors( boot sectors - usually 1 )
 10h 1 BYTE FAT copies ( usually 2 )
 11h 1 WORD maximum root diretory entries ( usually 512 )
 13h 1 WORD total sectors( if partition <= 32M, else 0 ) 15h 1 BYTE media descriptor byte ( F8h for hard disks ) 16h 1 WORD sectors per FAT 18h 1 WORD sectors per track 1Ah 1 WORD number of heads 1Ch 1 DWORD hidden sectors(if partition <= 32M, 1 word only) The following information is for DOS 4.0 and later version else 00h: 20h 1 DWORD total sectos( if partition> 32M, else 0 )
 24h 1 BYTE physical drive number (00h=floppy, 80h=fixed)
 25h 1 BYTE reserved( 00h )
 26h 1 BYTE extended boot record signature( 29h )
 27h 1 DWORD volume serial number
 2Bh 11 BYTEs volume label("NO NAME " stored if no label)
 36h 8 BYTEs file system ID ("FAT12 " or "FAT16 ")
The following information applies to all DOS versions:
 3Eh 450 BYTEs Boot program code
 1FEh 2 BYTEs signature bytes ( 55AAh )
}
please use only on floppy.
It reads sector 0 which is the boot sector for a floppy and
the partition table for a hard disk.
It never writes to disk anyways....
It will read the boot sector from a floppy and display it.
___------------------< Cut here>-----------------------------------------
program readboot;
uses dos, crt;
type
 boot_structure = record
 jmp_instruction : array[1..3] of byte;
 oem_name : array[1..8] of char;
 bytes_per_sector : word;
 sectors_per_cluster : byte;
 reserved_sectors : word;
 fat_copies : byte;
 root_entries : word;
 total_sectors : word;
 media_descriptor : byte;
 sectors_per_fat : word;
 sectors_per_track : word;
 number_of_heads : word;
 hidden_sectors : word;
 total_sector_fixed : array[1..2] of word;
 drive_number : byte;
 reserved : byte;
 ext_boot_sig : byte;
 serial_number : array[1..2] of word;
 volume_name : array[1..11] of char;
 file_system_id : array[1..8] of char;
 boot_program_code : array[1..450] of char;
 signature_bytes : array[1..2] of byte;
 end;
var
 bootbuf : boot_structure;
 ch : char;
 arg : string;
 drive : byte;
 result : word;
{ for this procedure.. its in ASM ( doesn't make it any faster.. :) )
 VAR BUF can either be an array, pointer or record
 DRIVE is the drive number ( A=0, B=1 etc )
 NUMBER is the number of sectors to read
 LOGICAL is the sector to which to start reading
}
procedure absread( var buf; drive : byte;
 number, logical : word ); assembler;
asm
 push bp
 push ds
 xor ax,ax
 mov result,ax
 mov al,drive
 mov cx,number
 mov dx,logical
 lds bx,buf
 int 25h { you can change to 26h to write to disk }
 pop bx
 pop ds
 pop bp
 jnb @1
 mov result,ax
 @1:
end;
procedure commandline_help;
begin
 writeln('Usage: Readboot < drive> ');
 halt;
end;
procedure commandline;
var regs : registers;
begin
 case paramcount of
 1 : begin
 arg := paramstr( 1 );
 ch := arg[ 1 ];
 ch := upcase( ch );
 if ch in [ #65..#90 ] then drive := ord( ch ) - 65;
 regs.AH := 36ドル;
 regs.DL := drive + 1;
 msdos( regs );
 if regs.AX = $FFFF then
 begin
 writeln('Drive ', ch, ':\ does not exist!');
 halt;
 end;
 end;
 else commandline_help;
 end;
end;
procedure display_boot;
begin
 with bootbuf do
 begin
 write('OEM Name......... : ':30 );
 highvideo; writeln( oem_name ); normvideo;
 write('Bytes Per Sector. : ':30 );
 highvideo; writeln( bytes_per_sector ); normvideo;
 { etc, etc.... }
 end;
end;
begin
 commandline;
 absread( bootbuf, drive, 1, 0 );
 display_boot;
end.


AltStyle によって変換されたページ (->オリジナル) /