Freigeben über


SRIOV_GET_RESOURCE_FOR_BAR Rückruffunktion (pcivirt.h)

Ruft die übersetzte Ressource für ein bestimmtes Basisadressregister (BAR) ab.

Syntax

SRIOV_GET_RESOURCE_FOR_BAR SriovGetResourceForBar;

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

Parameter

[in] Context

Ein Zeiger auf einen vom Treiber definierten Kontext.

[in] VfIndex

Ein nullbasierter Index der abgefragten VF.

[in] BarIndex

Der Index des Bar (zwischen 0 und 5).

[out] Resource

Ein Zeiger auf eine CM_PARTIAL_RESOURCE_DESCRIPTOR-Struktur , die mit den übersetzten Hardwareressourcen für die angegebene BAR gefüllt ist.

Rückgabewert

Gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls wird ein entsprechender NTSTATUS-Fehlercode zurückgegeben.

Hinweise

Diese Rückruffunktion wird vom Treiber der physischen Funktion (PF) implementiert. Sie wird aufgerufen, wenn das System auf die übersetzten Hardwareressourcen einer bestimmten LEISTE einer virtuellen Funktion zugreifen möchte.

Der PF-Treiber registriert seine Implementierung, indem er das GetResourceForBar-Element des SRIOV_DEVICE_INTERFACE_STANDARD festlegt, eine WDF_QUERY_INTERFACE_CONFIG-Struktur konfiguriert und WdfDeviceAddQueryInterface aufruft.

Hier sehen Sie eine Beispielimplementierung dieser Rückruffunktion.


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


Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10
Unterstützte Mindestversion (Server) Windows Server 2016
Zielplattform Windows
Kopfzeile pcivirt.h
IRQL PASSIVE_LEVEL