全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:8178
推到 Plurk!
推到 Facebook!

讀取主機板上CMOS的時分秒(使用WinRing)

 
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-14 00:16:38 IP:211.76.xxx.xxx 未訂閱
這個程式會讀取CMOS的時分秒秀在畫面上, 本程式只適用Win2K/WinXP/Win.Net 直接在BCB可以讀取IO (透過WinRing所提供的API) WinRing API:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27086 IO Port 0x70: CMOS Index port IO Port 0x71: CMOS Data port 秒: 位於CMOS Index=0 分: 位於CMOS Index=2 時: 位於CMOS Index=4 發表人 - lcsboy 於 2003/03/14 00:42:04
附加檔案:27088_RTCTimer.zip
phototin
初階會員


發表:13
回覆:30
積分:29
註冊:2002-06-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-03 13:36:04 IP:61.219.xxx.xxx 未訂閱
感謝lcsboy的無私分享, 不過,我在Windows XP、C Builder 6.0底下Compiler, 出現底下的錯誤訊息: [C Error] WinRing.hpp(199): E2451 Undefined symbol 'ADJRing0' [C Error] WinRing.hpp(199): E2451 Undefined symbol 'ADJRing0' 請問該如何解決?? 另外請問WinRing和您之前所作WinIO有什麼不同?? 謝謝
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-03 16:34:14 IP:211.23.xxx.xxx 未訂閱
哎~~~~~ BCB6真的是~~~~~很想x他 原本 > > 愚人自始至今都是使用 ><" 否則使用
phototin
初階會員


發表:13
回覆:30
積分:29
註冊:2002-06-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-03 19:32:00 IP:61.219.xxx.xxx 未訂閱
抱歉…還是不行, 還請 class="code"> void __fastcall Ring0Proc() { DWORD Adj0Address; SaveAllReg(); asm mov Adj0Address, offset ADJRing0 //修正後錯誤還是出在此行 Ring.AdjRing0Entry=Adj0Address; WinRing(); asm{ jmp ADJRing3} ADJRing0: asm{ mov eax, [esp 4]} Ring3ProcName(); asm{ ret ADJRing3:} } 另外請問WinRing和您之前所作WinIO有什麼不同?? Win2K/WinXP/Win.Net存取I/O,除了WDM還有別種方法嗎?? 我買了碁峰WDM的書…看了霧薩薩, 可否給我一些指點…謝謝。
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-04 15:04:30 IP:211.76.xxx.xxx 未訂閱
BCB6這麼的機車呀 ><~~~~    現在的問題應該是怎麼讓BCB6可以使用 label <--- 不會這個功能被拿掉了吧? 如果真的是這樣, 就請寫成macro試試.    至於WinRing和WinIO的異同, 看起來, 辛辛苦苦po的文章還是有人在看的~~~ 好感動, 以下列出異同 同: 都是使用 ><)
sniper69
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-22 12:00:21 IP:61.141.xxx.xxx 未訂閱
各位大大好! 感谢lcsboy的精彩文章! 我碰到和phototin一样的问题,没有办法解决< > 不知道有没有其他的写法可以得到这个入口地址< > 我试了几次,搞得不对就当机了 發表人 -
sniper69
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-22 12:21:35 IP:61.141.xxx.xxx 未訂閱
另外,我用Delphi重写了WinRing.hpp,编译通过,调用时就当机, 请看看有什么问题,是否在RingData定义和使用上有问题?还是在得到客户程序入口地址上有问题?: type {试过用record也不行 PRingData = ^TRingData; _RingData = record AdjRing0Entry:ULONG ; RegData:array[0..6] of ULONG; end; TRingData = _RingData; } TRingData = class public AdjRing0Entry:ULONG ; RegData:array[0..6] of ULONG; end; procedure OpenWinRing; procedure CloseWinRing; procedure ProcessRing0(Ring0Proc: TRing0Proc); const DRIVER = 'WINRING'; var DriverHandle: THandle; Ring: TRingData; implementation function BuildDriverService:boolean; var scHandle, srvHandle: SC_Handle; a:Pchar; begin Result:=False; scHandle:=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS); if (scHandle<>0) then begin srvHandle:=OpenService(scHandle,DRIVER,SERVICE_ALL_ACCESS); if (srvHandle=0) then begin srvHandle:=CreateService( scHandle, DRIVER, DRIVER, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, 'D:\WINRING.sys', 0,0,0,nil,nil); end; if (srvHandle=0) then result:= false; StartService(srvHandle,0,a); CloseServiceHandle(srvHandle); CloseServiceHandle(scHandle); Result:= true; end; end; function OpenDriver:Boolean; begin if (BuildDriverService) then begin DriverHandle:=CreateFile( '\\.\' DRIVER, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); if (DriverHandle=INVALID_HANDLE_VALUE) then Result:= false else Result:= true; end; end; function DeleteDriverService:boolean; var srvStatus: TServiceStatus; scHandle,srvHandle: SC_HANDLE; begin scHandle:=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS); if (scHandle<>0) then begin srvHandle:=OpenService(scHandle,DRIVER,SERVICE_ALL_ACCESS); if (srvHandle<>0) then begin ControlService(srvHandle,SERVICE_CONTROL_STOP,srvStatus); DeleteService(srvHandle); end; CloseServiceHandle(srvHandle); CloseServiceHandle(scHandle); Result:=true; end; end; function CloseDriver:boolean; begin CloseHandle(DriverHandle); Result:=DeleteDriverService; end; var OSVersion: byte; procedure OpenWinRing; begin OSVersion := LOBYTE(LOWORD(GetVersion())); if (OSVersion<>4) then begin if (not OpenDriver()) then begin ShowMessage('Driver not ready!!!'); CloseDriver(); Application.Terminate; end; end; end; procedure CloseWinRing; begin if (OSVersion <>4) then if (not CloseDriver()) then ShowMessage('Close Driver Fail!'); end; procedure SaveAllReg; asm push eax mov eax, offset Ring.RegData mov [eax][04], ebx mov [eax][08], ecx mov [eax][12], edx mov [eax][16], esi mov [eax][20], edi mov [eax][24], ebp mov ebx, eax pop eax mov [ebx], eax end; procedure ProcessRing0(Ring0Proc: TRing0Proc); var Adj0Address, retbyte:DWORD; rtn:boolean; begin Ring:=TRingData.Create; SaveAllReg(); asm jmp @@ADJRing @@ADJRing0: mov eax, [esp 4] call Ring0Proc //只有这样才可以编译通过 ret @@ADJRing: mov Adj0Address, offset @@ADJRing0 end; Ring.AdjRing0Entry:=Adj0Address; rtn:=DeviceIoControl(DriverHandle, //执行这个就当机 ($22 shl 16) or (0 shl 14) or ($999 shl 2) or 0, Ring, sizeof(Ring), Ring, sizeof(Ring), retbyte, 0); end;
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-22 14:49:47 IP:211.23.xxx.xxx 未訂閱
謝謝各位的愛護~    但是本人目前有個很爛, 卻是真實的理由--- 沒空 告訴各位我開發 > 對於造成大家的不便之處, 小弟也感無奈, 我再想想有什麼方法讓大家都可 自由的進出 >
sniper69
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-22 18:13:19 IP:61.141.xxx.xxx 未訂閱
BCB6编译的问题根据RaynorPao大大提供的做法已经解决,我这里已经成功运行了lcsboy的卓越代码,拿到了CMOS的数据! http://delphi.ktop.com.tw/topic.php?topic_id=27194    期待lcsboy的新作! dll或obj都可以。    唉,没办法,自己实在很菜,所以只好仰仗各位大大,尤其是 >
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-22 18:29:15 IP:211.23.xxx.xxx 未訂閱
引言: BCB6编译的问题根据RaynorPao大大提供的做法已经解决,我这里已经成功运行了lcsboy的卓越代码,拿到了CMOS的数据! http://delphi.ktop.com.tw/topic.php?topic_id=27194 期待lcsboy的新作! dll或obj都可以。 唉,没办法,自己实在很菜,所以只好仰仗各位大大,尤其是 > < face="Verdana, Arial, Helvetica"> 不用客氣啦, 有人在看我寫的文章就很~~~~~感動了 >
skyline_no1
一般會員


發表:9
回覆:7
積分:3
註冊:2006-07-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-05-16 11:42:52 IP:211.20.xxx.xxx 訂閱

===================引 用 lcsboy 文 章===================
引言: BCB6ѧ????据RaynorPao大大提供的做法已Ϩ???,我٩??已Ϧ??功Ш??了lcsboy的卓越代,拿到了CMOS的p据! http://delphi.ktop.com.tw/topic.php?topic_id=27194 期待lcsboy的新作! dll或obj都可以。 唉,??法,自己?在很菜,所以只好仰仗各位大大,尤其是lcsboy!我也在努力f`,希望日后能在٩??有象lcsboy一7好的作品和大家分享。 不用客氣啦, 有人在看我寫的文章就很~~~~~感動了 Hook WDM的作法, 是我一時頓悟出來的, 理論上和我目前實作上都還沒出錯過. 但是理論歸理論, 希望有更多人來使用, 來幫我驗証WinRing是沒bug的那就我就開心了 最近一直想要讀Physical Address的Memory, 因為自己有這個需要, 所以會再出個pro版, 把DDK裡唯一的一個函式包進來, 那個函式是無法出現在在一般的API, 原因無他: 讀4GB Memory只有Ring 0才是萬能的, AP只在Ring 3 除了商業用途外, 歡迎大家告訴大家, 一同來揭開OS和CPU的神秘面紗

//================================================================



lcsboy大大

感謝您提供這麼好的方法給大家使用....
可是小弟有比較過此RING 0與winio v2.0 -- Yariv Kaplan版之處理速度,
發現差異不大 ,不曉得winio v2.0使否也是您的作品呢?

winio v2.0如果不是使用RING0而是使用一般WDM的話,那RING 0應該就沒有大家
所說的如此快速的效能了....

本人是使用您提供的方法控制8255卡,利用迴圈的方式,快速讓一個腳位為1或0,然後
利用示波器量測,而用此方式比較過:

Windows XP Ring 0 ㄧ個pulse T=9.68us
Windows XP winio v2.0 T=9.36us

Windows 98 Turbo C之 outportb = 無法想像的高速


所以面對時代的變遷,原以為出現ㄧ線曙光的我,只能搖頭歎息....
但還是謝謝大大提供這寶貴的knowhow......










zolt
一般會員


發表:20
回覆:9
積分:5
註冊:2008-07-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-08-06 13:07:58 IP:220.128.xxx.xxx 訂閱
各位好,

目前在compile 到這支程式的WinRing.hpp 時
在底下這段會出現問題:

//===============================================
void __fastcall SaveAllReg(void)
{
asm {
push eax
mov eax, offset Ring.RegData =====>停在此處
mov [eax][04], ebx
mov [eax][08], ecx
mov [eax][12], edx
mov [eax][16], esi
mov [eax][20], edi
mov [eax][24], ebp
mov ebx, eax
pop eax
mov [ebx], eax}
}

提示訊息為:
[C Error]WingRing.hpp(182):E2017 Ambiguous member name 'TRegDataInfo::RegData'


試改了一些地方仍無法解決
請問有人可以提供解決建議嗎?

謝謝大家
系統時間:2024-05-15 20:09:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!