Annulation des demandes d’E/S dans UMDF
Avertissement
UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.
Les exemples UMDF 1 archivés se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.
Pour plus d’informations, consultez Prise en main avec UMDF.
L’opération d’E/S en cours d’un appareil (par exemple, une demande de lecture de plusieurs blocs à partir d’un disque) peut être annulée par une application, le système ou un pilote. Si l’opération d’E/S d’un appareil est annulée, le Gestionnaire d’E/S tente d’annuler toutes les demandes d’E/S non traitées associées à l’opération d’E/S. Les pilotes de l’appareil peuvent s’inscrire pour être avertis lorsque le Gestionnaire d’E/S tente d’annuler les demandes d’E/S, et les pilotes peuvent annuler les demandes qu’ils possèdent en les remplissant avec une status d’achèvement de HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED).
L’infrastructure gère une partie du travail d’annulation pour les pilotes basés sur l’infrastructure. Si l’opération d’E/S d’un appareil est annulée, l’infrastructure se termine, avec une status d’achèvement de HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED) , les demandes d’E/S suivantes associées à l’opération annulée :
Demandes d’E/S non remises que l’infrastructure a placées dans la file d’attente d’E/S par défaut du pilote.
Demandes d’E/S non remises que l’infrastructure a transférées vers une autre file d’attente, car le pilote a appelé IWDFIoQueue::ConfigureRequestDispatching.
Étant donné que l’infrastructure annule ces requêtes, elle ne les remet pas au pilote.
Une fois que l’infrastructure a remis une demande d’E/S au pilote, le pilote est propriétaire de la demande et l’infrastructure ne peut pas l’annuler. À ce stade, seul le pilote peut annuler la demande d’E/S, mais l’infrastructure doit informer le pilote qu’une demande doit être annulée. Les pilotes reçoivent cette notification en fournissant une fonction de rappel IRequestCallbackCancel::OnCancel .
Parfois, un pilote reçoit une demande d’E/S à partir d’une file d’attente d’E/S, mais, au lieu de traiter la demande, le pilote met la demande en file d’attente d’E/S identique ou dans une autre file d’attente d’E/S pour un traitement ultérieur. Par exemple, l’infrastructure peut remettre une demande d’E/S à l’un des gestionnaires de requêtes du pilote, et le pilote peut ensuite appeler IWDFIoRequest::ForwardToIoQueue pour placer la demande dans une autre file d’attente ou IWDFIoRequest2::Requeue pour replacer la requête dans la même file d’attente.
Dans ce cas, l’infrastructure peut annuler la demande d’E/S, car elle se trouve dans une file d’attente d’E/S. Toutefois, si le pilote a inscrit une fonction de rappel pour la file d’attente d’E/S dans laquelle réside la demande, l’infrastructure appelle la fonction de rappel, au lieu d’annuler la demande, lorsque l’opération d’E/S associée est annulée. Si le framework appelle la fonction de rappel du pilote, celui-ci doit annuler la demande.
En résumé, lorsqu’une opération d’E/S est annulée, l’infrastructure annule toujours toutes les demandes d’E/S associées qui n’ont jamais été remises au pilote. Si le pilote reçoit une requête et la met en file d’attente, l’infrastructure annule la demande (si la requête se trouve dans la file d’attente), sauf si le pilote fournit une fonction de rappel pour la file d’E/S.
Appel de MarkCancelable
Un pilote peut appeler IWDFIoRequest::MarkCancelable pour inscrire une fonction de rappel IRequestCallbackCancel::OnCancel . Si le pilote a appelé MarkCancelable et si l’opération d’E/S associée à la demande est annulée, l’infrastructure appelle la fonction de rappel OnCancel du pilote afin que le pilote puisse annuler la demande d’E/S.
Un conducteur doit appeler MarkCancelable s’il est propriétaire d’une demande pendant une période relativement longue. Par exemple, un pilote peut devoir attendre qu’un appareil réponde, ou il peut devoir attendre que les pilotes inférieurs remplissent un ensemble de demandes que le pilote a créées lorsqu’il a reçu une seule requête.
Si un pilote n’appelle pas MarkCancelable, ou si un pilote appelle IWDFIoRequest::UnmarkCancelable après avoir appelé MarkCancelable, il n’est pas au courant de l’annulation et gère donc la demande comme il le ferait généralement.
Appel d’IsCanceled
Si un pilote n’a pas appelé MarkCancelable pour inscrire une fonction de rappel OnCancel , il peut appeler IWDFIoRequest2::IsCanceled pour déterminer si le gestionnaire d’E/S a tenté d’annuler une demande d’E/S. Si IsCanceled retourne TRUE, le pilote doit annuler la demande.
Par exemple, un pilote qui reçoit une demande de lecture ou d’écriture volumineuse qu’il décompose en plusieurs demandes plus petites peut appeler IsCanceled une fois que la cible d’E/S du pilote a terminé chacune des demandes plus petites, si le pilote n’a pas appelé MarkCancelable pour la demande reçue.
Annulation de la demande
L’annulation d’une demande d’E/S peut impliquer l’un des éléments suivants :
Arrêt d’une opération d’E/S en cours.
Ne pas transférer la demande à une cible d’E/S.
Appel de IWDFIoRequest::CancelSentRequest pour tenter d’annuler une demande que le pilote avait précédemment envoyée à une cible d’E/S.
Si un pilote annule une demande d’E/S pour un objet de requête que le pilote a reçu de l’infrastructure, le pilote doit toujours terminer la demande en appelant IWDFIoRequest::Complete ou IWDFIoRequest::CompleteWithInformation, avec un paramètre CompletionStatus de HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED). (Si le pilote a appelé IWDFDevice::CreateRequest pour créer un objet de requête, le pilote appelle IWDFObject::D eleteWdfObject au lieu de terminer la demande.)