阅读:3558回复: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
|
|