функция обратного вызова 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, заполненную преобразованными аппаратными ресурсами для указанной панели.

Возвращаемое значение

Возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае верните соответствующий код ошибки NTSTATUS.

Замечания

Эта функция обратного вызова реализуется драйвером физической функции (PF). Он вызывается, когда система хочет получить доступ к преобразованным аппаратным ресурсам определенной панели виртуальной функции.

Драйвер 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
целевая платформа Виндоус
заголовка pcivirt.h
IRQL PASSIVE_LEVEL