Click to See Complete Forum and Search --> : Can somebody help Please???


Tona Lee
April 27th, 1999, 04:57 PM
Hi all,

I'm a beginer programming in C, C++.

1st question:
Would anyone help me on how to write a uitility that detects(read) Harddrive BIOS and
returns the values such as size, cluster, sector, and track... The utility can run 16bits
under MS-DOS when it boots from floppy???

2nd question:
Have anyone ever written a utility; it can detects(reads) the NIC's MAC address. If you did
would you please let me know how it can be done??? It's also running under 16bits envnt.

Thank you in advance for your help...

Regards,
Tona Lee

"The future belongs to those who believe in
the beauty of their dreams." ---Elennor Roosevelt.

Lissandro
April 27th, 1999, 05:05 PM
Hi, Sometime ago I found this piece of C code on the net, don't remember now where; it wasn't written by me, the author is on the "header". It may be usefull to you.

/*
** 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 <stdlib.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <bios.h>


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 */

/* 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, &registers, &registers);

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);
}