Fonction IoMarkIrpPending (wdm.h)
La routine IoMarkIrpPending marque l’IRP spécifiée, indiquant que la routine de répartition d’un pilote a ensuite retourné STATUS_PENDING car un traitement supplémentaire est requis par d’autres routines de pilote.
Syntaxe
void IoMarkIrpPending(
[in, out] PIRP Irp
);
Paramètres
[in, out] Irp
Pointeur vers l’IRP à marquer comme étant en attente.
Valeur de retour
None
Remarques
À moins que la routine de répartition du pilote termine l’IRP (en appelant IoCompleteRequest) ou passe l’IRP aux pilotes inférieurs, il doit appeler IoMarkIrpPending avec l’IRP. Sinon, le gestionnaire d’E/S tente de terminer l’IRP dès que la routine de distribution retourne le contrôle.
Après avoir appelé IoMarkIrpPending, la routine de répartition doit retourner STATUS_PENDING, même si une routine termine l’IRP (en appelant IoCompleteRequest) avant que la routine de répartition appelée IoMarkIrpPending ne retourne.
Si un pilote met en file d’attente des IRP entrants, il doit appeler IoMarkIrpPending avant de mettre en file d’attente chaque IRP. Dans le cas contraire, un IRP pourrait être mis en file d’attente, complété par une autre routine de pilote et libéré par le système avant que l’appel à IoMarkIrpPending ne se produise, provoquant ainsi un plantage.
Si un pilote définit une routine IoCompletion pour un IRP, puis transmet l’IRP à un pilote inférieur, la routine IoCompletion doit case activée l’indicateur IRP-PendingReturned>. Si l’indicateur est défini, la routine IoCompletion doit appeler IoMarkIrpPending avec l’IRP. Les routines IoCompletion ne retournent pas STATUS_PENDING. Pour plus d’informations, consultez Implémentation d’une routine IoCompletion.
Les pilotes qui créent l’IRP et l’envoient à une autre pile ne doivent pas appeler IoMarkIrpPending dans leur routine d’achèvement. Cet appel endommage l’en-tête de pool de l’allocation suivante, car il n’y a pas d’emplacement de pile pour ces pilotes.
Un pilote qui transmet l’IRP et attend ensuite un événement ne doit pas marquer l’IRP en attente. Au lieu de cela, sa routine IoCompletion doit signaler l’événement et retourner STATUS_MORE_PROCESSING_REQUIRED.
Si votre pilote appelle IoSkipCurrentIrpStackLocation, veillez à ne pas modifier la structure IO_STACK_LOCATION d’une manière susceptible d’affecter involontairement le pilote inférieur ou le comportement du système par rapport à ce pilote. En particulier, votre pilote ne doit pas modifier l’union des paramètres de la structure IO_STACK_LOCATION et ne doit pas appeler IoMarkIrpPending.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | N’importe quel niveau |
Règles de conformité DDI | CompleteRequestStatusCheck(wdm),CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkingInterlockedQueuedIrps(wdm), MarkingQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm) |