⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide_disk.cpp

📁 本程序利用直接硬件操作来读取硬盘参数, 可得到硬盘的参数,程序采用 Yariv Kaplan 的 WinIo 2.0 来进行端口操作。
💻 CPP
字号:
/*-------------------------------------------------------------------------*\
|                                                                           |
|                           IDE 硬盘参数读取程序                            |
|                           ~~~~~~~~~~~~~~~~~~~~                            |
|                    Copyright (C) 1997-2003, Victor Chen                   |
|                         Email: victor@cppfans.com                         |
|                      Homepage: http://www.cppfans.com                     |
|                                                                           |
\*-------------------------------------------------------------------------*/
#include "ide_disk.h"
#pragma link "WinIo_bc.lib"
//---------------------------------------------------------------------------
unsigned char inportb(unsigned short p)
{
  unsigned long v = 0;
  GetPortVal(p, &v, 1);
  return v;
}
//---------------------------------------------------------------------------
unsigned short inportw(unsigned short p)
{
  unsigned long v = 0;
  GetPortVal(p, &v, 2);
  return v;
}
//---------------------------------------------------------------------------
unsigned long inportd(unsigned short p)
{
  unsigned long v = 0;
  GetPortVal(p, &v, 4);
  return v;
}
//---------------------------------------------------------------------------
void outportb(unsigned short p, unsigned char v)
{
  SetPortVal(p,v,1);
}
//---------------------------------------------------------------------------
void outportw(unsigned short p, unsigned short v)
{
  SetPortVal(p,v,2);
}
//---------------------------------------------------------------------------
void outportd(unsigned short p, unsigned long v)
{
  SetPortVal(p,v,4);
}
//===========================================================================
char DetectHDD(unsigned long BasePort) //bit 0: HDD-0, Bit 1: HDD-1
{
  int HD_No, HD_Detected=0, i, f;
  unsigned char HD_Selection[2]={0xa0,0xb0}; // C:1010 0000, D:1011 0000

  for(HD_No=0; HD_No<=1; HD_No++)
   {
     f=0;
     for(i=0;i<300;i++) //Get HDD Status, wait until HDD not busy
      {
        if((inportb(BasePort+7)&0x80)==0)
         {
           f=1;
           break;
         }
        Sleep(2);
      }
     if(!f)continue;

     outportb(BasePort+6, HD_Selection[HD_No]); //0# HDD Drive/Head Register
     outportb(BasePort+7, 0x10);                //0# HDD Status, Head back to Track 0

     f=0;
     for(i=0;i<300;i++) //Get HDD Status, wait until HDD not busy
      {
        if((inportb(BasePort+7)&0x80)==0)
         {
           f=1;
           break;
         }
        Sleep(2);
      }
     if(!f)continue;

     if(inportb(BasePort+7)==0x50) // HDD ready: 0101 0000
      {
        HD_Detected|=(1<<HD_No);
      }
   }
  return HD_Detected;
}
//---------------------------------------------------------------------------
int GetHDDInfo(TIDE_ID_Inf *Info, char DriveNo, unsigned int BasePort) //DriveNo ... 0:C, 1:D
{
  unsigned int i=0;
  int Err=0;

  if(DriveNo==0)
    outportb(BasePort+6, 0xa0); //select drive C:
  else
    outportb(BasePort+6, 0xb0); //select drive D:
  outportb(BasePort+7, 0xec);  //read HDD Info

  while(inportb(BasePort+7)!=0x58) //0# HDD Status, wait for R/W ready 0101 0000
   {
     if(i>=300)
      {
        Err=1;
        break;
      }
     Sleep(2);
     i++;
   }

  if(!Err)
   for(i=0;i<=255;i++)
    Info->w[i]=inportw(BasePort);
  return Err;
}
//---------------------------------------------------------------------------
void WordToStr(unsigned char *s, unsigned short *w, int n)
{
  int i;
  for(i=0; i<n; i++)
   {
     s[i*2]   = w[i]>>8;
     s[i*2+1] = w[i]&0x00ff;
   }
  s[i*2]=0;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -