在Windows下进行底层IO操作之CMOS数据的读取和显示
作者:彭学周(Favory.Peng)
CPU执行命令一般分为:特权(Privileged-Ring0)和非特权(Non-Privileged Mode-Ring3)两种模式;
Windows系统下的程序都是在Ring3下执行,无法进行任意I/O端口的操作;
要是能让程序在Ring0下执行,自然就可以顺利的进行读写I/O端口的操作;lcsboy编写的WinRing就提供了这个功能,下面以CMOS数据的读取为例介绍WinRing的使用;
编辑环境:BCB 6.0 需要文件:WINRING.sys(端口操作驱动),WinRing.hpp(WinRing应用处理函数)
CMOS数据读取原理:
在计算机系统中,对CMOS中数据的读写是通过两个I/O端口来实现的,其中,端口70H是一个字节的只写端口,用它来设置CMOS中的数据地址;而端口71H是用来读写端口70H设置的CMOS地址中的数据单元字节内容。
//-----------------------------------------------------------------------------------------------------
读CMOS代码:
asm{
mov al, Index //将需要读取的位置传到AL寄存器
out 0x70, al //将读取地址写到70H端口
in al, 0x71 //从71H端口读取数据送AL
mov Val, al //将AL中的数据送变量Val
}
写CMOS代码:
asm{
mov al, Index //将需要写入的地址送AL
out 0x70, al //将AL中的地址写入70H端口
mov al, Val //将需要写入的值送到AL中
out 0x71, al //将值写入71H端口完成数据写操作
}
//-----------------------------------------------------------------------------------------------------
1、在程序段加入WinRing.hpp的引用:#include "WinRing.hpp"
2、在窗口程序FormCreate事件中加入:OpenWinRing();
3、在窗口程序FormCloseQuery事件中加入:CloseWinRing();
4、编写CMOS读写函数:(要求代码精简,不能有控件操作等)
BYTE CMOSData[128]; //存储CMOS数据
void __fastcall TForm1::ReadComs(void) //读CMOS数据
{
BYTE Val, Index;
asm cli; //关中断
for (int i=0;i<128; i++)
{
Index=i;
asm{
mov al, Index
out 0x70, al
in al, 0x71
mov Val, al}
CMOSData[i]=Val;
}
asm sti; //开中断
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WriteComs(void)