Partager via


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)

Voir aussi

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket