本人尝试了如下操作
eStatus = WdmQueryForInterface(i_pdevinfo->PhysicalDeviceObject, &GUID_BUS_INTERFACE_STANDARD, (PINTERFACE)&pciBus, sizeof(BUS_INTERFACE_STANDARD));
if (eStatus != STATUS_SUCCESS)
{
VLOG_ERR("pciBus faild status=0x%x \r\n", eStatus);
goto skip_vf_en;
}
bytesRead = pciBus.GetBusData(pciBus.Context, PCI_WHICHSPACE_CONFIG, &pciHeader,
0, PCI_COMMON_HDR_LENGTH);
if (bytesRead != (ULONG)PCI_COMMON_HDR_LENGTH) {
goto skip_vf_en;
}
capabilityOffset = FindExtendCapability(&pciBus, &pciHeader, PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID);
VASTAI_PCI_INFO(ppcieinfo, 0, "%s() ===capabilityOffset=%d\n", __func__, capabilityOffset);
if (capabilityOffset == 0) {
goto skip_vf_en;
}
bytesRead = pciBus.GetBusData(pciBus.Context, PCI_WHICHSPACE_CONFIG, &pcieSriovCapabilities, capabilityOffset, sizeof(pcieSriovCapabilities));
if (bytesRead != sizeof(pcieSriovCapabilities)) {
LOG_ERR("GetBusData ->pcieSriovCapabilities 0x%x != 0x%x \r\n", bytesRead, sizeof(pcieSriovCapabilities));
goto skip_vf_en;
}
eStatus = WdmQueryForInterface(i_pdevinfo->PhysicalDeviceObject, &GUID_PCI_VIRTUALIZATION_INTERFACE, (PINTERFACE)&pciVirInterface, sizeof(PCI_VIRTUALIZATION_INTERFACE));
if (eStatus != STATUS_SUCCESS)
{
VLOG_ERR("pciVirInterface faild status=0x%x \r\n", eStatus);
goto skip_vf_en;
}
VASTAI_PCI_INFO(ppcieinfo, 0, "%s() pciVirInterface=0x%llx \n", __func__, pciVirInterface);
if(pciVirInterface.EnableVirtualization != NULL)
{
eStatus = pciVirInterface.EnableVirtualization(pciVirInterface.Context, pcieSriovCapabilities.NumVFs, TRUE, TRUE, TRUE);
if (!NT_SUCCESS(eStatus))
{
VLOG_ERR("EnableVirtualization faild status=0x%x \r\n", eStatus);
goto skip_vf_en;
}
}
但INF增加了VF的 deivce id后但设备管理器没有 VF显示?