#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define Support9x 0
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
// 判斷目前使用的OS, 是否為WinNT 系列
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// 如果是WinNT系列, 動態啟動WDM Driver
if (!OpenDriver())
{
ShowMessage("Driver not ready!!!");
CloseDriver();
Application->Terminate();
}
WinNT=true;
} #if Support9x
#else
else
{
ShowMessage("Support WinNT base only!");
Application->Terminate();
}
#endif
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
// 如果是WinNT系列, 動態關閉WDM Driver
if (WinNT)
{
if (!CloseDriver())
ShowMessage("Close Driver Fail!");
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender)
{
char HDD_Serial[21]=""; // HDD序號一共有10個Word if (WinNT)
IdentifyIDE_NT();
#if Support9x
else
IdentifyIDE_9x();
#endif BYTE *pt;
pt=(BYTE *)IDEData 10*2;
memcpy(HDD_Serial, pt, 20);
Edit1->Text=HDD_Serial; // 如果想要看看IDE 傳回256個word的值
// 1. 請自行貼上一個TMemo元件
// 2. 拿掉下面的#ifdef
#ifdef Debug
String Str, ShowStr;
pt=(BYTE *)IDEData;
for (i=0; i<32; i )
{
ShowStr="";
for (j=0; j<16; j )
{
Str.sprintf("%.2X", *pt);
ShowStr =(Str " ");
pt ;
}
Memo1->Lines->Append(ShowStr);
}
#endif
}
//--------------------------------------------------------------------------- void __fastcall TForm1::IdentifyIDE_NT()
{
// Prepare for HDD ready
WaitIDE_NT(); // 設定Device為Master HDD
r.type=IOACCESS_WRITE_BYTE;
r.m_dx=0x1F6;
r.m_al=0xA0;
WinIO();
IDEStatus=WaitIDE_NT();
if ((IDEStatus & 0x50) != 0x50)
{
ShowMessage("Set Device Fail!");
Close();
} // 下ATA Command:0xEC
r.type=IOACCESS_WRITE_BYTE;
r.m_dx=0x1F7;
r.m_al=0xEC;
WinIO();
IDEStatus=WaitIDE_NT();
if ((IDEStatus & 0x58) != 0x58)
{
ShowMessage("Set Identify Command Fail!");
Close();
} // 讀回HDD傳回來的256個Word
r.type=IOACCESS_READ_WORD;
r.m_dx=0x1F0;
j=0;
for (i=0; i<256; i )
{
WinIO();
IDEData[j ]=r.m_ah;
IDEData[j ]=r.m_al;
} }
//--------------------------------------------------------------------------- BYTE __fastcall TForm1::WaitIDE_NT()
{
r.type=IOACCESS_READ_BYTE;
r.m_dx=0x1F7;
do{
WinIO();
}while(r.m_al>=0x80);
return r.m_al;
}
//--------------------------------------------------------------------------- #if Support9x
void __fastcall TForm1::IdentifyIDE_9x()
{
BYTE AL, AH; // Prepare for HDD ready
WaitIDE_9x(); // 設定Device為Master HDD
asm{
mov dx, 0x1F6
mov al, 0xA0
out dx, al}
IDEStatus=WaitIDE_9x();
if ((IDEStatus & 0x50) != 0x50)
{
ShowMessage("Set Device Fail!");
Close();
} // 下ATA Command:0xEC
asm{
mov dx, 0x1F7
mov al, 0xEC
out dx, al}
IDEStatus=WaitIDE_9x();
if ((IDEStatus & 0x58) != 0x58)
{
ShowMessage("Set Identify Command Fail!");
Close();
} // 讀回HDD傳回來的256個Word
j=0;
for (i=0; i<256; i )
{
asm {
mov dx, 0x1F0
in ax, dx
mov AH, ah
mov AL, al}
IDEData[j ]=AH;
IDEData[j ]=AL;
} }
//--------------------------------------------------------------------------- BYTE __fastcall TForm1::WaitIDE_9x()
{
BYTE AL;
do{
asm{
mov dx, 0x1F7
in al, dx
mov AL, al}
}while(AL>=0x80);
return AL;
}
//---------------------------------------------------------------------------
#endif void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
//讀出378 port程式段
r.type=IOACCESS_READ_BYTE;
r.m_dx=0x378;
WinIO();
Edit2->Text=r.m_al;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender)
{
//寫入378 port程式段 if(!Edit3->Text.IsEmpty()&&-1Text)&&StrToInt(Edit3->Text)<256)
{
r.type=IOACCESS_WRITE_BYTE;
r.m_dx=0x378;
r.m_al=StrToInt(Edit3->Text);
WinIO();
}else ShowMessage("Input 0-255"); }
//---------------------------------------------------------------------------
我以上是使用lcsboy大大提供的WinIO Driver 以及修改他先前所發表之hdd範例 加入Parallel port 對0x378的簡單I/O 不太了解的可以參考看看 我是在WIN2K下使用BCB6 Coding的因為.EXE檔有點"肥"所以把主程式放上來^^