Offset | Description | Variable |
00h | Boot indicator | |
01h | Start Head | StartHead |
02h | Start Sector/Cylinder | StartSector |
03h | Start Cylinder (low 8 bits) | StartCylinder |
04h | System type | SystemType |
05h | Ending Head | EndHead |
06h | Ending Sector/Cylinder | EndSector |
07h | Ending Cylinder (low 8 bits) | EndCylinder |
08h | Starting sector | StartingSector |
0Ch | Number of sectors in partition | NumSectors |
Some other variables | Description |
Sectors Heads Cylinders CHS capacity | Sector value for CHS result Head value for CHS result Cylinder value for CHS result Short for StartHead, StartSector, and StartCylinder Value returned from SCSI read capacity |
void GetCHS( void )
{
ulong logical_end;
ushort Sectors;
ushort Heads;
ushort Cylinders;
For each drive
Read Boot sector
Validate Sector Signature (55AAh)
Find Partition with largest logical start cylinder
If no partitions found
Use your own geometry routine
exit
if ((CHS == FF) || (SystemType == 0x0E) || (SystemType == 0x0F))
{
/* No Geometry is needed, use INT 13h Extensions */
exit;
}
else
{
Sectors = EndSector;
Heads = EndHead + 1;
logical_end = (EndCylinder * Heads * Sectors) +
(EndHead * Sectors) + Sectors;
if (logical_end != StartingSector + NumSectors)
{
/* use your own geometry routine */
exit;
}
Cylinders = capacity / (Heads * Sectors);
}
/* Now use the calculated Cylinders, Sectors, and Heads values. */
}