程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 通過端口獲取IDE硬盤ID

通過端口獲取IDE硬盤ID

編輯:關於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() */

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved