📄 wio.cpp
字号:
#include "stdafx.h"
#include "Wio.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// 峔抸/徚柵
//////////////////////////////////////////////////////////////////////
CWio::CWio():
m_hDLL(0),
m_lpfnDllInitializeWinIo(0),
m_lpfnDllShutdownWinIo(0),
m_lpfnDllGetPortVal(0),
m_lpfnDllSetPortVal(0),
m_lpfnDllMapPhysToLin(0),
m_lpfnDllUnmapPhysicalMemory(0),
m_lpfnDllGetPhysLong(0),
m_lpfnDllSetPhysLong(0),
m_wDataPort( 0x378 ),
m_wStatusPort( 0x379 )
{
}
CWio::~CWio()
{
if ( m_hDLL != 0 ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
}
}
//////////////////////////////////////////////////////////////////////
// Description
// 弶婜壔張棟
// WinIo.DLL 傪摦揑偵儘乕僪偟偰丄
// 娭悢偺億僀儞僞傪妉摼偟偰偍偔
// In
// 側偟
// Out
// 側偟
// Return
// == 0 : 惉岟
// != 0 : 僄儔乕
// Note
// NT,2000 側傜暿搑丄僨僶僀僗僪儔僀僶傪撉傒崬傓娭悢傪僐乕儖
// 偟偰偄傞
//////////////////////////////////////////////////////////////////////
int CWio::Init()
{
// Load Library
m_hDLL = LoadLibrary( "WinIo.dll" );
if ( m_hDLL == 0 ) {
// ::AfxMessageBox( "WinIo.dll not found." );
return -1;
}
// Get ponter to function(s)
// 1.
m_lpfnDllInitializeWinIo = ( LPFNDLLINITIALIZEWINIO )GetProcAddress( m_hDLL, "InitializeWinIo" );
if ( !m_lpfnDllInitializeWinIo ) {
// handle error
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"InitializeWinIo\" )\n", m_hDLL );
return -1;
}
// 2.
m_lpfnDllShutdownWinIo = ( LPFNDLLSHUTDOWNWINIO )GetProcAddress( m_hDLL, "ShutdownWinIo" );
if ( !m_lpfnDllShutdownWinIo ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"ShutdownWinIo\" )\n", m_hDLL );
return -1;
}
// 3.
m_lpfnDllGetPortVal = ( LPFNDLLGETPORTVAL )GetProcAddress( m_hDLL, "GetPortVal" );
if ( !m_lpfnDllGetPortVal ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"GetPortVal\" )\n", m_hDLL );
return -1;
}
// 4.
m_lpfnDllSetPortVal = ( LPFNDLLSETPORTVAL )GetProcAddress( m_hDLL, "SetPortVal" );
if ( !m_lpfnDllSetPortVal ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"SetPortVal\" )\n", m_hDLL );
return -1;
}
// 5.
m_lpfnDllMapPhysToLin = ( LPFNDLLMAPPHYSTOLIN )GetProcAddress( m_hDLL, "MapPhysToLin" );
if ( !m_lpfnDllMapPhysToLin ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"MapPhysToLin\" )\n", m_hDLL );
return -1;
}
// 6.
m_lpfnDllUnmapPhysicalMemory = ( LPFNDLLUNMAPPHYSICALMEMORY )GetProcAddress( m_hDLL, "UnmapPhysicalMemory" );
if ( !m_lpfnDllUnmapPhysicalMemory ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"UnmapPhysicalMemory\" )\n", m_hDLL );
return -1;
}
// 7.
m_lpfnDllGetPhysLong = ( LPFNDLLGETPHYSLONG )GetProcAddress( m_hDLL, "GetPhysLong" );
if ( !m_lpfnDllGetPhysLong ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"GetPhysLong\" )\n", m_hDLL );
return -1;
}
// 8.
m_lpfnDllSetPhysLong = ( LPFNDLLSETPHYSLONG )GetProcAddress( m_hDLL, "SetPhysLong" );
if ( !m_lpfnDllSetPhysLong ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
TRACE( "GetProcAddress( %u, \"SetPhysLong\" )\n", m_hDLL );
return -1;
}
// WinIo.dll v1.3 傛傝丄9X/NT宯娭學側偔慡偰僐乕儖偡傞
// (NT or 2000 偱偁傟偽 InitializeWinIo()傪僐乕儖)
if ( /* isNT() */ 1 )
m_lpfnDllInitializeWinIo( );
// 嵟弶偺億乕僩抣傪妎偊偰偍偔
ReadPort( m_InitialDataPort, m_wDataPort );
return 0;
}
//////////////////////////////////////////////////////////////////////
// Description
// WinIo.DLL 傪奐曻偡傞
// In
// 側偟
// Out
// 側偟
// Return
// 側偟
//////////////////////////////////////////////////////////////////////
void CWio::End()
{
// WinIo.dll v1.3 傛傝丄9x/NT宯娭學側偔丄慡偰僐乕儖
// (NT or 2000 偱偁傟偽 ShutdownWinIo()傪僐乕儖)
if ( /* isNT() */ 1 )
m_lpfnDllShutdownWinIo( );
// 僨乕僞億乕僩偵嵟弶偺抣傪彂偒偙傫偱偍偔
WritePort( m_InitialDataPort );
if ( m_hDLL != 0 ) {
FreeLibrary( m_hDLL );
m_hDLL = 0;
}
}
//////////////////////////////////////////////////////////////////////
// Description
// OS偑 NT枖偼2000 偱偁傞偐斲偐傪僠僃僢僋偡傞
// In
// 側偟
// Out
// 側偟
// Return
// TRUE: NTor2000偱偁傞
// FALSE: 9X 偱偁傞
//////////////////////////////////////////////////////////////////////
//#if 0
#if 1
BOOL CWio::isNT()
{
// OSVERSIONINFO 峔憿懱偺昁梫側屄強傪杽傔傞
OSVERSIONINFO osVer;
osVer.dwOSVersionInfoSize = sizeof(osVer);
// OS 偺僶乕僕儑儞忣曬偺庢摼
GetVersionEx(&osVer);
// OS 偑 Win32 NT 僾儔僢僩僼僅乕儉偐傪敾抐
if (osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
return TRUE;
return FALSE;
}
#endif
//////////////////////////////////////////////////////////////////////
// Description
// LPT僗僥乕僞僗億乕僩偐傜1byte僨乕僞傪撉傒崬傓
// In
// 庴怣僨乕僞偺嶲徠: BYTE &
// Out
// 庴怣僨乕僞(擖椡堷悢偑嶲徠側偺偱寭偹偰偄傞)
// Return
// true: 惉岟
// false: 僄儔乕
// Note
// 撉傒崬傫偩1byte僨乕僞偺 MSB = 僾儕儞僞僐僱僋僞偺 pin11(價僕乕怣崋偺斀揮)
//////////////////////////////////////////////////////////////////////
bool CWio::ReadPort( BYTE &byteData )
{
DWORD dwPortVal = 0; // 庴怣僶僢僼傽
bool bRet = m_lpfnDllGetPortVal( m_wStatusPort, &dwPortVal, 1 /* 1byte */ );
if ( bRet == false )
return false;
byteData = *( reinterpret_cast<BYTE *>( &dwPortVal ) );
return true;
}
//////////////////////////////////////////////////////////////////////
// Description
// LPT僨乕僞億乕僩偵1byte僨乕僞傪弌椡偡傞
// In
// 彂偒崬傒偨偄僨乕僞: BYTE
// Out
// 側偟
// Return
// true: 惉岟
// false: 僄儔乕
// Note
// 1byte僨乕僞偺 bit0乣bit7 偑丄僾儕儞僞僐僱僋僞偺 pin2乣9 偵憡摉
//////////////////////////////////////////////////////////////////////
bool CWio::WritePort( BYTE byteData )
{
DWORD dwPortVal = 0; // 憲怣僨乕僞
*( reinterpret_cast<BYTE *>( &dwPortVal ) ) = byteData;
bool bRet = m_lpfnDllSetPortVal( m_wDataPort, dwPortVal, 1 /* byte */ );
return true;
}
//////////////////////////////////////////////////////////////////////
// Description
// LPT億乕僩傾僪儗僗傪妉摼偡傞
// Return
// LPT億乕僩傾僪儗僗: WORD
//////////////////////////////////////////////////////////////////////
WORD CWio::GetLptPort()
{
return m_wDataPort; // 僨乕僞億乕僩
}
//////////////////////////////////////////////////////////////////////
// Description
// LPT億乕僩傾僪儗僗傪愝掕偡傞
// 僨僼僅儖僩偺傾僪儗僗偐傜曄峏偟偨偄応崌偵僐乕儖偡傞
// 億乕僩傪曄峏偟偨傜丄偦偺弶婜抣傪曐帩偟偰偍偔(廔椆帪偵栠偡偨傔)
// In
// LPT億乕僩傾僪儗僗: WORD
// bSetOnly : BOOL TRUE 偺帪偼丄嵟弶偺億乕僩抣偼撉傑側偄
// CWio僀僯僔儍儔僀僘慜偵杮娭悢偑屇偽傟傞偲偒傪峫椂
// Out
// 側偟
// Note
// 巜掕偝傟傞偺偼, 378h, 278h, 3BCh 偺偄偢傟偐偵側傞
// 傑偨僗僥乕僞僗億乕僩偺傾僪儗僗偼僨乕僞億乕僩偺傾僪儗僗偵 1壛嶼偟偨
// 傕偺偲寛傑偭偰偄傞(PC/AT).
//////////////////////////////////////////////////////////////////////
void CWio::SetLptPort( WORD wPort, BOOL bSetOnly )
{
m_wDataPort = wPort; // 僨乕僞億乕僩
m_wStatusPort = wPort + 1; // 僗僥乕僞僗億乕僩
if ( bSetOnly ) return;
// 嵟弶偺億乕僩抣傪妎偊偰偍偔
ReadPort( m_InitialDataPort, m_wDataPort );
}
//////////////////////////////////////////////////////////////////////
// Description
// 巜掕偟偨億乕僩偐傜1byte僨乕僞傪撉傒崬傓
// In
// 庴怣僨乕僞偺嶲徠: BYTE &
// 巜掕偡傞億乕僩傾僪儗僗(e.g. 0x379): WORD
// Out
// 庴怣僨乕僞(擖椡堷悢偑嶲徠側偺偱寭偹偰偄傞)
// Return
// true: 惉岟
// false: 僄儔乕
//////////////////////////////////////////////////////////////////////
bool CWio::ReadPort( BYTE &byteData, WORD dPort )
{
DWORD dwPortVal = 0; // 庴怣僶僢僼傽
bool bRet = m_lpfnDllGetPortVal( dPort, &dwPortVal, 1 /* 1byte */ );
if ( bRet == false )
return false;
byteData = *( reinterpret_cast<BYTE *>( &dwPortVal ) );
return true;
}
//////////////////////////////////////////////////////////////////////
// Description
// 巜掕偟偨億乕僩偵1byte僨乕僞傪弌椡偡傞
// In
// 彂偒崬傒偨偄僨乕僞: BYTE
// 彂偒崬傒偨偄億乕僩: WORD
// Out
// 側偟
// Return
// true: 惉岟
// false: 僄儔乕
//////////////////////////////////////////////////////////////////////
bool CWio::WritePort( BYTE byteData, WORD wPort )
{
DWORD dwPortVal = 0; // 憲怣僨乕僞
*( reinterpret_cast<BYTE *>( &dwPortVal ) ) = byteData;
bool bRet = m_lpfnDllSetPortVal( wPort, dwPortVal, 1 /* byte */ );
return true;
}
//===========================================================================
//===========================================================================
//===========================================================================
int CWio::check_dll()
{
int flag=1;
if ( LoadLibrary( "WinIo.dll" ) == 0 ) {
flag=0;
}
return flag;
}
DWORD CWio::check_win_os()
{
OSVERSIONINFO osver ;
osver.dwOSVersionInfoSize = sizeof( osver ) ;
if( !GetVersionEx( &osver ) )
{
return FALSE ;
}
return (osver.dwPlatformId);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -