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

📄 unithddisk.cpp

📁 本程序利用直接硬件操作来读取硬盘参数, 可得到硬盘的参数,程序采用 Yariv Kaplan 的 WinIo 2.0 来进行端口操作。
💻 CPP
字号:
/*-------------------------------------------------------------------------*\
|                                                                           |
|                           IDE 硬盘参数读取程序                            |
|                           ~~~~~~~~~~~~~~~~~~~~                            |
|                    Copyright (C) 1997-2003, Victor Chen                   |
|                         Email: victor@cppfans.com                         |
|                      Homepage: http://www.cppfans.com                     |
|                                                                           |
\*-------------------------------------------------------------------------*/
#include <vcl.h>
#pragma hdrstop

#include "UnitHdDisk.h"
#include "IDE_DISK.H"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormHdParams *FormHdParams;
//---------------------------------------------------------------------------
__fastcall TFormHdParams::TFormHdParams(TComponent* Owner)
    : TForm(Owner)
{
  Memo1->Text = "读取硬盘参数\r\nCopyright (C) Victor Chen\r\nHomepage: http://www.cppfans.com/\r\n\r\n";
  Memo1->Lines->Add("按“硬盘参数”按钮读取硬盘参数\r\n==============================================");

  bWinIoInitOK = InitializeWinIo();
  if(!bWinIoInitOK)
   {
     Application->MessageBox("不能装载 WinIO 程序!","错误信息",MB_OK|MB_ICONSTOP);
     Application->Terminate();
   }
}
//---------------------------------------------------------------------------
__fastcall TFormHdParams::~TFormHdParams()
{
  if(bWinIoInitOK)
    ShutdownWinIo();
}
//---------------------------------------------------------------------------
void __fastcall TFormHdParams::ButtonHdParamsClick(TObject *Sender)
{
  TIdePortAddrItem ControllerPorts[] = {IDE1_Port, IDE2_Port};
  AnsiString ControllerNames[] = {"IDE0", "IDE1"};
  char *HardDiskNames[] = {"主盘", "从盘"};
  char HardDiskDetected; //bit 0:master, bit 1:slave
  TIDE_ID_Inf IDE_Info;
  char Str[128];

  for(int i=0; i<2; i++)
   {
     Memo1->Lines->Add("正在检测: " + ControllerNames[i] + ", 可能需要几秒钟时间, 请稍候……");
     HardDiskDetected=DetectHDD(ControllerPorts[i]);

     switch(HardDiskDetected&3)
      {
        case 0: Memo1->Lines->Add("没检测到硬盘"); break;
        case 1: Memo1->Lines->Add("检测到主盘"); break;
        case 2: Memo1->Lines->Add("检测到从盘"); break;
        case 3: Memo1->Lines->Add("检测到主盘和从盘"); break;
      }

     for(int k=0;k<2;k++) //primary/slave disk
      if(HardDiskDetected & (1<<k))
      {
        Memo1->Lines->Add("==============================================");
        Memo1->Lines->Add(ControllerNames[i] + HardDiskNames[k] + ":");
        Memo1->Lines->Add("----------------------------------------------");
        GetHDDInfo(&IDE_Info, k, ControllerPorts[i]);

        //---------- model, serial number & firmware revision
        WordToStr(Str, IDE_Info.nModel, 20);
        Memo1->Lines->Add("型    号: " + AnsiString(Str).Trim());

        WordToStr(Str, IDE_Info.Serial, 10);
        Memo1->Lines->Add("序 列 号: " + AnsiString(Str).Trim());

        WordToStr(Str, IDE_Info.Revisn, 4);
        Memo1->Lines->Add("固件版本: " + AnsiString(Str).Trim());

        //---------- capacity
        unsigned long LbaCap = IDE_Info.LBASec/2048, NomCap = ((unsigned long)(IDE_Info.L_Cyln)*(IDE_Info.L_Head)*(IDE_Info.L_Sect))/2048;
        Memo1->Lines->Add("容    量: " + AnsiString().sprintf("%lu Mb",LbaCap>NomCap?LbaCap:NomCap));

        //---- output hard disk normal information
        Memo1->Lines->Add(AnsiString().sprintf("柱 面 数: %u",    IDE_Info.L_Cyln));
        Memo1->Lines->Add(AnsiString().sprintf("磁 头 数: %u",    IDE_Info.L_Head));
        Memo1->Lines->Add(AnsiString().sprintf("扇 区 数: %u",    IDE_Info.L_Sect));
        Memo1->Lines->Add(AnsiString().sprintf("缓存容量: %u kb", IDE_Info.BufNum>>1));
        Memo1->Lines->Add(AnsiString().sprintf("ECC 字节: %u bytes", IDE_Info.ECCByt));
        Memo1->Lines->Add(AnsiString().sprintf("LBA 支持: %s", (IDE_Info.Capabs&IDE_LBA_Spp)?"是":"否"));
      }
     Memo1->Lines->Add("==============================================");
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormHdParams::ButtonExitClick(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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