Partager via


IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

La demande indique que la pile de virtualisation souhaite s’inscrire aux événements Plug-and-Play reçus par l’appareil SR-IOV.

Code principal

IRP_MJ_DEVICE_CONTROL

Bloc d’état

> IoStatus.Status est défini sur STATUS_SUCCESS si la requête réussit. Sinon, état à la condition d’erreur appropriée en tant que code NTSTATUS.

Remarques

Cette demande IOCTL est envoyée par la pile de virtualisation au pilote PCI Express SR-IOV Physical Function (PF) qui expose GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.

Cette demande est dangereuse si l’appareil PF est actuellement arrêté ou arrêté pour la réécriture des ressources. Un appareil est considéré comme arrêté une fois qu’il a reçu IRP_MN_QUERY_STOP_DEVICE et redémarré lorsqu’il reçoit IRP_MN_CANCEL_STOP_DEVICE ou lorsque IRP_MN_START_DEVICE est terminé par les appareils inférieurs de la pile. Dans ce cas, le pilote doit retarder l’achèvement de cette demande jusqu’à ce que l’appareil soit redémarré.

Il n’est pas nécessaire de conserver cet IRP en attente, car la requête est toujours envoyée en tant qu’IRP en mode noyau synchrone, ce qui entraîne le blocage du thread dans tous les cas.

Une fois cette demande terminée, le fournisseur de services virtuels peut ensuite envoyer IOCTL_SRIOV_NOTIFICATION et IOCTL_SRIOV_EVENT_COMPLETE demandes.

Pour annuler l’inscription pour les événements Plug-and-Play, le fournisseur de services virtuels envoie la requête IOCTL_SRIOV_DETACH.

Ces événements (définis dans SRIOV_PF_EVENT) provoquent l’achèvement de IOCTL_SRIOV_NOTIFICATION et une attente de IOCTL_SRIOV_EVENT_COMPLETE:

Dans cet exemple de gestion de la requête IOCTL_SRIOV_ATTACH, le pilote PF gère les états PnP dans son contexte d’appareil. DeviceContext->PnpRebalancing a la valeur TRUE, lorsque le pilote reçoit IRP_MN_QUERY_STOP_DEVICE et a la valeur FALSE lorsqu’il reçoit IRP_MN_START_DEVICE.
    case IOCTL_SRIOV_ATTACH:
        TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "IOCTL_SRIOV_ATTACH:\n");

        WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);

        //
        // Block until it is safe for the VSP to attach.  Don't
        // bother with pending this IRP since this is always a sent as
        // a synchronous kernel-mode IRP and the caller would block
        // the thread anyway.  May need to repeat the wait since
        // waiting for the safe-to-attach event must not be done while
        // holding the state lock.
        //
        while (fdoContext->PnpSafeToAttach == FALSE)
        {
            WdfWaitLockRelease(fdoContext->PnpStateLock);

            KeWaitForSingleObject(&fdoContext->PnpSafeEvent,
                                  Executive,
                                  KernelMode,
                                  FALSE,
                                  NULL);

            WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);
        }

        //
        // Allow only a single attach at any time.
        //
        if (fdoContext->PnpVspAttached == FALSE)
        {
            fdoContext->PnpVspAttached = TRUE;
            status = STATUS_SUCCESS;
        }
        else
        {
            status = STATUS_SHARING_VIOLATION;
        }
        WdfWaitLockRelease(fdoContext->PnpStateLock);

        break;

Exigences

Exigence Valeur
d’en-tête pcivirt.h
IRQL PASSIVE_LEVEL

Voir aussi

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

création de requêtes IOCTL dans les pilotes

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously