ielts5316
驱动小牛
驱动小牛
  • 注册日期2005-05-18
  • 最后登录2018-08-27
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望940点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3428回复:2

pciView(查看本機PCI設備的資訊)

楼主#
更多 发布于:2010-04-25 15:07
這個範例部會直接呼叫IOMEM.DLL,而是透過PCILIB.DLL向下傳遞所要執行的功能。在PCI的規範上,每一個PCI設備都有一個長達256Bytes的表頭,其中前64位元紀錄著此設備的廠商的ID、屬於何種PCI設備、支援I/O或記憶體等。在此範例中會將這64位元的資訊顯示出來。在DDK中有詳細的說明,為了使用的方便,我使用了的一個函數來取得這64位元組的各個欄位的資訊,如下:

ULONG GetPCIInformationByName(__in ULONG Order,   __in ULONG Function);


參數:
Order : 指定所要取得的PCI設備的編號,以“1”為起始,此編號可以呼叫GetDeviceCount函數取得總數。
Function : 要取得的功能名稱。此值介於GETPCIVENDORID與GETPCICLASSCODE之間。
例如要取得第一個PCI設備的廠商(VendorID),只需要呼叫GetPCIInformationByName(0, GETPCIVENDORID),執行成功傳回指定的值。  


ULONG GetDeviceCount(VOID);

函數執行成功後,傳回PCI設備的總數,從“1”開始。

ULONG 
PCI_DATA::GetPciInformation(__in ULONG Order,  
                                                  __in ULONG Function) 
{  
    if ((INT)Order < GETPCIVENDORID || (INT)Order > GETPCICLASSCODE)  
        return 0xFFFFFFFF; 

    if (GetPciInformation(Order, &data)) 
    {  
        if ((INT)Function < GETPCISUBVENDORID) 
       {  
            ptr = (PUCHAR)&data.commonConfig.VendorID;  
            switch(Function) 
            { //指定的功能編號,這是一個列舉的結構  
                case GETPCIVENDORID:  
                case GETPCIDEVICEID:  
                case GETPCICOMMAND:  
                case GETPCISTATUS: //計算偏移位址  
                    RtlCopyMemory(&ldata, ptr+(Function*2), sizeof(USHORT));  
                    return ldata;  
                break; 
// 
                case GETPCIREVISIONID:  
                case GETPCIPROGIF:  
                case GETPCISUBCLASS:  
                case GETPCIBASECLASS:  
                case GETPCICACHELINESIZE:  
                case GETPCILATENCYTIMER:  
                case GETPCIHEADERTYPE:  
                case GETPCIBIST:  
                    RtlCopyMemory(&ldata,  ptr+Function+8-GETPCIREVISIONID, sizeof(UCHAR));  
                    return ldata;  
                break; 
// 
                default:  
                    return 0xFFFFFFFF;  
            };  
        }  
        else 
         { //TYPE0 的資訊  
            ptr = (PUCHAR)&data.commonConfig.u.type0.SubVendorID;  
            wdata = (USHORT)(Function - GETPCISUBVENDORID);  
            switch(Function) 
             {  
                case GETPCISUBVENDORID:  
                case GETPCISUBSYSTEMID:  
                    RtlCopyMemory(&ldata, ptr+wdata*2, sizeof(USHORT));  
                    return ldata;  
                break; 
// 
                case GETPCICAPABILITIESPTR:  
                case GETPCIINTERRUPTLINE:  
                case GETPCIINTERRUPTPIN:  
                case GETPCIMINIMUMGRANT:  
                case GETPCIMAXMUMLATENCY:  
                    if ((INT)Function >= GETPCIINTERRUPTLINE)  
                        RtlCopyMemory(&ldata, ptr+wdata+12, sizeof(UCHAR));  
                    else  
                        RtlCopyMemory(&ldata, ptr+wdata+5, sizeof(UCHAR));  
                    return ldata;  
                break; 
// 
                case GETPCIROMBASEADDRESS:  
                case GETPCICLASSCODE:  
                    if (Function == GETPCIROMBASEADDRESS)  
                        RtlCopyMemory(&ldata, ptr+4, sizeof(ULONG));  
                    else  
                        ldata =  PCI_CLASS_CODE(data.commonConfig.BaseClass,  
                                                                      data.commonConfig.SubClass,  
                                                                      data.commonConfig.ProgIf);  
                    return ldata;  
                break; 
// 
                default:  
                    return 0xFFFFFFFF;  
            };  
        };  
    };  
    return 0xFFFFFFFF; 
};

图片:pciview.png

 

源代碼可至 http://bbs.codeheaven.com.tw/htm_data/2/1004/1.html

或參考 http://bbs.driverdevelop.com/read.php?tid-120547.html

Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2010-04-27 20:57
下过用了,功能很好,但demo界面设计的有些麻烦。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
ielts5316
驱动小牛
驱动小牛
  • 注册日期2005-05-18
  • 最后登录2018-08-27
  • 粉丝0
  • 关注0
  • 积分478分
  • 威望940点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2010-05-03 23:33
谢谢指点,欢迎有时间到我的网站发帖,交流. http://bbs.codeheaven.com.tw
游客

返回顶部