Synchronisation de l’annulation dans Higher-Level pilotes sans routines d’annulation
Un pilote de niveau supérieur ne peut faire aucune hypothèse quant à savoir si ou comment les pilotes de niveau inférieur existants gèrent les IRP annulables. Dès qu’un pilote de niveau supérieur appelle IoCallDriver pour un IRP, il ne possède plus cette IRP et il ne peut ni déterminer ni contrôler le traitement de l’IRP par les pilotes de niveau inférieur.
Toutefois, tout pilote de niveau supérieur peut définir une routine IoCompletion pour un IRP en appelant IoSetCompletionRoutine avant d’appeler IoCallDriver. Le pilote de niveau supérieur peut déterminer si un IRP en attente est annulé dans un pilote inférieur en appelant IoSetCompletionRoutine avec le paramètre InvokeOnCancel défini sur TRUE avant de passer l’IRP sur les pilotes inférieurs. Cela garantit que la routine IoCompletion du pilote sera appelée, que l’IRP soit annulée ou terminée.
Un pilote de niveau supérieur peut appeler IoCancelIrp avec n’importe quelle IRP en attente que le pilote a allouée. Toutefois, l’exécution de cet appel ne garantit pas que l’IRP allouée par le pilote sera terminée avec son bloc d’E/S status défini sur STATUS_CANCELLED ; un autre thread est peut-être déjà en train de terminer l’IRP. Pour case activée si l’IRP a été annulé, le pilote de niveau supérieur doit appeler IoSetCompletionRoutine avec le paramètre InvokeOnCancel défini sur TRUE avant de passer l’IRP au pilote inférieur suivant. Pour plus d’informations sur les routines d’achèvement, consultez Terminer les irps .
Un pilote de niveau supérieur ne doit pas appeler IoCancelIrp avec un IRP qu’il n’a pas alloué.