Condividi tramite


Funzione IoMarkIrpPending (wdm.h)

La routine IoMarkIrpPending contrassegna l'IRP specificato, indicando che la routine di invio di un driver ha restituito successivamente STATUS_PENDING perché è richiesta un'ulteriore elaborazione da altre routine del driver.

Sintassi

void IoMarkIrpPending(
  [in, out] PIRP Irp
);

Parametri

[in, out] Irp

Puntatore all'IRP da contrassegnare come in sospeso.

Valore restituito

nessuno

Osservazioni

A meno che la routine dispatch del driver non completi l'IRP (chiamando IoCompleteRequest) o passi l'IRP ai driver inferiori, deve chiamare IoMarkIrpPending con l'IRP. In caso contrario, il gestore di I/O tenta di completare l'IRP non appena la routine dispatch restituisce il controllo .

Dopo aver chiamato IoMarkIrpPending, la routine dispatch deve restituire STATUS_PENDING, anche se alcune routine completano l'IRP (chiamando IoCompleteRequest) prima che la routine dispatch denominata IoMarkIrpPending restituisca.

Se un driver accoda i runtime di integrazione in ingresso, deve chiamare IoMarkIrpPending prima di accodare ogni IRP. In caso contrario, un IRP potrebbe essere dequeued, completato da un'altra routine del driver e liberato dal sistema prima che si verifichi la chiamata a IoMarkIrpPending , causando così un arresto anomalo.

Se un driver imposta una routine IoCompletion per un IRP e quindi passa l'IRP a un driver inferiore, la routine IoCompletion deve controllare il flag IRP-PendingReturned>. Se il flag è impostato, la routine IoCompletion deve chiamare IoMarkIrpPending con IRP. Le routine IoCompletion non restituiscono STATUS_PENDING. Per altre informazioni, vedere Implementazione di una routine IoCompletion.

I driver che creano l'IRP e lo inviano a un altro stack non devono chiamare IoMarkIrpPending nella routine di completamento. Questa chiamata danneggia l'intestazione del pool dell'allocazione successiva perché non esiste alcuna posizione dello stack per tali driver.

Un driver che passa l'IRP e quindi attende un evento non deve contrassegnare l'IRP in sospeso. Al contrario, la routine IoCompletion deve segnalare l'evento e restituire STATUS_MORE_PROCESSING_REQUIRED.

Se il driver chiama IoSkipCurrentIrpStackLocation, prestare attenzione a non modificare la struttura IO_STACK_LOCATION in modo che possa influire involontariamente sul driver inferiore o sul comportamento del sistema rispetto a tale driver. In particolare, il driver non deve modificare l'unione dei parametri della struttura IO_STACK_LOCATION e non deve chiamare IoMarkIrpPending.

Requisiti

Requisito Valore
Piattaforma di destinazione Desktop
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL Qualsiasi livello
Regole di 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)

Vedi anche

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket