Freigeben über


IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

Die Anforderung gibt an, dass sich der Virtualisierungsstapel für Plug- und Play-Ereignisse registrieren möchte, die vom SR-IOV Gerät empfangen werden.

Hauptcode

IRP_MJ_DEVICE_CONTROL

Statusblock

Irp->IoStatus.Status auf STATUS_SUCCESS festgelegt ist, wenn die Anforderung erfolgreich ist. Andernfalls Status der entsprechenden Fehlerbedingung als NTSTATUS- Code.

Bemerkungen

Diese IOCTL-Anforderung wird vom Virtualisierungsstapel an den PCI Express SR-IOV Physical Function (PF)-Treiber gesendet, der GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE verfügbar macht.

Diese Anforderung ist unsicher, wenn das PF-Gerät zurzeit angehalten oder beendet wird, wenn die Ressource erneut ausgeglichen wird. Ein Gerät gilt als beendet, nachdem es IRP_MN_QUERY_STOP_DEVICE empfangen und neu gestartet wurde, wenn es IRP_MN_CANCEL_STOP_DEVICE empfängt oder wenn IRP_MN_START_DEVICE von den unteren Geräten im Stapel abgeschlossen wird. In diesem Fall muss der Treiber den Abschluss dieser Anforderung verzögern, bis das Gerät neu gestartet wird.

Es ist nicht erforderlich, dieses IRP ausstehen zu lassen, da die Anforderung immer als synchrones Kernelmodus-IRP gesendet wird, wodurch der Aufrufer den Thread in jedem Fall blockiert.

Nach Abschluss dieser Anforderung kann der VSP anschließend IOCTL_SRIOV_NOTIFICATION und IOCTL_SRIOV_EVENT_COMPLETE Anforderungen senden.

Um die Registrierung für Plug- und Play-Ereignisse aufzuheben, sendet der VSP die IOCTL_SRIOV_DETACH Anforderung.

Diese Ereignisse (definiert in SRIOV_PF_EVENT) verursachen den Abschluss IOCTL_SRIOV_NOTIFICATION und eine Wartezeit auf IOCTL_SRIOV_EVENT_COMPLETE:

In diesem Beispiel für die Behandlung der IOCTL_SRIOV_ATTACH Anforderung verwaltet der PF-Treiber PnP-Zustände im Gerätekontext. Das deviceContext->PnpRebalancing wird auf TRUE festgelegt, wenn der Treiber IRP_MN_QUERY_STOP_DEVICE empfängt und auf FALSE festgelegt wird, wenn er IRP_MN_START_DEVICE empfängt.
    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;

Anforderungen

Anforderung Wert
Header- pcivirt.h
IRQL- PASSIVE_LEVEL

Siehe auch

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

Erstellen von IOCTL-Anforderungen in Treibern

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously