Partager via


Utilisation des routines d’achèvement IRP

Notes

Pour une fiabilité et des performances optimales, utilisez des pilotes de minifiltre de système de fichiers avec prise en charge de Filter Manager au lieu des pilotes de filtre de système de fichiers hérités. Pour porter votre pilote hérité vers un pilote minifilter, consultez Recommandations pour le portage des pilotes de filtre hérités.

Les pilotes de filtre de système de fichiers utilisent des routines d’achèvement similaires à celles utilisées par les pilotes de périphérique. Une routine d’achèvement effectue le traitement d’achèvement sur un IRP. Toute routine de pilote qui transmet une IRP au pilote de niveau inférieur suivant peut éventuellement inscrire une routine d’achèvement pour l’IRP en appelant IoSetCompletionRoutine avant d’appeler IoCallDriver.

Chaque routine d’achèvement IRP est définie comme suit :

NTSTATUS
(*PIO_COMPLETION_ROUTINE) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

Les routines d’achèvement sont appelées dans IRQL <= DISPATCH_LEVEL, dans un contexte de thread arbitraire.

Étant donné qu’elles peuvent être appelées à l’DISPATCH_LEVEL IRQL, les routines d’achèvement ne peuvent pas appeler des routines en mode noyau qui doivent être appelées à un IRQL inférieur, comme IoDeleteDevice. Pour la même raison, toutes les structures de données utilisées dans une routine d’achèvement doivent être allouées à partir d’un pool non paginé.

Cette section traite des sujets suivants :

Comment le traitement de l’achèvement est effectué

Vérification de l’indicateur PendingReturned

Retour de l’état à partir de routines d’achèvement

Exemple : Dispatch et complétion de Pass-Through simples

Contraintes sur les routines d’achèvement