função de retorno de chamada SRIOV_GET_RESOURCE_FOR_BAR (pcivirt.h)
Obtém o recurso traduzido para um BAR (Registro de Endereço Base) específico
Sintaxe
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
Um ponteiro para um contexto definido pelo driver.
[in] VfIndex
Um índice baseado em zero do VF que está sendo consultado.
[in] BarIndex
O índice da BARRA (entre 0 e 5).
[out] Resource
Um ponteiro para uma estrutura de CM_PARTIAL_RESOURCE_DESCRIPTOR preenchida com os recursos de hardware traduzidos para a BARRA especificada.
Retornar valor
Retorne STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, retorne um código de erro NTSTATUS apropriado.
Comentários
Essa função de retorno de chamada é implementada pelo driver PF (função física). Ele é invocado quando o sistema deseja acessar os recursos de hardware traduzidos de uma barra específica de uma função virtual.
O driver PF registra sua implementação definindo o membro GetResourceForBar do SRIOV_DEVICE_INTERFACE_STANDARD, configurando uma estrutura WDF_QUERY_INTERFACE_CONFIG e chamando WdfDeviceAddQueryInterface.
Aqui está um exemplo de implementação dessa função de retorno de chamada.
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 | Valor |
---|---|
Cliente mínimo com suporte | Windows 10 |
Servidor mínimo com suporte | Windows Server 2016 |
Plataforma de Destino | Windows |
Cabeçalho | pcivirt.h |
IRQL | PASSIVE_LEVEL |