⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanpci.c

📁 扫描PCI设备的演示程序
💻 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 + -