SRIOV_GET_RESOURCE_FOR_BAR función de devolución de llamada (pcivirt.h)

Obtiene el recurso traducido para un registro de direcciones base (BAR) específico.

Sintaxis

SRIOV_GET_RESOURCE_FOR_BAR SriovGetResourceForBar;

NTSTATUS SriovGetResourceForBar(
  [in]  PVOID Context,
  [in]  USHORT VfIndex,
  [in]  USHORT BarIndex,
  [out] PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource
)
{...}

Parámetros

[in] Context

Puntero a un contexto definido por el controlador.

[in] VfIndex

Índice de base cero del VF que se está consultando.

[in] BarIndex

Índice de la BARRA (entre 0 y 5).

[out] Resource

Puntero a una estructura de CM_PARTIAL_RESOURCE_DESCRIPTOR que se rellena con los recursos de hardware traducidos para la barra especificada.

Valor devuelto

Devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, devuelve un código de error NTSTATUS adecuado.

Comentarios

Este controlador de función física (PF) implementa esta función de devolución de llamada. Se invoca cuando el sistema quiere acceder a los recursos de hardware traducidos de una barra determinada de una función virtual.

El controlador PF registra su implementación estableciendo el miembro GetResourceForBar del SRIOV_DEVICE_INTERFACE_STANDARD, configurando una estructura de WDF_QUERY_INTERFACE_CONFIG y llamando a WdfDeviceAddQueryInterface.

Esta es una implementación de ejemplo de esta función de devolución de llamada.


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;
}


Requisitos

Requisito Value
Cliente mínimo compatible Windows 10
Servidor mínimo compatible Windows Server 2016
Plataforma de destino Windows
Encabezado pcivirt.h
IRQL PASSIVE_LEVEL