当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

通过端口获取IDE硬盘ID

时间:2008/1/5 作者:平凡之路 来源:xuhantao.com 浏览:

#include
#include
#include
#include
#include
char *GetAscii(unsigned int inData[], int offStart, int offEnd);
int main(void)
{
  unsigned int  diskData[256];  /* Disk data         */
  unsigned int  offset;      /* Disk data offset      */
  int      loop;
  int      numDrv;      /* Number of IDE hard drives */
  union REGS   registers;
  unsigned int  biosCyl[2];    /* Cylinders, Heads, Sectors */
  unsigned int  biosHead[2];
  unsigned int  biosSec [2];
  numDrv = peekb(0x40, 0x75);   /* BIOS Data area, Number of Hard disks */
  for (loop = 0; loop < numDrv; loop++)
  {
   while (inp(0x01f7) != 0x50); /* Wait for controller not busy     */
   outp(0x01f6, (loop == 0 ? 0xa0 : 0xb0)); /* Get first/second drive  */
   outp(0x01f7, 0xec);            /* Get drive info data   */
   while (inp(0x1f7) != 0x58);  /* Wait for data ready         */
   for (offset = 0; offset != 256; offset++) /* Read "sector"      */
     diskData[offset] = inpw(0x1f0);
   /* Get BIOS drive info */
   registers.h.ah = 0x08;    /* 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 */
   {
     biosHead[loop] = registers.h.dh + 1;   /* Heads are from 0 */
     biosSec[loop] = registers.h.cl & 0x3f;  /* sec is bits 5 - 0 */
     /* +1 because starts from 0 and +1 for FDISK leaving one out */
     biosCyl[loop] = ((registers.h.cl & 0xc0) << 2) + registers.h.ch + 2;
   } /* end of if */
   printf("DRIVE %d:\n", loop);
   printf("Model Number______________________: %s\n", GetAscii(diskData, 27, 46));
   printf("Serial Number_____________________: %s\n", GetAscii(diskData, 10, 19));
   printf("Controller Revision Number________: %s\n\n", GetAscii(diskData, 23, 26));
   printf("Able to do Double Word Transfer___: %6s\n", (diskData[48] == 0 ? "No" : "Yes"));
   printf("Controller type___________________:  %04X\n", diskData[20]);
   printf("Controller buffer size (bytes)____: %6u\n", diskData[21] * 512);
   printf("Number of ECC bytes transferred___: %6u\n", diskData[22]);
   printf("Number of sectors per interrupt___: %6u\n\n", diskData[47]);
   printf("Hard Disk Reports\n");
   printf("Number of Cylinders (Fixed)_______: %6u\n", diskData[1]);
   printf("Number of Heads___________________: %6u\n", diskData[3]);
   printf("Number of Sectors per Track_______: %6u\n\n", diskData[6]);
   printf("BIOS Reports\n");
   printf("Number of Cylinders_______________: %6u\n", biosCyl[loop]);
   printf("Number of Heads___________________: %6u\n", biosHead[loop]);
   printf("Number of Sectors per Track_______: %6u\n\n", biosSec[loop]);
   printf("Press any key to continue...\n\n");
   getch();
  } /* end of for */
  return 0;
} /* main() */
char *GetAscii(unsigned int inData[], int offStart, int offEnd)
{
  static char retVal[255];
  int     loop, loop1;
  for (loop = offStart, loop1 = 0; loop <= offEnd; loop++)
  {
   retVal[loop1++] = (char )(inData[loop] / 256); /* Get High byte */
   retVal[loop1++] = (char )(inData[loop] % 256); /* Get Low byte */
  } /* end of for */
  retVal[loop1] = '\0';  /* Make sure it ends in a NULL character */
  return retVal;
} /* GetAscii() */

相关文章
  • 没有相关文章
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1