[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]