Поделиться через


IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)

Запрос указывает, что стек виртуализации хочет отменить регистрацию событий Plug and Play (ранее зарегистрированных с помощью запроса IOCTL_SRIOV_ATTACH).

Основной код

IRP_MJ_DEVICE_CONTROL

Блок состояния

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

Создание запросов IOCTL в драйверах

IOCTL_SRIOV_ATTACH

WdfIoTargetSendIoctlSynchronously