编写win64驱动wdf环境下如何访问PCI的配置空间

编写win64驱动wdf环境下如何访问PCI的配置空间,第1张

给出一个解决方法

把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的配置空间、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9870139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存