当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

通过端口获得IDE硬盘ID[VC/C++编程]

赞助商链接



  本文“通过端口获得IDE硬盘ID[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

#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() */


  以上是“通过端口获得IDE硬盘ID[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • windows和linux下查看进程利用的端口和通过端口查看进程办法
  • <b>Linux下通过端口杀死进程</b>
  • 通过端口获得IDE硬盘ID
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .