www.pudn.com > hd_ide.zip > DUG_IDE.C
/* ** DUG_IDE : Provides IDE disk info on both drives in the system ** Version 1.0 ** ** Copyright (c) 12 Jan 1993 by Doug Merrett - All rights reserved ** ** Postal Address: PO Box 432 ** Stones Corner Q 4120 ** Australia ** ** Email Address: dcm@mincom.oz.au ** ** You may distribute freely, but no modifications without mailing me a copy. ** No profit can be made for distribution. Blah Blah Blah etc. */ /* Used by JPI for clrscr */ #define _JPI_WIN_ #include#include #include #include #include char *getascii (unsigned int in_data [], int off_start, int off_end); void main (void) { unsigned int dd [256]; /* DiskData */ unsigned int dd_off; /* DiskData offset */ unsigned int loop; /* Loop variable */ int num_drv; /* Number of Hard disks */ union REGS registers; /* Used for Interrupt for BIOS data */ unsigned int bios_cyl [2], bios_head [2], bios_sec [2]; /* Cylinders, Heads, Sectors */ clrscr (); fprintf (stderr, "** DUG_IDE : Provides IDE disk info on both drives in the system\n"); fprintf (stderr, "** Version 1.0\n"); fprintf (stderr, "**\n"); fprintf (stderr, "** Copyright (c) 12 Jan 1993 by Doug Merrett - All rights reserved\n"); fprintf (stderr, "**\n"); fprintf (stderr, "** Postal Address: PO Box 432\n"); fprintf (stderr, "** Stones Corner Q 4120\n"); fprintf (stderr, "** Australia\n"); fprintf (stderr, "**\n"); fprintf (stderr, "** Email Address: dcm@mincom.oz.au\n"); fprintf (stderr, "**\n"); fprintf (stderr, "** You may distribute freely, but no modifications without mailing me a copy.\n"); fprintf (stderr, "** No profit can be made for distribution. Blah Blah Blah etc.\n\n"); fprintf (stderr, "Press any key to accept above limitations"); getch (); /* How many disk drives & parameters */ num_drv = peekb (0x40, 0x75); /* BIOS Data area, Number of Hard disks */ /* Byte at Segment 40H Offset 75H */ for (loop = 0; loop < num_drv; loop++) /* Loop through drives */ { /* Get IDE Drive info */ while (inp (0x1F7) != 0x50) /* Wait for controller not busy */ ; outp (0x1F6, (loop == 0 ? 0xA0 : 0xB0)); /* Get first/second drive */ outp (0x1F7, 0xEC); /* Get drive info data */ while (inp (0x1F7) != 0x58) /* Wait for data ready */ ; for (dd_off = 0; dd_off != 256; dd_off++) /* Read "sector" */ dd [dd_off] = inpw (0x1F0); /* Get BIOS drive info */ registers.h.ah = 0x8; /* Get drive info */ registers.h.dl = 0x80 + loop; /* Drive is 80H for Disk 0, 81H for Disk 1 */ int86 (0x13, ®isters, ®isters); if (! registers.x.cflag) /* All OK if carry not set */ { bios_head [loop] = registers.h.dh + 1; /* Heads are from 0 */ bios_sec [loop] = registers.h.cl & 0x3F; /* sec is bits 5 - 0 */ bios_cyl [loop] = ((registers.h.cl & 0xC0) << 2) + registers.h.ch + 2; /* +1 because starts from 0 and +1 for FDISK leaving one out */ } clrscr (); fprintf (stdout, "DRIVE %d:\n", loop); fprintf (stdout, "Model Number______________________: %s\n", getascii (dd, 27, 46)); fprintf (stdout, "Serial Number_____________________: %s\n", getascii (dd, 10, 19)); fprintf (stdout, "Controller Revision Number________: %s\n\n", getascii (dd, 23, 26)); fprintf (stdout, "Able to do Double Word Transfer___: %6s\n", (dd [48] == 0 ? "No" : "Yes")); fprintf (stdout, "Controller type___________________: %04X\n", dd [20]); fprintf (stdout, "Controller buffer size (bytes)____: %6u\n", dd [21] * 512); fprintf (stdout, "Number of ECC bytes transferred___: %6u\n", dd [22]); fprintf (stdout, "Number of sectors per interrupt___: %6u\n\n", dd [47]); fprintf (stdout, "Hard Disk Reports\n"); fprintf (stdout, "Number of Cylinders (Fixed)_______: %6u\n", dd [1]); fprintf (stdout, "Number of Heads___________________: %6u\n", dd [3]); fprintf (stdout, "Number of Sectors per Track_______: %6u\n\n", dd [6]); fprintf (stdout, "BIOS Reports\n"); fprintf (stdout, "Number of Cylinders_______________: %6u\n", bios_cyl [loop]); fprintf (stdout, "Number of Heads___________________: %6u\n", bios_head [loop]); fprintf (stdout, "Number of Sectors per Track_______: %6u\n\n", bios_sec [loop]); if (! loop) { fprintf (stdout, "Press a key"); getch (); } } } char *getascii (unsigned int in_data [], int off_start, int off_end) { static char ret_val [255]; int loop, loop1; for (loop = off_start, loop1 = 0; loop <= off_end; loop++) { ret_val [loop1++] = (char) (in_data [loop] / 256); /* Get High byte */ ret_val [loop1++] = (char) (in_data [loop] % 256); /* Get Low byte */ } ret_val [loop1] = '\0'; /* Make sure it ends in a NULL character */ return (ret_val); }