|
阅读:4073回复:2
pciView(查看本機PCI設備的資訊)
這個範例部會直接呼叫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 |
|
|
沙发#
发布于:2010-04-27 20:57
下过用了,功能很好,但demo界面设计的有些麻烦。
|
|
|
|
板凳#
发布于:2010-05-03 23:33
谢谢指点,欢迎有时间到我的网站发帖,交流. http://bbs.codeheaven.com.tw
|
|
