Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 303 of file pcdisk.c.
Referenced by PcDiskGetCacheableBlockCount(), and PcMachInit().
{ EXTENDED_GEOMETRY ExtGeometry; REGS RegsIn; REGS RegsOut; ULONG Cylinders; TRACE("DiskGetDriveGeometry()\n"); /* Try to get the extended geometry first */ ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY); if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size)) { Geometry->Cylinders = ExtGeometry.Cylinders; Geometry->Heads = ExtGeometry.Heads; Geometry->Sectors = ExtGeometry.SectorsPerTrack; Geometry->BytesPerSector = ExtGeometry.BytesPerSector; return TRUE; } /* BIOS Int 13h, function 08h - Get drive parameters * AH = 08h * DL = drive (bit 7 set for hard disk) * ES:DI = 0000h:0000h to guard against BIOS bugs * Return: * CF set on error * AH = status (07h) * CF clear if successful * AH = 00h * AL = 00h on at least some BIOSes * BL = drive type (AT/PS2 floppies only) * CH = low eight bits of maximum cylinder number * CL = maximum sector number (bits 5-0) * high two bits of maximum cylinder number (bits 7-6) * DH = maximum head number * DL = number of drives * ES:DI -> drive parameter table (floppies only) */ RegsIn.b.ah = 0x08; RegsIn.b.dl = DriveNumber; RegsIn.w.es = 0x0000; RegsIn.w.di = 0x0000; /* Get drive parameters */ Int386(0x13, &RegsIn, &RegsOut); if (! INT386_SUCCESS(RegsOut)) { return FALSE; } Cylinders = (RegsOut.b.cl & 0xC0) << 2; Cylinders += RegsOut.b.ch; Cylinders++; Geometry->Cylinders = Cylinders; Geometry->Heads = RegsOut.b.dh + 1; Geometry->Sectors = RegsOut.b.cl & 0x3F; Geometry->BytesPerSector = 512; /* Just assume 512 bytes per sector */ return TRUE; }