Partager via


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)

Voir aussi

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket