SRIOV_GET_RESOURCE_FOR_BAR fonction de rappel (pcivirt.h)
Obtient la ressource traduite pour un registre d’adresses de base (BAR) spécifique
Syntaxe
SRIOV_GET_RESOURCE_FOR_BAR SriovGetResourceForBar;
NTSTATUS SriovGetResourceForBar(
[in] PVOID Context,
[in] USHORT VfIndex,
[in] USHORT BarIndex,
[out] PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource
)
{...}
Paramètres
[in] Context
Pointeur vers un contexte défini par le pilote.
[in] VfIndex
Index de base zéro de la VF interrogée.
[in] BarIndex
Index du bar (entre 0 et 5).
[out] Resource
Pointeur vers une structure de CM_PARTIAL_RESOURCE_DESCRIPTOR qui est remplie avec les ressources matérielles traduites pour le bar spécifié.
Valeur retournée
Retournez STATUS_SUCCESS si l’opération réussit. Sinon, retournez un code d’erreur NTSTATUS approprié.
Remarques
Cette fonction de rappel est implémentée par le pilote de fonction physique (PF). Il est appelé lorsque le système souhaite accéder aux ressources matérielles traduites d’une barre d’accès spécifique d’une fonction virtuelle.
Le pilote PF inscrit son implémentation en définissant le membre GetResourceForBar du SRIOV_DEVICE_INTERFACE_STANDARD, en configurant une structure WDF_QUERY_INTERFACE_CONFIG et en appelant WdfDeviceAddQueryInterface.
Voici un exemple d’implémentation de cette fonction de rappel.
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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 |
Serveur minimal pris en charge | Windows Server 2016 |
Plateforme cible | Windows |
En-tête | pcivirt.h |
IRQL | PASSIVE_LEVEL |