Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Возвращает преобразованный ресурс для определенного базового регистра адресов (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, запрашиваемый.
[in] BarIndex
Индекс bar (от 0 до 5).
[out] Resource
Указатель на структуру CM_PARTIAL_RESOURCE_DESCRIPTOR, заполненную преобразованными аппаратными ресурсами для указанной панели.
Возвращаемое значение
Возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае верните соответствующий код ошибки NTSTATUS.
Замечания
Эта функция обратного вызова реализуется драйвером физической функции (PF). Он вызывается, когда система хочет получить доступ к преобразованным аппаратным ресурсам определенной панели виртуальной функции.
Драйвер PF регистрирует свою реализацию, задав элемент GetResourceForBar SRIOV_DEVICE_INTERFACE_STANDARD, настроив структуру 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 |
| целевая платформа | Виндоус |
| заголовка | pcivirt.h |
| IRQL | PASSIVE_LEVEL |