Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/**
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved. *** *** The information and source code contained herein is the exclusive *** property of Intel Corporation and may not be disclosed, examined *** or reproduced in whole or in part without explicit written authorization *** from the company. **/
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
diska.c
Abstract:
This module implements the assembly code necessary to detect/collect hard disk parameter informat.
Author:
Allen Kay (akay) 15-Aug-97
--*/
USHORT NumberBiosDisks;
VOID GetInt13DriveParameters( OUT PUCHAR Buffer; OUT PUSHORT Size )
/*++
Routine Description: This function calls int 13h function 8 to get drive parameters for drive 80h - 87h. Arguments: Buffer - Supplies a pointer to a buffer to receive the drive parameter information. Size - Supplies a pointer to a USHORT to receive the size of the dirve parameter information returned.
Return Value: None. --*/
{ IA32_BIOS_REGISTER_STATE IA32RegisterState; BIT32_AND_BIT16 IA32Register, Eax, Edx; UCHAR TempVal; USHORT DriveSelect; PINT13_DRIVE_PARAMETERS DriveParameters;
DriveSelect = 0x80; // starting from drive 0x80
DriveParameters = (PINT13_DRIVE_PARAMETERS) Buffer;
while (DriveSelect <= 0x88) { NumberBiosDisks++;
IA32Register.LowPart16 = DriveSelect; IA32Register.HighPart16 = 0; IA32RegisterState.edx = IA32Register.Part32;
IA32Register.Byte0 = 0; IA32Register.Byte1 = 0x15; // int 13h function 15h
IA32Register.Byte2 = 0; IA32Register.Byte3 = 0; IA32RegisterState.eax = IA32Register.Part32;
SAL_PROC(0x13,&IA32RegisterState,0,0,0,0,0,0);
//
// First get all the needed registers.
//
Eax.Part32 = IA32RegisterState.Eax; if ( ( IA32RegisterState.Eflags & CARRY_FLAG ) == 0) && Eax.Byte1 != 0 ) {
//
// Call int 13h function 8h to read drive parameters.
//
IA32Register.Byte0 = 0; IA32Register.Byte1 = 0x8; // int 0x13 function 0x8
IA32Register.Byte2 = 0; IA32Register.Byte3 = 0; IA32RegisterState.eax = IA32Register.Part32;
SAL_PROC(0x13,&IA32RegisterState,0,0,0,0,0,0);
if ( ( IA32RegisterState.Eflags & CARRY_FLAG ) != 0) { return 0; }
//
// First setup of the registers we are going to use.
//
Ecx.Part32 = IA32RegisterState.Eax; Edx.Part32 = IA32RegisterState.Edx;
//
// Get the maximum usable sector number.
//
DriveParameters->SectorsPerTrack = Ecx.Part32 & 0x3f;
//
// Get the maximum cylinder number.
//
Ecx.Byte0 = Ecx.Byte0 >> 6; TmpVal = Ecx.Byte0; Ecx.Byte1 = Ecx.Byte0; Ecx.Byte0 = TmpVal; DriveParameters->MaxCylinders = Ecx.LowPart16; //
// Get the maximum heads.
//
DriveParameters->MaxHeads = Edx.HighPart16; //
// Get the number of drives.
//
DriveParameters->NumberDrives = Edx.Byte0;
//
// Set the drive select number;
//
DriveParameters->DriveSelect = DriveSelect++;
DriveParameters++; } } Size = NumberOfDisks * sizeof (INT13_DRIVE_PARAMETERS); }
|