WdfIoTargetStop, fonction (wdfiotarget.h)

[S’applique à KMDF et UMDF]

La méthode WdfIoTargetStop arrête l’envoi de requêtes en file d’attente à une cible d’E/S locale ou distante.

Syntaxe

void WdfIoTargetStop(
  [in] WDFIOTARGET                  IoTarget,
  [in] WDF_IO_TARGET_SENT_IO_ACTION Action
);

Paramètres

[in] IoTarget

Handle vers un objet cible d’E/S local ou distant obtenu à partir d’un appel précédent à WdfDeviceGetIoTarget ou WdfIoTargetCreate, ou à partir d’une méthode qu’une cible d’E/S spécialisée fournit.

[in] Action

Valeur WDF_IO_TARGET_SENT_IO_ACTION typée qui spécifie la façon dont l’infrastructure doit gérer les demandes d’E/S envoyées au pilote à la cible d’E/S, si la cible n’a pas terminé les demandes.

Valeur de retour

None

Remarques

Une vérification de bogue se produit si le pilote fournit un handle d’objet non valide.

Si votre pilote peut détecter des erreurs d’appareil récupérables, vous pouvez souhaiter que votre pilote appelle WdfIoTargetStop pour arrêter temporairement l’envoi de demandes, puis appeler WdfIoTargetStart pour reprendre l’envoi de demandes.

Bien qu’elle soit arrêtée, une cible d’E/S continue d’accepter de nouvelles demandes, mais ne remet pas les demandes en file d’attente au pilote approprié.

Pour plus d’informations sur les états possibles pour les cibles d’E/S, consultez Contrôle de l’état d’une cible d’E/S générale.

Si un pilote appelle WdfUsbTargetPipeConfigContinuousReader pour configurer un lecteur continu pour un canal USB, la fonction de rappel EvtDeviceD0Exit du pilote doit appeler WdfIoTargetStop pour arrêter le lecteur.

Si un pilote a appelé WdfIoTargetStop, il peut toujours envoyer une requête à la cible en définissant l’indicateur WDF_REQUEST_OPTION_IGNORE_TARGET_STATE dans la structure WDF_REQUEST_SEND_OPTIONS de la requête. Si un pilote définit cet indicateur, le pilote peut envoyer une requête, telle qu’une demande pour réinitialiser un canal USB (voir WdfUsbTargetPipeResetSynchronously), à un appareil une fois que le pilote a appelé WdfIoTargetStop.

Lorsqu’un pilote appelle WdfIoTargetStop, l’infrastructure ne tente pas d’annuler ou d’attendre les requêtes d’E/S qui ont été envoyées précédemment à la cible à l’aide de l’indicateur WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE ou de l’indicateur de WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET dans la structure WDF_REQUEST_SEND_OPTIONS de la requête.

Votre pilote doit appeler WdfIoTargetStart et WdfIoTargetStop de manière synchrone. Une fois que le pilote appelle l’une de ces fonctions, elle ne doit pas appeler une fonction avant que le premier appel ne retourne.

Votre pilote peut appeler WdfIoTargetStop plusieurs fois à partir d’un thread unique sans appeler WdfIoTargetStart. Par exemple, votre pilote peut effectuer les opérations suivantes :

  1. Appelez WdfIoTargetStop et spécifiez une valeur Action de WdfIoTargetLeaveSentIoPending.
  2. Déterminez si la cible doit reprendre le traitement des demandes d’E/S.
  3. Si la cible doit reprendre, appelez WdfIoTargetStart. Sinon, appelez WdfIoTargetStop avec une valeur Action de WdfIoTargetCancelSentIo.
Notezque WdfIoTargetStop n’est pas thread sécurisé. Il n’est pas sûr d’appeler WdfIoTargetStop simultanément à partir de différents threads.
 
Pour plus d’informations sur les cibles d’E/S, consultez Utilisation des cibles d’E/S.

Si le pilote a appelé WdfUsbTargetPipeConfigContinuousReader pour le canal, WdfIoTargetStop doit être appelé à IRQL = PASSIVE_LEVEL.

Si le pilote n’a pas appelé WdfUsbTargetPipeConfigContinuousReader et si le paramètre Action de WdfIoTargetStop est WdfIoTargetLeaveSentIoPending, WdfIoTargetStop peut être appelé à IRQL <= DISPATCH_LEVEL. Sinon, WdfIoTargetStop est appelé à IRQL = PASSIVE_LEVEL.

Exemples

L’exemple de code suivant montre comment une fonction de rappel EvtDeviceD0Exit peut appeler WdfIoTargetStop, si le pilote utilise un lecteur continu pour un canal USB.

NTSTATUS
MyEvtDeviceD0Exit(
    IN  WDFDEVICE Device,
    IN  WDF_POWER_DEVICE_STATE TargetState
)
{
    PDEVICE_CONTEXT  pDeviceContext;
    pDeviceContext = GetMyDeviceContext(Device);

    WdfIoTargetStop(
                    WdfUsbTargetPipeGetIoTarget(pDeviceContext->InterruptPipe),
                    WdfIoTargetCancelSentIo
                    );

    return STATUS_SUCCESS;
}

Configuration requise

   
Plateforme cible Universal
Version KMDF minimale 1.0
Version UMDF minimale 2,0
En-tête wdfiotarget.h (include Wdf.h)
Bibliothèque Wdf01000.sys (KMDF) ; WUDFx02000.dll (UMDF)
IRQL Consultez la section Remarques.
Règles de conformité DDI DriverCreate(kmdf), FailD0EntryIoTargetState(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Voir aussi

EvtDeviceD0Exit

WDF_REQUEST_SEND_OPTIONS

WdfDeviceGetIoTarget

WdfIoTargetCreate

WdfIoTargetStart

WdfUsbTargetPipeConfigContinuousReader

WdfUsbTargetPipeResetSynchronously