yangkissktop
一般會員
發表:13 回覆:29 積分:8 註冊:2003-10-25
發送簡訊給我
|
最近在網路上找到一個可在XP跑inport & outport
相當好用的DLL檔(連結即自動裝driver)
想將它由VC轉為BC
但有幾個error
不知各位高手有何高見
請在BC中開DLL將原始碼貼上編譯即知何意 // 第一次發問請多多包涵
// This program was posted at http://www.logix4u.net/ with copyright.
// And these codes was modified here just for personal investigation. //---------------------------------------------------------------------------
#include
#pragma argsused
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define IOCTL_READ_PORT_UCHAR -1673519100 //CTL_CODE(40000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WRITE_PORT_UCHAR -1673519096 //CTL_CODE(40000, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) int SystemVersion();
void _stdcall Out32(short PortAddress, short data);
short _stdcall Inp32(short PortAddress);
int Opendriver ();
void Closedriver(); int inst();
int start();
char str[10];
int vv;
HANDLE hdriver;
char path[MAX_PATH];
HINSTANCE hmodule;
SECURITY_ATTRIBUTES sa;
int sysver; //---------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hmodule = hinstDLL; switch( fwdreason )
{
case DLL_PROCESS_ATTACH :
sysver = SystemVersion();
if(sysver == 2) Opendriver();
break;
case DLL_PROCESS_DETACH :
if(sysver == 2) CloseHandle( hdriver );
break;
} return 1;
}
//---------------------------------------------------------------------------
int SystemVersion()
{
OSVERSIONINFOEX osvi;
// bool bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX ); if( !GetVersionEx((OSVERSIONINFO *)&osvi) )
{
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if( !GetVersionEx((OSVERSIONINFO *)&osvi) ) return 0;
} switch( osvi.dwPlatformId )
{
case VER_PLATFORM_WIN32_NT : return 2; //WINNT
case VER_PLATFORM_WIN32_WINDOWS : return 1; //WIN9X
}
return 0;
}
//---------------------------------------------------------------------------
void _stdcall Out32(short PortAddress, short data)
{
switch( sysver )
{
case 1 : _outp(PortAddress, data);
break;
case 2 : DWORD BytesReturned;
BYTE Buffer[3];
unsigned short *pBuffer; pBuffer = (unsigned short *)&Buffer[0];
*pBuffer = LOWORD( PortAddress );
Buffer[2] = LOBYTE( data ); DeviceIoControl(hdriver,
IOCTL_WRITE_PORT_UCHAR,
&Buffer,
3,
NULL,
0,
&BytesReturned,
NULL);
break;
}
}
//---------------------------------------------------------------------------
short _stdcall Inp32(short PortAddress)
{
BYTE retval; switch( sysver )
{
case 1 : retval = _inp( PortAddress );
return retval;
case 2 : DWORD BytesReturned;
unsigned char Buffer[3];
unsigned short *pBuffer; pBuffer = (unsigned short *)&Buffer;
*pBuffer = LOWORD( PortAddress );
Buffer[2] = 0;
DeviceIoControl(hdriver,
IOCTL_READ_PORT_UCHAR,
&Buffer,
2,
&Buffer,
1,
&BytesReturned,
NULL);
return( (int)Buffer[0] );
}
return 0;
}
//---------------------------------------------------------------------------
int Opendriver()
{
hdriver = CreateFile("\\\\.\\hwinterface",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); if(hdriver == INVALID_HANDLE_VALUE)
{
if( start() )
{
inst();
start();
hdriver = CreateFile("\\\\.\\hwinterface",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
void Closedriver()
{
CloseHandle( hdriver );
}
//---------------------------------------------------------------------------
int inst()
{
SC_HANDLE Mgr;
SC_HANDLE Ser; GetSystemDirectory(path , sizeof(path));
HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
if( hResource )
{
HGLOBAL binGlob = LoadResource(hmodule, hResource); if( binGlob )
{
void *binData = LockResource( binGlob ); if( binData )
{
HANDLE file; strcat(path, "\\Drivers\\hwinterface.sys");
file = CreateFile(path,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
0,
NULL);
if( file )
{
DWORD size, written; size = SizeofResource(hmodule, hResource);
WriteFile(file, binData, size, &written, NULL);
CloseHandle( file );
}
}
}
} Mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(Mgr == NULL)
{ //No permission to create service
if(GetLastError() == ERROR_ACCESS_DENIED) return 5; // error access denied
else Ser = CreateService(Mgr,
"hwinterface",
"hwinterface",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_SYSTEM_START,
SERVICE_ERROR_NORMAL,
"System32\\Drivers\\hwinterface.sys",
NULL,
NULL,
NULL,
NULL,
NULL);
}
CloseServiceHandle(Ser);
CloseServiceHandle(Mgr);
return 0;
}
//---------------------------------------------------------------------------
int start()
{
SC_HANDLE Mgr;
SC_HANDLE Ser; Mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(Mgr == NULL)
{ //No permission to create service
if(GetLastError() == ERROR_ACCESS_DENIED)
{
Mgr = OpenSCManager(NULL, NULL, GENERIC_READ);
Ser = OpenService(Mgr,"hwinterface", GENERIC_EXECUTE);
if( Ser )
{ // we have permission to start the service
if( !StartService(Ser,0,NULL) )
{
CloseServiceHandle( Ser );
return 4; // we could open the service but unable to start
}
}
}
}
else
{ // Successfuly opened Service Manager with full access
Ser = OpenService(Mgr, "hwinterface", GENERIC_EXECUTE);
if( Ser )
{
if( !StartService(Ser,0,NULL) )
{
CloseServiceHandle( Ser );
return 3; // opened the Service handle with full access permission, but unable to start
}
else
{
CloseServiceHandle( Ser );
return 0;
}
}
} return 1;
}
//---------------------------------------------------------------------------
< >< > yangkissktop
------ yangkissktop
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
最近在網路上找到一個可在XP跑inport & outport
相當好用的DLL檔(連結即自動裝driver)
想將它由VC轉為BC
但有幾個error
不知各位高手有何高見
請在BC中開DLL將原始碼貼上編譯即知何意 // 第一次發問請多多包涵
// This program was posted at http://www.logix4u.net/ with copyright.
// And these codes was modified here just for personal investigation. //---------------------------------------------------------------------------
#include
#pragma argsused
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define IOCTL_READ_PORT_UCHAR -1673519100 //CTL_CODE(40000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WRITE_PORT_UCHAR -1673519096 //CTL_CODE(40000, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) int SystemVersion();
void _stdcall Out32(short PortAddress, short data);
short _stdcall Inp32(short PortAddress);
int Opendriver ();
void Closedriver(); int inst();
int start();
char str[10];
int vv;
HANDLE hdriver;
char path[MAX_PATH];
HINSTANCE hmodule;
SECURITY_ATTRIBUTES sa;
int sysver; //---------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hmodule = hinstDLL; switch( fwdreason )
{
case DLL_PROCESS_ATTACH :
sysver = SystemVersion();
if(sysver == 2) Opendriver();
break;
case DLL_PROCESS_DETACH :
if(sysver == 2) CloseHandle( hdriver );
break;
} return 1;
}
//---------------------------------------------------------------------------
int SystemVersion()
{
OSVERSIONINFOEX osvi;
// bool bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX ); if( !GetVersionEx((OSVERSIONINFO *)&osvi) )
{
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if( !GetVersionEx((OSVERSIONINFO *)&osvi) ) return 0;
} switch( osvi.dwPlatformId )
{
case VER_PLATFORM_WIN32_NT : return 2; //WINNT
case VER_PLATFORM_WIN32_WINDOWS : return 1; //WIN9X
}
return 0;
}
//---------------------------------------------------------------------------
void _stdcall Out32(short PortAddress, short data)
{
switch( sysver )
{
case 1 : _outp(PortAddress, data);
break;
case 2 : DWORD BytesReturned;
BYTE Buffer[3];
unsigned short *pBuffer; pBuffer = (unsigned short *)&Buffer[0];
*pBuffer = LOWORD( PortAddress );
Buffer[2] = LOBYTE( data ); DeviceIoControl(hdriver,
IOCTL_WRITE_PORT_UCHAR,
&Buffer,
3,
NULL,
0,
&BytesReturned,
NULL);
break;
}
}
//---------------------------------------------------------------------------
short _stdcall Inp32(short PortAddress)
{
BYTE retval; switch( sysver )
{
case 1 : retval = _inp( PortAddress );
return retval;
case 2 : DWORD BytesReturned;
unsigned char Buffer[3];
unsigned short *pBuffer; pBuffer = (unsigned short *)&Buffer;
*pBuffer = LOWORD( PortAddress );
Buffer[2] = 0;
DeviceIoControl(hdriver,
IOCTL_READ_PORT_UCHAR,
&Buffer,
2,
&Buffer,
1,
&BytesReturned,
NULL);
return( (int)Buffer[0] );
}
return 0;
}
//---------------------------------------------------------------------------
int Opendriver()
{
hdriver = CreateFile("\\\\.\\hwinterface",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); if(hdriver == INVALID_HANDLE_VALUE)
{
if( start() )
{
inst();
start();
hdriver = CreateFile("\\\\.\\hwinterface",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
void Closedriver()
{
CloseHandle( hdriver );
}
//---------------------------------------------------------------------------
int inst()
{
SC_HANDLE Mgr;
SC_HANDLE Ser; GetSystemDirectory(path , sizeof(path));
HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
if( hResource )
{
HGLOBAL binGlob = LoadResource(hmodule, hResource); if( binGlob )
{
void *binData = LockResource( binGlob ); if( binData )
{
HANDLE file; strcat(path, "\\Drivers\\hwinterface.sys");
file = CreateFile(path,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
0,
NULL);
if( file )
{
DWORD size, written; size = SizeofResource(hmodule, hResource);
WriteFile(file, binData, size, &written, NULL);
CloseHandle( file );
}
}
}
} Mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(Mgr == NULL)
{ //No permission to create service
if(GetLastError() == ERROR_ACCESS_DENIED) return 5; // error access denied
else Ser = CreateService(Mgr,
"hwinterface",
"hwinterface",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_SYSTEM_START,
SERVICE_ERROR_NORMAL,
"System32\\Drivers\\hwinterface.sys",
NULL,
NULL,
NULL,
NULL,
NULL);
}
CloseServiceHandle(Ser);
CloseServiceHandle(Mgr);
return 0;
}
//---------------------------------------------------------------------------
int start()
{
SC_HANDLE Mgr;
SC_HANDLE Ser; Mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(Mgr == NULL)
{ //No permission to create service
if(GetLastError() == ERROR_ACCESS_DENIED)
{
Mgr = OpenSCManager(NULL, NULL, GENERIC_READ);
Ser = OpenService(Mgr,"hwinterface", GENERIC_EXECUTE);
if( Ser )
{ // we have permission to start the service
if( !StartService(Ser,0,NULL) )
{
CloseServiceHandle( Ser );
return 4; // we could open the service but unable to start
}
}
}
}
else
{ // Successfuly opened Service Manager with full access
Ser = OpenService(Mgr, "hwinterface", GENERIC_EXECUTE);
if( Ser )
{
if( !StartService(Ser,0,NULL) )
{
CloseServiceHandle( Ser );
return 3; // opened the Service handle with full access permission, but unable to start
}
else
{
CloseServiceHandle( Ser );
return 0;
}
}
} return 1;
}
//---------------------------------------------------------------------------
< >< > yangkissktop
yangkissktop 你好:
如果已經能夠編譯成 VC DLL 的話,應該沒有必要再轉成 BCB 的版本吧
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|
yangkissktop
一般會員
發表:13 回覆:29 積分:8 註冊:2003-10-25
發送簡訊給我
|
終於有人回應了! 謝謝 >
------ yangkissktop
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
終於有人回應了! 謝謝 > >>< face="Verdana, Arial, Helvetica">
yangkissktop 你好:
(1)請問?? 你是使用 Borland C Builder 還是 Borland C ??< > 這兩個
是不一樣的喔< >,如果是 Borland C Builder 的話,據小弟我所知,目
前的版本,已經不再支援 _inp, _inpw, _outp, _outpw,...這類的函式了;
如果你是使用 Borland C 的話,試試 #include "conio.h" 再重新編譯看
看
( >
> --
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|
yangkissktop
一般會員
發表:13 回覆:29 積分:8 註冊:2003-10-25
發送簡訊給我
|
>
------ yangkissktop
|
yangkissktop
一般會員
發表:13 回覆:29 積分:8 註冊:2003-10-25
發送簡訊給我
|
啊! 打錯字了!
=>win NT
(2)當範例程式偵測到win 98系列之作業程式即呼叫sys檔驅動功能
但如何將VC 之Resource ID 資源檔中的sys檔轉成BC的寫法 ? yangkissktop
------ yangkissktop
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
> >>< face="Verdana, Arial, Helvetica">
yangkissktop 你好:
(1)就讓我說得更清楚一點吧,所謂的 C Builder 已經不再支援 _inp, _outp
...這類函式的意思,就是說你無法在 C Builder 的開發環境之下,編譯
引用到這類函式的 Project,也就是說,你現在有兩個選擇
(a)放棄這個 DLL Project,因為無法通過編譯
(b)把所有 _inp, _outp mark 起來,先通過編譯再說,不過這樣子一來,在
Windows 9X/ME 就無法使用此 DLL 了
(2)我所說的 IDR_BIN1 是一個 Resource ID,它的實體資料應該是存放在 *.rc
裡面,而當初這個實體資料,也一定是由某個檔案 import 到 *.rc 裡面的
,也就是你所說的 *.sys 這個檔案,小弟我現在並不明白你的實際狀況
(a)假設你現在有原來的 resource.h, *.rc 的話,只需要把這兩個檔案複製
到你目前 BCB DLL Project 的目錄下,然後在 *.cpp 裡面
#include "resource.h" 並且利用某個文字編輯器(UltraEdit 或記事本)
把檔案 *.rc 打開,把以下這一行給 mark 掉
//#include "afxres.h"
最後在 BCB 裡面利用 Project Manager 把 *.rc 這個檔案 add 到你的
DLL Project 裡面重新編譯即可
(b)假設你現在沒有原來的 resource.h, *.rc,但是卻有 *.sys 的話,那就
必須自己重建 resource.h, *.rc 這兩個檔案,重建的方法我曾經發表過
,也就不再另外說了,請先參考以下的連結文章
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27605
重建完成之後,利用 (a) 中提到的方法,把這兩個檔案加到 BCB DLL
Project 裡面,然後把原來程式碼中的 IDR_BIN1 改成 IDR_DATA1,接下
來重新編譯就可以了
(c)假設你現在沒有原來的 resource.h, *.rc,也沒有 *.sys 的話,那麼小
弟我可以告訴你,這個 BCB DLL Project 應該是無法完成了
(3)以上的所有問題你必須有所認知,並且要自己克服,至於要不要繼續完成,
就看你自己的選擇了;依照小弟我個人的經驗,我是不鼓勵這樣子做的,因
為已經有 VC 編譯過的現成 DLL 可以使用,那又何必要另外再轉一次呢??
其實如果你已經有現成的 DLL,而且也已經知道這個 DLL export 出來的
function 的 prototype 的話,那可以直接參考小弟我第一次回應你的連結
中的第 (4) 點 (動態連結) 的方式,就可以直接使用這個 DLL 了,實在是
沒有必要花時間、功夫再轉一次的
> --
------ -- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
|