PCI设备查询:
#include <stdio.h>
#include <conio.h>
typedef unsigned long DWORD ;
static DWORD _inpd(int portnum)
...{
static DWORD value ;
asm mov dx,portnum ;
asm lea bx,value ;
#if defined(__BORLANDC__)
__emit__(0x66,0x50, // push EAX
0x66,0xED, // in EAX,DX
0x66,0x89,0x07, // mov [BX],EAX
0x66,0x58) ; // pop EAX
#else
asm push eax
asm in eax,dx ;
asm mov [bx],eax ;
asm pop eax
#endif
return value ;
}
static void _outpd(int portnum, DWORD val)
...{
static DWORD value = 0 ;
value = val ;
asm mov dx,portnum ;
asm lea bx,value ;
#if defined(__BORLANDC__)
__emit__(0x66,0x50, // push EAX
0x66,0x8B,0x07, // mov EAX,[BX]
0x66,0xEF, // out DX,EAX
0x66,0x58) ; // pop EAX
#else
asm push eax
asm mov eax,[bx] ;
asm out dx,eax ;
asm pop eax
#endif
return ;
}
void main(void)
...{
int i, j, k;
int bus, device;
unsigned long ioa0, iod;
unsigned long iobase;
int io;
clrscr();
for(i=0; i<5; i++)
...{
for(j=0; j<32; j++)
...{
bus = i;
device = j;
iobase = 0x80000000 + bus * 0x10000+ (device * 8 ) * 0x100;
ioa0 = iobase + 0;
_outpd(0xcf8, ioa0);
iod = _inpd(0xcfc);
if (iod != 0xffffffff)
...{
printf(" Bus# = %x ", bus);
printf("Device # = %x ", device);
printf("ID# = %lx ", iod);
for (io=0; io<=5; io++)
...{
ioa0 = iobase + 0x10 + io*4;
_outpd(0xcf8, ioa0);
iod = _inpd(0xcfc);
printf("Base%d = 0x%lx ", io, iod);
}
ioa0 = iobase + 0x3c;
_outpd(0xcf8, ioa0);
iod = _inpd(0xcfc);
printf("IRQ# = 0x%x ", iod & 0xff);
getch();
}
}
}
}
DOS下BC编译的遍历PCI总线查询PCI设备及基地址。
“Grant”老大就是老大,我差的还远,努力学习中......
DOS下PCI设备遍历与基地址查询
本文介绍了如何在DOS环境下使用BC编译器遍历PCI总线,查询并获取PCI设备的基地址。通过学习,可以理解在DOS下进行底层硬件交互的技术细节。
168万+





