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 |