Partager via


Répartition des IRPs vers les files d’attente d’E/S

[S’applique à KMDF et UMDF]

Un pilote basé sur l’infrastructure peut spécifier dynamiquement une file d’attente cible pour un IRP entrant. Pour distribuer un IRP à une file d’attente spécifique, un pilote doit appeler la méthode WdfDeviceWdmDispatchIrpToIoQueue .

En règle générale, un pilote appelle WdfDeviceWdmDispatchIrpToIoQueue à partir de sa fonction de rappel EvtDeviceWdmIrpPreprocess ou EvtDeviceWdmIrpDispatch . Pour de meilleures performances, la plupart des pilotes ne fournissent pas les deux fonctions de rappel.

Note Un pilote UMDF peut fournir une fonction de rappel EvtDeviceWdmIrpDispatch , mais seuls les pilotes KMDF peuvent fournir EvtDeviceWdmIrpPreprocess.

Si votre pilote fournit déjà EvtDeviceWdmIrpPreprocess, vous pouvez l’utiliser pour sélectionner dynamiquement une file d’attente. Si ce n’est pas le cas, fournissez EvtDeviceWdmIrpDispatch et appelez WdfDeviceWdmDispatchIrpToIoQueue à partir de cette fonction de rappel.

En outre, vous devez être conscient des éléments suivants :

Répartition des irps non prétraités

Pour distribuer des IRPs à partir de la fonction de rappel EvtDeviceWdmIrpDispatch d’un pilote, procédez comme suit :

  1. À partir de sa fonction de rappel EvtDriverDeviceAdd , le pilote appelle WdfDeviceConfigureWdmIrpDispatchCallback pour inscrire une fonction de rappel EvtDeviceWdmIrpDispatch .

    Si la cible est la file d’E/S de l’appareil parent, un pilote KMDF doit appeler WdfPdoInitAllowForwardingRequestToParent avant d’appeler WdfDeviceCreate. Si un pilote KMDF a également fourni une fonction de rappel EvtDeviceWdmIrpPreprocess , l’infrastructure appelle d’abord cette fonction lorsqu’un IRP arrive. Une fois que la fonction de rappel a prétraité la demande, elle appelle WdfDeviceWdmDispatchPreprocessedIrp pour renvoyer l’IRP à l’infrastructure.

  2. L’infrastructure appelle la fonction de rappel EvtDeviceWdmIrpDispatch du pilote.

  3. À partir d’EvtDeviceWdmIrpDispatch, le pilote peut appeler WdfDeviceWdmDispatchIrpToIoQueue ou WdfDeviceWdmDispatchIrp, mais pas les deux. Un pilote KMDF a la possibilité supplémentaire d’appeler l’une ou l’autre de ces méthodes et de terminer l’IRP ou de la marquer en attente.

  4. Si un pilote KMDF a défini l’indicateur WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK et n’a pas activé la progression vers l’avant garantie pour la file d’attente d’E/S cible, l’infrastructure appelle le evtIoInCallerContext du pilote, s’il est fourni. Après le prétraitement de la demande, la fonction de rappel doit la mettre en file d’attente en appelant WdfDeviceEnqueueRequest ou la terminer en appelant WdfRequestComplete.

Répartition des irps prétraités

Pour distribuer des IRPs à partir de la fonction de rappel EvtDeviceWdmIrpPreprocess d’un pilote vers une file d’E/S spécifique, procédez comme suit :

  1. Le pilote inscrit une fonction de rappel EvtDeviceWdmIrpPreprocess en appelant WdfDeviceInitAssignWdmIrpPreprocessCallback.
  2. Le pilote appelle WdfPdoInitAllowForwardingRequestToParent si la cible est la file d’E/S de l’appareil parent.
  3. À partir d’EvtDeviceWdmIrpPreprocess, appelez WdfDeviceWdmDispatchIrpToIoQueue avec flags définis sur WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP.
  4. Si le pilote a défini l’indicateur WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK et n’a pas activé la progression vers l’avant garantie pour la file d’attente d’E/S cible, l’infrastructure appelle le evtIoInCallerContext du pilote, s’il est fourni. Une fois que la fonction de rappel a terminé le prétraitement de la demande, elle doit la mettre en file d’attente en appelant WdfDeviceEnqueueRequest ou la terminer en appelant WdfRequestComplete.