次の方法で共有


SRIOV_GET_RESOURCE_FOR_BARコールバック関数 (pcivirt.h)

特定のベース アドレスレジスタ (BAR) の変換されたリソースを取得します。

構文

SRIOV_GET_RESOURCE_FOR_BAR SriovGetResourceForBar;

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

パラメーター

[in] Context

ドライバー定義コンテキストへのポインター。

[in] VfIndex

クエリ対象の VF の 0 から始まるインデックス。

[in] BarIndex

BAR のインデックス (0 から 5 の間)。

[out] Resource

指定した BAR の変換されたハードウェア リソースが格納されている CM_PARTIAL_RESOURCE_DESCRIPTOR 構造体へのポインター。

戻り値

操作が成功した場合は、STATUS_SUCCESSを返します。 それ以外の場合は、適切な NTSTATUS エラー コードを返します。

注釈

このコールバック関数は、物理関数 (PF) ドライバーによって実装されます。 これは、システムが仮想関数の特定の BAR の変換されたハードウェア リソースにアクセスする場合に呼び出されます。

PF ドライバーは、SRIOV_DEVICE_INTERFACE_STANDARDの GetResourceForBar メンバーを設定し、 WDF_QUERY_INTERFACE_CONFIG 構造体を構成し、 WdfDeviceAddQueryInterface を呼び出すことによって、その実装を登録します。

このコールバック関数の実装例を次に示します。


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


要件

要件
サポートされている最小のクライアント Windows 10
サポートされている最小のサーバー Windows Server 2016
対象プラットフォーム Windows
ヘッダー pcivirt.h
IRQL PASSIVE_LEVEL