讀取主機板上CMOS的時分秒(使用WinRing) |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
這個程式會讀取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 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
phototin
初階會員 發表:13 回覆:30 積分:29 註冊:2002-06-15 發送簡訊給我 |
抱歉…還是不行,
還請 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 發送簡訊給我 |
|
sniper69
一般會員 發表:0 回覆:4 積分:0 註冊:2003-04-19 發送簡訊給我 |
|
sniper69
一般會員 發表:0 回覆:4 積分:0 註冊:2003-04-19 發送簡訊給我 |
另外,我用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 發送簡訊給我 |
|
sniper69
一般會員 發表:0 回覆:4 積分:0 註冊:2003-04-19 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
引言: 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 發送簡訊給我 |
===================引 用 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的神秘面紗 |
zolt
一般會員 發表:20 回覆:9 積分:5 註冊:2008-07-19 發送簡訊給我 |
各位好,
目前在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' 試改了一些地方仍無法解決 請問有人可以提供解決建議嗎? 謝謝大家 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |