我企图用winIo里面的两个函数访问CMOS,无论我将偏移量设置为多少
   读出的数据总是相同的,我想我并没有有效的设置偏移量,帮我看看如何解决吧
      InitializeWinIo(); //返回值为1,正确
      SetPortVal(0x70,i, 4);//0<i<255
      GetPortVal(0x71, &data, 4);
//无论 i 设置为多少,data的值总是相同的
在2000/xp下改用 
             InitializeWinIo();     
              _outp(0x70, i);
              data=  _inp(0x71);
结果也是一样的. 怎样才能读/写 CMOS 里 256 字节的全部内容呢?
用同样的方法可以 读 BIOS 内容吗?

解决方案 »

  1.   

    你的方法好像对着呢啊,我手里现在没有CMOS的读写资料,你先看一下读写方法对不对,另外读写端口最好要由延时,因为你在0x70写了数据,因为CPU的速度太快 CMOS可能还没有在0x71准备数据,你已经GetPortVal,你可以把你的方法翻译成dos下面的debug的方法试一试就知道了,另外就是CMOS好像是8位端口,所以我给你改成了下面的试试
    SetPortVal(0x70,i, 1);//0<i<255
    Sleep(1000);
    GetPortVal(0x71, &data, 1);
    还有我真的不懂,你到底有没有试_outp  _inp在NT/2000下面这个函数根本不能调用成功
      

  2.   

    我开始的时候也用的
    SetPortVal(0x70,i, 1);//0<i<255
    GetPortVal(0x71, &data, 1);但读出来的数据总是 0 ,很郁闷……, 后来就改为 SetPortVal(0x70,i, 4);//0<i<255
    GetPortVal(0x71, &data, 4);关于 _inp/_outp, 我在WinIo的说明里看到下面几句话Under Windows NT/2000/XP, calling InitializeWinIo grants the application full access to the I/O address space. Following a call to this function, an application is free to use the _inp/_outp functions provided by the C run-time library to access I/O ports on the system. andUnder Windows 98/ME, an application must use the GetPortVal function to read values from an I/O port. Under Windows NT/2000/XP, it is possible to use the _inp/_inpw/_inpd functions instead of using GetPortVal, provided that the InitializeWinIo function has been called beforehand.我得到的结果和GetPortVal是相同的。
      

  3.   

    4个字节 读出 71H 结果是 2130706432 即 0111 1111 0000 0000 0000 0000 0000 0000
    当然一个字节读出 就是 04个字节 读出 378H(WinIo给的例子) 结果是 4294967210 即 
    1111 1111 1111 1111 1111 1111 1010 1010我怀疑根本就没有读出有效的值,是不是CMOS端口还是封着的呢?
      

  4.   

    自己up 一下用sleep()的方法没有作用
    参数也改成(0x70, i, 1)了
    可以自如读写 71H 端口,但是无论向70H端口写入什么,读出来的总是全1到底怎么设置偏移量呢,我要读/写 全部的CMOS 信息呀!!郁闷ing....
      

  5.   

    但读出来的数据总是 0 ,很郁闷……, 后来就改为 
    用sleep()的方法没有作用
    参数也改成(0x70, i, 1)了
    可以自如读写 71H 端口,但是无论向70H端口写入什么,读出来的总是全1
    //////////////////////////
    ???????是1还是0,我怎么看不懂啊
    我说过了,CMOS是8位的数据端口你不要用4字节来读,这样高24位读出来肯定是错误的,高24位可能是连在CPU总线上别的什么寄存器保留的结果........不知道你怎么做的,害我自己写了段程序用来测试,结果可以读出来啊
    下面是核心代码,
    void CCmosrw2Dlg::Onrmos() 
    {
    CString str;
    unsigned long data=0;
        DWORD compare=0x80000000; for(int i=0;i<=128;i++)
    {
    compare=0x80000000;
    SetPortVal(0x70,i, 1);//0<i<128
    Sleep(1);
    GetPortVal(0x71, &data, 1); // TODO: Add your control notification handler code here
    str.Format("地址:%u  数值:%u 二进制数值:",i,data);
    m_edit.ReplaceSel(str);
    for(;compare!=0;compare=compare>>1)
    {str.Format("%u",((compare&data)==compare));
    m_edit.ReplaceSel(str);
    }
    str.Format("\r\n");
    m_edit.ReplaceSel(str);
    data=0;
    }
    }
    另外,注意如果要用的结果data最好屏蔽高24位,因为对于32位存储单元存8位数据来说高24位根本没有用,如果第8位是0那么高24位就是全0,第8位是1高24位就是1这是以前为了使32位CPU兼容16位8位的CPU而定义的软件上的标准,不信,你看下面的运行结果地址:0  数值:23 二进制数值:00000000000000000000000000010111
    地址:1  数值:2 二进制数值:00000000000000000000000000000010
    地址:2  数值:25 二进制数值:00000000000000000000000000011001
    地址:3  数值:66 二进制数值:00000000000000000000000001000010
    地址:4  数值:33 二进制数值:00000000000000000000000000100001
    地址:5  数值:19 二进制数值:00000000000000000000000000010011
    地址:6  数值:3 二进制数值:00000000000000000000000000000011
    地址:7  数值:35 二进制数值:00000000000000000000000000100011
    地址:8  数值:7 二进制数值:00000000000000000000000000000111
    地址:9  数值:3 二进制数值:00000000000000000000000000000011
    地址:10  数值:38 二进制数值:00000000000000000000000000100110
    地址:11  数值:2 二进制数值:00000000000000000000000000000010
    地址:12  数值:80 二进制数值:00000000000000000000000001010000
    地址:13  数值:4294967168 二进制数值:11111111111111111111111110000000
    地址:14  数值:0 二进制数值:00000000000000000000000000000000
    地址:15  数值:0 二进制数值:00000000000000000000000000000000
    地址:16  数值:64 二进制数值:00000000000000000000000001000000
    地址:17  数值:4294967292 二进制数值:11111111111111111111111111111100
    地址:18  数值:4294967280 二进制数值:11111111111111111111111111110000
    地址:19  数值:2 二进制数值:00000000000000000000000000000010
    地址:20  数值:15 二进制数值:00000000000000000000000000001111
    地址:21  数值:4294967168 二进制数值:11111111111111111111111110000000
    地址:22  数值:2 二进制数值:00000000000000000000000000000010
    地址:23  数值:4294967232 二进制数值:11111111111111111111111111000000
    地址:24  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:25  数值:47 二进制数值:00000000000000000000000000101111
    地址:26  数值:47 二进制数值:00000000000000000000000000101111
    地址:27  数值:4294967231 二进制数值:11111111111111111111111110111111
    地址:28  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:29  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:30  数值:0 二进制数值:00000000000000000000000000000000
    地址:31  数值:0 二进制数值:00000000000000000000000000000000
    地址:32  数值:0 二进制数值:00000000000000000000000000000000
    地址:33  数值:0 二进制数值:00000000000000000000000000000000
    地址:34  数值:0 二进制数值:00000000000000000000000000000000
    地址:35  数值:0 二进制数值:00000000000000000000000000000000
    地址:36  数值:0 二进制数值:00000000000000000000000000000000
    地址:37  数值:0 二进制数值:00000000000000000000000000000000
    地址:38  数值:4294967292 二进制数值:11111111111111111111111111111100
    地址:39  数值:4294967193 二进制数值:11111111111111111111111110011001
    地址:40  数值:16 二进制数值:00000000000000000000000000010000
    地址:41  数值:0 二进制数值:00000000000000000000000000000000
    地址:42  数值:0 二进制数值:00000000000000000000000000000000
    地址:43  数值:4294967291 二进制数值:11111111111111111111111111111011
    地址:44  数值:4294967193 二进制数值:11111111111111111111111110011001
    地址:45  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:46  数值:11 二进制数值:00000000000000000000000000001011
    地址:47  数值:4294967249 二进制数值:11111111111111111111111111010001
    地址:48  数值:4294967232 二进制数值:11111111111111111111111111000000
    地址:49  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:50  数值:32 二进制数值:00000000000000000000000000100000
    地址:51  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:52  数值:0 二进制数值:00000000000000000000000000000000
    地址:53  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:54  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:55  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:56  数值:4294967168 二进制数值:11111111111111111111111110000000
    地址:57  数值:0 二进制数值:00000000000000000000000000000000
    地址:58  数值:4294967295 二进制数值:11111111111111111111111111111111
    地址:59  数值:3 二进制数值:00000000000000000000000000000011
    地址:60  数值:4294967218 二进制数值:11111111111111111111111110110010
    地址:61  数值:4294967249 二进制数值:11111111111111111111111111010001
    地址:62  数值:0 二进制数值:00000000000000000000000000000000
    地址:63  数值:18 二进制数值:00000000000000000000000000010010
    地址:64  数值:74 二进制数值:00000000000000000000000001001010
    ..............
      

  6.   

    最后还要麻烦 AthlonxpX86(一滴水) ,还有一点小问题BIOS的端口是 80和81 吗?也是8位的端口吗?BIOS 和 CMOS 各占多少字节呢?
      

  7.   

    BIOS好像是在内存地址空间上,不是I/O地址空间,本版的精华贴和FAQ中有读取BIOS的方法,你可以去看看