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 |