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
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:
- IRP_MN_QUERY_STOP_DEVICE generiert SriovEventPfQueryStopDevice.
- IRP_MN_START_DEVICE generiert SriovEventPfRestart- nur, wenn das Gerät zur Rebalancing beendet wurde (siehe oben).
- IRP_MN_CANCEL_STOP_DEVICE generiert SriovEventPfRestart nur, wenn das Gerät zur Rebalancing beendet wurde.
- IRP_MN_QUERY_REMOVE_DEVICE generiert SriovEventPfQueryRemoveDevice.
- IRP_MN_SURPRISE_REMOVAL generiert SriovEventPfSurpriseRemoveDevice.
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