Partager via


SRIOV_GET_RESOURCE_FOR_BAR fonction de rappel (pcivirt.h)

Obtient la ressource traduite pour un registre d’adresses de base spécifique (BAR)

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 du VF interrogé.

[in] BarIndex

Index de la BARRE (entre 0 et 5).

[out] Resource

Pointeur vers une structure CM_PARTIAL_RESOURCE_DESCRIPTOR remplie de ressources matérielles traduites pour la barre d’outils spécifiée.

Valeur de retour

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). Elle est appelée lorsque le système souhaite accéder aux ressources matérielles traduites d’une barre d’une fonction virtuelle particulière.

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


Exigences

Exigence Valeur
client minimum pris en charge Windows 10
serveur minimum pris en charge Windows Server 2016
plateforme cible Windows
d’en-tête pcivirt.h
IRQL PASSIVE_LEVEL