如何获取AHCI base address <二>

原创 2013年12月02日 17:52:20

我之前有篇文章有些利用第三方工具包来获取AHCI base address,这次我要讲的是利用WinRing0这个开源dll来完成这个功能。

请看WinRing0API的说明:

Support Functions for PCI Access 
C++ (OlsDef.h) *Macro
// Bus Number, Device Number and Function Number to PCI Device Address#define PciBusDevFunc(Bus, Dev, Func) ((Bus&0xFF)<<8) | ((Dev&0x1F)<<3) | (Func&7)
// PCI Device Address to Bus Number
#define PciGetBus(address)            ((address>>8) & 0xFF)
// PCI Device Address to Device Number#define PciGetDev(address)            ((address>>3) & 0x1F)
// PCI Device Address to Function Number
#define PciGetFunc(address)           (address&7)C# (OpenLibSys.cs) 
// Bus Number, Device Number and Function Number to PCI Device Addresspublic uint PciBusDevFunc(uint bus, uint dev, uint func)
{
    return ((bus&0xFF)<<8) | ((dev&0x1F)<<3) | (func&7);
}
// PCI Device Address to Bus Numberpublic uint PciGetBus(uint address)
{
    return ((address>>8) & 0xFF);
}
// PCI Device Address to Device Numberpublic uint PciGetDev(uint address)
{
    return ((address>>3) & 0x1F);
}
// PCI Device Address to Function Numberpublic uint PciGetFunc(uint address)
{
    return (address&7);
}PCI Device Address
bit description 
0- 2 Function Number 
3- 7 Device Number 
8-15 PCI Bus Number 
16-31 Reserved 

Requirements
WinRing0 1.0 or later 

啦啦啦 看到了吧 我们可以用OpenLibSys.cs中现成的

PciBusDevFunc(uint bus, uint dev, uint func)
方法,就可以得到AHCI base address啦!有木有很激动?!

  附上调用的代码

 /**getAHCIbaseAddress**/
        public string getAHCIbaseAddress()
        {
            uint address = ols.PciBusDevFunc(0x00, 0x1F, 0x02);

            //add by kelsey
            string ahciBaseAddress = "";

            // Host Bridge
            if (address != 0xFFFFFFFF)
            {
                for (int i = 0; i < 256; i += 16)
                {
                    //str += i.ToString("X2") + "|";
                    for (int j = 0; j < 16; j++)
                    {
                        if (i == 32 && j == 4)
                        {
                            ahciBaseAddress = (ols.ReadPciConfigDword(address, (byte)(i + j))).ToString("X2");
                            break;
                        }
                    }
                }
                Console.WriteLine("ahciBaseAddress ==" + ahciBaseAddress);
            }
            return ahciBaseAddress;
        }


如何获取AHCI base address <二>

我之前有篇文章有些利用第三方工具包来获取AHCI base address,这次我要讲的是利用WinRing0这个开源dll来完成这个功能。 请看WinRing0API的说明:Support Func...
  • shmily453397
  • shmily453397
  • 2013年12月02日 17:52
  • 829

如何获取AHCI base address?

本人c#新手,因公司打游击战被迫从android临时转成做c#做工厂notebook测试项目。现在跟大家分享一下如何获取AHCI BASE ADDRESS,网上这种资料我查了几乎是没有,所以希望看到我...
  • shmily453397
  • shmily453397
  • 2013年10月31日 10:30
  • 875

PCI 中的base address register

PCI设备有很好的可配置型和易操作性,这很大方面要归功于其地址空间的可动态分配的特性。而动态分配地址空间就是依赖于BAR(base address register)实现的。 BAR是PCI配置...
  • yhc1991
  • yhc1991
  • 2014年05月21日 16:43
  • 985

WinRing0帮助文档

  • 2014年04月19日 21:28
  • 35KB
  • 下载

ld: warning: directory not found for option 去掉警告的方法

工程老是提示ld: warning: directory not found for option:xxxxxx 这种提示,通常是由于添加了第三方SDK,但是后来改了个名字或者去掉了SDK,但是在 B...
  • woaifen3344
  • woaifen3344
  • 2015年01月07日 10:32
  • 18506

复制原理图的时候最后弹出这样的错误 InvalidParameter at 2510219C. AdvSch.dll, Base Address: 24C80000. Exception Occurr

先看看能不能添加本地打印机,要是无法添加打印机,在桌面选中“我的电脑”,鼠标右键选择“管理”;  在“管理”窗口中,选取“服务和应用程序”扩展项目下的“服务”选项,在右侧出现系统服务列表中找到“...
  • grengras
  • grengras
  • 2015年08月12日 11:48
  • 2208

解决CentOS/Ubuntu/Fedora/RHEL Linux下硬盘切换到AHCI模式后无法启动的办法

起因:安装Linux的时候硬盘没有采用AHCI模式,所以编译内核的时候没有加入AHCI支持   解决办法:1. 在BIOS 中将硬盘模式先修改为IDE, 然后正常进入Linux2. 备份已有文件su ...
  • knityster
  • knityster
  • 2011年04月09日 21:08
  • 4886

A300升级工具

  • 2013年12月18日 02:52
  • 1.03MB
  • 下载

2010-2012迷你博客

XiaJing: MySQLdb.escape_string(...) escape_string(s) -- quote any SQL-interpreted characters in stri...
  • xiajing20060721
  • xiajing20060721
  • 2012年02月17日 13:16
  • 51124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何获取AHCI base address <二>
举报原因:
原因补充:

(最多只允许输入30个字)