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

📄 pcilist.c

📁 在dos下搜索所有的pci 设备
💻 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 + -