给出一个解决方法
把PCI_COMMON_CONFIG的第一个成员:(wdmh的32015行)
PCI_COMMON_HEADER DUMMYSTRUCTNAME;
修改为
PCI_COMMON_HEADER PCIHeader;//;
////////////////////////////////////////////////////////////////////////////////////
DisplayCfgSpace(3, 0, 0); // 3,0,0 需要看下设备管理器的器件属性观察得到 第一个是总线号,第二个是设备号码,第三个是功能号,可以在 evtPreparaHardware这个函数的末尾调用获取配置空间的信息~
///////////////////////////////////////////////////////////////////////////////////
测试实现代码:
#define PCI_CONFIG_ADDRESS (PULONG)(0xCF8)
#define PCI_CONFIG_DATA (PULONG)(0xCFC)
#define KdrPrint DbgPrint
void DisplayCfgSpace(int bus, int dev, int fn){
unsigned long dwAddr, dwData;
PCI_COMMON_CONFIG PciConfig;
PCI_SLOT_NUMBER SlotNumber;
// PCI_CAPABILITIES_HEADER CapabilityHeader;
// UCHAR CapabilityOffset;
SlotNumberuAsULONG = 0;
SlotNumberubitsDeviceNumber = dev; // 设置设备号
SlotNumberubitsFunctionNumber = fn; // 设置功能号
dwAddr = 0x80000000 |( bus << 16 ) | ( SlotNumberuAsULONG << 8 );
// 得到配置空间
for (int i = 0; i < 0x100; i += 4){/ 256 字节的 PCI 配置空间 /
#if 0
SetPortVal ( PCI_CONFIG_ADDRESS, dwAddr | i, 4 );
GetPortVal ( PCI_CONFIG_DATA , &dwData , 4 );
#endif
WRITE_PORT_ULONG(PCI_CONFIG_ADDRESS, dwAddr | i);
dwData = READ_PORT_ULONG(PCI_CONFIG_DATA);
memcpy (((PUCHAR )&PciConfig) + i,&dwData,4);
}
if (PciConfigPCIHeaderVendorID == 0xFFFF){
KdrPrint("Read cfg space err!\n");
return;// 无效设备
}
else
{
KdrPrint("bus: %d dev : %d fn : %d \n",bus, dev, fn);
KdrPrint("%x %x \n", PciConfigPCIHeaderVendorID, PciConfigPCIHeaderDeviceID);
}
}
///////////////////////////////////////////////////////////////////////////////////
以上就是关于编写win64驱动wdf环境下如何访问PCI的配置空间全部的内容,包括:编写win64驱动wdf环境下如何访问PCI的配置空间、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)