функция обратного вызова SRIOV_GET_RESOURCE_FOR_BAR (pcivirt.h)
Возвращает переведенный ресурс для определенного базового регистра адресов (BAR)
Синтаксис
SRIOV_GET_RESOURCE_FOR_BAR SriovGetResourceForBar;
NTSTATUS SriovGetResourceForBar(
[in] PVOID Context,
[in] USHORT VfIndex,
[in] USHORT BarIndex,
[out] PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource
)
{...}
Параметры
[in] Context
Указатель на контекст, определенный драйвером.
[in] VfIndex
Отсчитываемый от нуля индекс запрашиваемого VF.
[in] BarIndex
Индекс BAR (от 0 до 5).
[out] Resource
Указатель на структуру CM_PARTIAL_RESOURCE_DESCRIPTOR , заполненную преобразованными аппаратными ресурсами для указанной bar.
Возвращаемое значение
Если операция выполнена успешно, возвращается STATUS_SUCCESS. В противном случае верните соответствующий код ошибки NTSTATUS .
Комментарии
Эта функция обратного вызова реализуется драйвером физической функции (PF). Он вызывается, когда система хочет получить доступ к преобразованным аппаратным ресурсам определенной bar виртуальной функции.
Драйвер PF регистрирует свою реализацию, задавая член GetResourceForBar SRIOV_DEVICE_INTERFACE_STANDARD, настраивая структуру WDF_QUERY_INTERFACE_CONFIG и вызывая WdfDeviceAddQueryInterface.
Ниже приведен пример реализации этой функции обратного вызова.
NTSTATUS
Virtualization_GetResourceForBar(
__inout PVOID Context,
__in USHORT VfIndex,
__in USHORT BarIndex,
__out PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource
)
{
PDEVICE_CONTEXT deviceContext;
PAGED_CODE();
deviceContext = (PDEVICE_CONTEXT)Context;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INTERFACE,
"Virtualization_GetResourceForBar received with"
"VFIndex = %d, BarIndex = %d\n",
VfIndex, BarIndex);
NT_ASSERT(BarIndex < PCI_TYPE0_BAR_COUNT);
if(VfIndex >= deviceContext->NumVFs)
{
NT_ASSERT(FALSE);
return STATUS_INVALID_DEVICE_REQUEST;
}
//
// Copy the descriptor for all VFs at the given Bar index
// to the output descriptor.
//
*Resource = deviceContext->AssignedVfBarResources[BarIndex];
if(Resource->Type == CmResourceTypeMemory ||
Resource->Type == CmResourceTypeMemoryLarge)
{
NT_ASSERT((Resource->u.Memory.Length % deviceContext->NumVFs) == 0);
Resource->u.Memory.Length /= deviceContext->NumVFs;
Resource->u.Memory.Start.QuadPart += (Resource->u.Memory.Length * VfIndex);
}
return STATUS_SUCCESS;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 |
Минимальная версия сервера | Windows Server 2016 |
Целевая платформа | Windows |
Header | pcivirt.h |
IRQL | PASSIVE_LEVEL |