IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)
Запрос указывает, что стек виртуализации хочет отменить регистрацию событий Plug and Play (ранее зарегистрированных с помощью запроса IOCTL_SRIOV_ATTACH).
Основной код
Блок состояния
Irp->IoStatus.Status имеет значение STATUS_SUCCESS, если запрос выполнен успешно. В противном случае состояние указывает соответствующее условие ошибки в виде кода NTSTATUS .
Комментарии
Этот запрос IOCTL отправляется стеком виртуализации драйверу физических функций PCI Express SR-IOV, который предоставляет GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.
С этого момента PF не должен ожидать получения IOCTL_SRIOV_EVENT_COMPLETE и IOCTL_SRIOV_NOTIFICATION запросов.
Драйвер, который должен перестать ждать IOCTL_SRIOV_EVENT_COMPLETE. Если драйвер в настоящее время ожидает, он должен прекратить ожидание и продолжить обработку Plug and Play IRP.
В этом примере обработки запроса IOCTL_SRIOV_DETACH драйвер PF поддерживает состояния PnP в контексте устройства. Для deviceContext-PnpRebalancing> задано значение TRUE, когда драйвер получает IRP_MN_QUERY_STOP_DEVICE , и значение FALSE при получении IRP_MN_START_DEVICE.
case IOCTL_SRIOV_DETACH:
WdfWaitLockAcquire(deviceContext->PnpStateLock, NULL);
deviceContext->PnpVspAttached = FALSE;
if (deviceContext->PnpRebalancing != FALSE)
{
//
// Any new client (VSP state machine) will not know about
// the current rebalance is it should block attach until
// rebalance is over.
//
deviceContext>PnpSafeToAttach = FALSE;
KeClearEvent(&deviceContext>PnpSafeEvent);
}
//
// Unblock the PnP thread if it waiting for an IO control from the
// client as the client just detached.
//
deviceContext->PnpEventStatus = STATUS_SUCCESS;
KeSetEvent(&deviceContext->PnpUnblockEvent, IO_NO_INCREMENT, FALSE);
WdfWaitLockRelease(deviceContext->PnpStateLock);
status = STATUS_SUCCESS;
break;
Требования
Требование | Значение |
---|---|
Заголовок | pcivirt.h |
IRQL | PASSIVE_LEVEL |
См. также раздел
WdfIoTargetSendInternalIoctlSynchronously
WdfIoTargetSendInternalIoctlOthersSynchronously