?? scanpci.c
字號:
#include <stdio.h>
#include <dpmi.h>
typedef unsigned long UDWORD;
typedef unsigned short int UWORD;
int main() {
UDWORD i, busNo, deviceNo, funcNo, regVal, retVal;
UWORD vendorID, devID, class1, class2, class3;
__dpmi_regs r;
r.x.ax = 0xb101;
__dpmi_int(0x1a, &r);
i = r.x.flags;
if ((i & 0x01) == 0) printf("\nSupport PCI BIOS");
else printf("\nNot Support PCI BIOS");
printf("\nNo. Vendor/Device Bus No. Dev No. Func No. Class");
i = 0;
for (busNo = 0; busNo < 5; busNo++) { // bus No
for(deviceNo = 0; deviceNo < 32; deviceNo++) { // device no
for (funcNo = 0; funcNo < 8; funcNo++) { // Function No
//j = 0x80000000 + i * 2048;
regVal = 0x80000000 // bit31 使能
+ (busNo << 16) // Bus No
+ (deviceNo << 11) // Device No
+ (funcNo << 8); // Function No
outportl(0xCF8, regVal);
retVal = inportl(0xCFC); // 得到配置空間偏移為0的雙字
if (retVal != 0xffffffff) { // 設備存在
i++;
vendorID = retVal & 0xffff; // 得到供應商代碼
devID = (retVal >> 16) & 0xffff; // 得到設備代碼
regVal += 0x08; // 得到配置空間偏移為08H的雙字
outportl(0xCF8, regVal);
retVal = inportl(0xCFC);
retVal = retVal >> 8; // 濾掉版本號
class3 = retVal & 0x0FF; // 得到三個分類代碼
class2 = (retVal >> 8) &0x0FF;
class1 = (retVal >> 8) &0x0FF;
printf("\n%02d %04x/%04x %02x %02x %02x %02x-%02x-%02x",
i, vendorID, devID, busNo, deviceNo, funcNo, class1, class2, class3);
if (funcNo == 0) { // 如果是單功能設備,則不再查funcNo>0的設備
regVal = (regVal & 0xFFFFFFF0) + 0x0C;
outportl(0xCF8, regVal);
retVal = inportl(0xCFC);
retVal = retVal >> 16;
if ((retVal & 0x80) == 0) funcNo = 8;
}
}
}
}
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -