Compartir a través de


IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)

La solicitud indica que la pila de virtualización quiere anular el registro de los eventos Plug and Play (registrados anteriormente a través de la solicitud de IOCTL_SRIOV_ATTACH).

Código principal

IRP_MJ_DEVICE_CONTROL

Bloque de estado

Irp->ioStatus.Status se establece en STATUS_SUCCESS si la solicitud se realiza correctamente. De lo contrario, Estado indica la condición de error adecuada como código NTSTATUS.

Observaciones

La pila de virtualización envía esta solicitud IOCTL al controlador pci Express SR-IOV función física (PF) que expone GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.

A partir de aquí, el PF no debe esperar recibir solicitudes de IOCTL_SRIOV_EVENT_COMPLETE y IOCTL_SRIOV_NOTIFICATION.

Controlador que debe dejar de esperar IOCTL_SRIOV_EVENT_COMPLETE. Si el controlador está esperando actualmente debe dejar de esperar y continuar procesando IRP plug and Play.

En este ejemplo, el control de la solicitud de IOCTL_SRIOV_DETACH, el controlador PF mantiene los estados PnP en su contexto de dispositivo. DeviceContext->PnpRebalancing se establece en TRUE, cuando el controlador recibe IRP_MN_QUERY_STOP_DEVICE y se establece en FALSE cuando recibe 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;



Requisitos

Requisito Valor
encabezado de pcivirt.h
irQL PASSIVE_LEVEL

Consulte también

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

crear solicitudes IOCTL en controladores

IOCTL_SRIOV_ATTACH

WdfIoTargetSendIoctlSynchronously