[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]
{
> Has anyone any ideas how to interrogate an IDE drive to get
> its setup parameters, ie. number of cylinders, heads and
> sectors, as some of the more recent BIOS's seem to be able to do?
Read cylinder 0, head 0, sector 1 which is the first sector on the
hard drive. This sector contains the partition table. The partition table
contains this information. This could be done faster in ASM code but for the
interests of the purists in this echo, I will use the registers and set it up
in Pascal. This example was used in a large program that did many other
things and that is why there is no parameter passing to the procedure and the
device is global. Sample Code to read the partition table:
}
Uses CRT, DOS;
var
buffermbr : array[ 0 .. 512 ] of byte; { Buffer for Master Boot Record }
regs : registers; { Predefined data type }
device : word;
s : string;
Procedure readpart;
begin
with regs do
begin
ah := $02; { Read sector service request }
al := $01; { Number of sectors to read }
ch := $00; { Cylinder number or track number for floppies }
cl := $01; { Sector Number, bits 6,7 -two high bits of 10 bit
cylinder number }
dh := $00; { Head Number }
dl := device; { Specifies which drive C=80h, D=81H, etc }
es := seg( buffermbr );
bx := ofs( buffermbr );
end;
intr( $13, regs )
end;
{ The below main body has been stripped of the code to verify the number of
parameters that were entered as well as the validity of the parameter string
entered ( 'c', 'd', etc. ). }
begin
clrscr;
s := paramstr( 1 );
s[ 1 ] := upcase( s[ 1 ] );
if s[ 1 ] = 'C' then
begin
device := $80;
end
else
begin
device := Ord( s[ 1 ] ) - Ord( 'A' );
if device > 1 then
device := $80 + ( device - 2 );
end;
readpart;
end.
{
Partition Table Information and location:
Format of hard disk master boot record:
. Offset Size Description
. 000h 446 BYTEs Master bootstrap loader code
. 1BEh 16 BYTEs partition record for partition 1 ( Byte definition below )
. 1CEh 16 BYTEs partition record for partition 2
. 1DEh 16 BYTEs partition record for partition 3
. 1EEh 16 BYTEs partition record for partition 4
. 1FEh WORD signature, AA55h indicates valid BIOS extension block
.
Format of partition record:
Offset Size Description
00h BYTE boot indicator (80h = active, 00H = inactive )
01h BYTE partition start head
02h BYTE partition start sector (bits 0-5)
03h BYTE partition start track (bits 8,9 in bits 6,7 of sector)
04h BYTE operating system indicator (see below)
05h BYTE partition end head
06h BYTE partition end sector (bits 0-5)
07h BYTE partition end track (bits 8,9 in bits 6,7 of sector)
08h DWORD sectors preceding partition
0Ch DWORD length of partition in sectors
Robert, you can use whatever information you need from this table. I
also use a routine to read the CMOS setup data but there is varience between
manufacturers and it is a lot more difficult to decode the information you are
looking for. I just stripped this code out and have not run it as a
stand-alone program. Let me know how it worked for you and if you need any
more assistance with it, just drop me a message.
}
[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]