C C 使用WinIO讀取CMOS資料

2021-09-25 01:14:11 字數 3041 閱讀 1585

實現**

注意事項

測試模式/證書安裝

pc機的主機板上整合有cmos實時時鐘,為作業系統提供時間資訊:年、月、日與時、分、秒。它附有128或256個位元組的ram,用於存放時間與硬碟、記憶體、顯示卡等最基本的硬體配置資訊。作業系統啟動時,從cmos實時時鐘中讀取時間資訊作為系統的基準時間。系統斷電後由後備的鋰電池供電,以保障資訊不丟失。這個晶元內部有兩個埠,埠位址為 70h 和 71h,cpu 通過這兩個埠來讀寫 cmos ram。70h 為位址埠,存放要訪問的 cmos ram 單元的位址,71h 位資料埠,存放從選 定的 cmos ram 單元中讀取的資料,或者要寫入到其中的資料。

yariv kaplan在2023年發布開源軟體winio 3.0,它採用了非文件化的windows api(native api)和其它一些底層程式設計技巧繞過windows安全保護機制,使得windows下的應用程式可直接對i/o埠進行操作。winio 3.0提供了10個庫函式,用於對i/o埠和記憶體物理儲存單元的直接讀寫。winio軟體包由winio.sys、winio_nt.h、winio.h、winio.dll、winio.lib(未提供,需要使用者在vc2010下生成)等5個核心檔案組成。

位址內容

00htime - seconds

01halarm - seconds

02htime - minutes

03halarm - minutes

04htime - hours

05halarm - hours

06hdate - day of the week

07hdate - day

08hdate - month

09hdate - year

0ahstatus register a

0bhstatus register b

0chstatus register c

0dhstatus register d

0ehdiagnostic status

0fhshutdown status

2ehcmos checksum (high byte)

2fhcmos checksum (low byte)

32hdate - century

winio_api bool _stdcall initializewinio();
winio_api void _stdcall shutdownwinio();
winio_api bool _stdcall getportval(word wportaddr, pdword pdwportval, byte bsize);
引數wportaddr為埠位址,16位整型變數或常量;引數pdwportval為指向一存放讀取埠內容的32位整型變數指標;引數bsize為實際讀取的位元組數,8位整型變數或常量,取值範圍為1、2或4,表示讀操作的物件為8位、16位或32位埠。

winio_api bool _stdcall setportval(word wportaddr, dword dwportval, byte bsize);
引數wportaddr為埠位址,16位整型變數或常量;

引數dwportval為要寫入埠的32位整型變數或常量;

引數bsize為實際寫出的位元組數,8位整型變數或常量,取值範圍為1、2或4,表示讀操作的物件為8位、16位或32位埠。

**比較簡單,但是可以執行

#include "stdio.h"

#include "windows.h"

#include "winio.h"

#pragma comment

( lib,

"winio.lib"

)int main()

}shutdownwinio()

;}else

system

("pause");

return0;

}

#include "stdio.h"

#include "windows.h"

#include "winio.h"

#pragma comment

( lib,

"winio.lib"

)int main()

shutdownwinio()

;}else

system

("pause");

return0;

}

winio 3.0軟體包的source資料夾下包含了winio的原始檔及其所需的資源,其下的dll資料夾為vc 2010的winio專案資料夾。生成winio.lib檔案的步驟如下:

(1)雙擊「winio.sln」啟動winio專案

(2)在vc 2010 ide下開啟「生成」選單,單擊「生成winio」生成的winio.lib檔案它存放於「…\suorce\dll\debug」資料夾。

注意:vc 2010學習版不能生成winio.lib檔案;visual studio 2015及以上無法生成;

建立乙個win32控制台應用專案

建立乙個「win32控制台應用程式」的winiodemo專案,開啟「生成」選單,單擊「生成winiodemo」。

複製winio核心檔案到制定的資料夾

將winio 3.0軟體包的source資料夾下的winio_nt.h、winio.h與winio.lib複製到winiodemo專案資料夾下,winio.sys與winio.dll複製到winiodemo專案資料夾下的debug資料夾。

修改winio.**件

將winio.h中的 「#include 」…\drv\winio_nt.h「」,修改為「#include 」winio_nt.h「」;

64位的系統管理員身份進入「命令提示符」,輸入「bcdedit /set testsigning on」開啟測試模式,重啟;

右擊winio65.dll->屬性->數字簽名->詳細資訊->檢視證書->安裝證書->下一步->將所有的證書都放入下列儲存->受信任的根證書頒發機構

讀取CMOS時鐘並顯示

讀取年月日及當前時間 escape equ 1bh cmos port equ 70h cmos rega equ 0ah update flag equ 80h cmos sec equ 00h cmos min equ 02h cmos hour equ 04h cmos day equ 07h...

直接從CMOS讀取系統時間

following code come from linux kernel 0.01 define cmos read addr define bcd to bin val val val 15 val 4 10 static void time init void while time.tm se...

使用WinIO訪問底層埠 暫存器

一 在window系統中應用層程式沒有許可權訪問底層,為了實現埠或者暫存器操作,就要借助高許可權的程式。一般是將winio.dll 載入到驅動,借道實現底層操作。就好像我們借助驅動程式操作外設一樣。64位系統的應用層是相容32位程式的,但驅動層是不能向下相容的,所以winio64和winio32要用...