📄 pcilist.c
字号:
#include "stdio.h"
#include "conio.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
#define PCI_BUS_SHIFT 8
#define PCI_BUS_SIZE 8
#define PCI_BUS_MAX 0xFF
#define PCI_BUS_MASK 0xFF00
#define PCI_Dev_SHIFT 3
#define PCI_Dev_SIZE 5
#define PCI_Dev_MAX 0x1F
#define PCI_Dev_MASK 0x00F8
#define PCI_Fun_SHIFT 0
#define PCI_Fun_SIZE 3
#define PCI_Fun_MAX 0x7
#define PCI_Fun_MASK 0x0007
#define MK_PCI(bus,dev,func) (WORD)((bus&PCI_BUS_MAX)<<PCI_BUS_SIZE | (dev&PCI_Dev_MAX)<<PCI_Dev_SIZE | (func&PCI_Fun_MAX))
#define PCI_CONFIG_ADDRESS 0xCF8
#define PCI_CONFIG_DATA 0xCFC
#define MK_PCICFGADDR(bus,dev,func) (DWORD)(0X80000000L | (DWORD)MK_PCI(bus,dev,func)<<8)
//
DWORD inpd(int portid)
{
DWORD dwRet;
asm mov dx, portid;
asm lea bx, dwRet;
//insert machine language
__emit__(
0x66, 0x55, //push EAX
0x66, 0xed, //in EAX, DX
0x66, 0x89, 0x07, //mov [BX],EAX
0x66, 0x58); //pop EAX
return dwRet;
}
//
void outpd(int portid, DWORD dwVal)
{
asm mov dx, portid;
asm lea bx, dwVal;
__emit__(
0x66, 0x50, //push EAX
0x66, 0x8B, 0x07, //mov EAX, [BX]
0x66, 0xEF, //out DX,EAX
0x66, 0x58); //pop EAX
return;
}
int main(void)
{
int bus, dev, func;
int i;
DWORD dwAddr;
DWORD dwData;
FILE* hF;
char szFile[0x10];
printf("\n");
printf("Bus#\tDev#\tFunc#\tVendor\tDevice\tClass\tIRQ\tIntPin\n");
for(bus=0; bus<=PCI_BUS_MAX; ++bus)
{
for(dev=0; dev<=PCI_Dev_MAX; ++dev)
{
for(func=0; func<=PCI_Fun_MAX; ++func)
{
//get pci configuration space base_address
dwAddr = MK_PCICFGADDR(bus,dev,func);
//output address, and get data
outpd(PCI_CONFIG_ADDRESS, dwAddr);
dwData = inpd(PCI_CONFIG_DATA);
if((WORD)dwData != 0xFFFF)
{
//bus/dev/func
printf("%2.2x\t%2.2x\t%1x\t", bus, dev, func);
//Vendor/Device
printf("%4.4x\t%4.4x\t", (WORD)dwData, dwData>>16);
//Class Code
outpd(PCI_CONFIG_ADDRESS, dwAddr | 0x8);
dwData = inpd(PCI_CONFIG_DATA);
printf("%6.6lx\t", dwData>>8);
//IRQ/Intpin
outpd(PCI_CONFIG_ADDRESS, dwAddr | 0x3c);
dwData = inpd(PCI_CONFIG_DATA);
printf("%d\t", (BYTE)dwData);
printf("%d", (BYTE)(dwData>>8));
printf("\n");
sprintf(szFile, "PCI%2.2X%2.2X%X.bin", bus, dev, func);
hF=fopen(szFile, "wb");
if(hF!=NULL)
{
//configuration space
for(i=0;i<0x100;i+=4)
{
outpd(PCI_CONFIG_ADDRESS, dwAddr | i);
dwData = inpd(PCI_CONFIG_DATA);
fwrite(&dwData, sizeof(dwData), 1, hF);
}
fclose(hF);
}
}
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -