IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)
La demande indique que la pile de virtualisation souhaite annuler l’inscription pour Plug-and-Play événements (précédemment inscrits via la demande de IOCTL_SRIOV_ATTACH).
Code principal
Bloc d’état
Irp->IoStatus.Status est défini sur STATUS_SUCCESS si la demande réussit. Sinon, Status indique la condition d’erreur appropriée en tant que code NTSTATUS .
Remarques
Cette requête IOCTL est envoyée par la pile de virtualisation au pilote PCI Express SR-IOV Physical Function (PF) qui expose GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.
À partir de là, le PF ne doit pas s’attendre à recevoir des demandes IOCTL_SRIOV_EVENT_COMPLETE et IOCTL_SRIOV_NOTIFICATION .
Le conducteur qui doit cesser d’attendre IOCTL_SRIOV_EVENT_COMPLETE. Si le pilote est en attente, il doit cesser d’attendre et continuer à traiter Plug-and-Play IRPs.
Dans cet exemple de gestion de la demande IOCTL_SRIOV_DETACH, le pilote PF conserve les états PnP dans son contexte d’appareil. DeviceContext-PnpRebalancing> est défini sur TRUE lorsque le pilote reçoit IRP_MN_QUERY_STOP_DEVICE et sur FALSE lorsqu’il reçoit 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;
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | pcivirt.h |
IRQL | PASSIVE_LEVEL |
Voir aussi
WdfIoTargetSendInternalIoctlSynchronously
WdfIoTargetSendInternalIoctlOthersSynchronously