線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4221
推到 Plurk!
推到 Facebook!

NT週邊驅動程式轉不過來 (VC++ -> BC++附程式碼)

答題得分者是:RaynorPao
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-04 01:34:45 IP:210.66.xxx.xxx 未訂閱
最近在網路上找到一個可在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-05 09:26:26 IP:203.73.xxx.xxx 未訂閱
引言: 最近在網路上找到一個可在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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-05 15:35:58 IP:61.220.xxx.xxx 未訂閱
終於有人回應了! 謝謝 >
------
yangkissktop
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-05 16:11:04 IP:203.73.xxx.xxx 未訂閱
引言: 終於有人回應了! 謝謝 > >< 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-05 18:16:05 IP:61.220.xxx.xxx 未訂閱
>
------
yangkissktop
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-05 18:20:12 IP:61.220.xxx.xxx 未訂閱
啊! 打錯字了! =>win NT (2)當範例程式偵測到win 98系列之作業程式即呼叫sys檔驅動功能 但如何將VC 之Resource ID 資源檔中的sys檔轉成BC的寫法 ? yangkissktop
------
yangkissktop
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-06 00:22:22 IP:61.221.xxx.xxx 未訂閱
引言: > >< 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 了,實在是
   沒有必要花時間、功夫再轉一次的
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-03-29 21:02:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!