Fonction IoMarkIrpPending (wdm.h)
La routine IoMarkIrpPending marque la routine 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
Aucun
Remarques
Sauf si la routine de répartition du pilote termine l’IRP (en appelant IoCompleteRequest) ou en transmettant 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 la routine de répartition appelée IoMarkIrpPending retourne.
Si un pilote met en file d’attente les adresses IRP entrantes, il doit appeler IoMarkIrpPending avant de mettre en file d’attente chaque IRP. Sinon, un IRP peut être mis en file d’attente, terminé par une autre routine de pilote et libéré par le système avant l’appel à IoMarkIrpPending se produit, provoquant ainsi un incident.
Si un pilote définit une routine IoCompletion pour un IRP, puis passe l’IRP à un pilote inférieur, la routine IoCompletion doit vérifier l’indicateur IRP->PendingReturned. Si l’indicateur est défini, la routine IoCompletion doit appeler IoMarkIrpPending avec l’IRP. 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 du pool de l’allocation suivante, car il n’existe aucun emplacement de pile pour ces pilotes.
Un pilote qui passe l’IRP, puis attend sur 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 qui pourrait 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 paramètres de IO_STACK_LOCATION de la structure et ne doit pas appeler IoMarkIrpPending.
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Bureau |
d’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(wd), MarkDevicePower(wdm), MarkingInterlockedQueuedIrps(wdm), MarkingQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm) wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm) |