Função IoMarkIrpPending (wdm.h)
A rotina IoMarkIrpPending marca o IRP especificado, indicando que a rotina de expedição de um driver retornada posteriormente STATUS_PENDING porque o processamento adicional é exigido por outras rotinas de driver.
Sintaxe
void IoMarkIrpPending(
[in, out] PIRP Irp
);
Parâmetros
[in, out] Irp
Ponteiro para o IRP a ser marcado como pendente.
Valor de retorno
Nenhum
Observações
A menos que a rotina de expedição do driver conclua o IRP (chamando IoCompleteRequest) ou passe o IRP para drivers inferiores, ele deve chamar IoMarkIrpPending com o IRP. Caso contrário, o gerente de E/S tenta concluir o IRP assim que a rotina de expedição retorna o controle.
Depois de chamar IoMarkIrpPending, a rotina de expedição deve retornar STATUS_PENDING, mesmo que alguma rotina conclua o IRP (chamando IoCompleteRequest) antes da rotina de expedição que chamou IoMarkIrpPending retorna.
Se um driver enfileirar IRPs de entrada, ele deverá chamar IoMarkIrpPending antes de enfileirar cada IRP. Caso contrário, um IRP poderia ser desqueuado, concluído por outra rotina de driver e liberado pelo sistema antes da chamada para IoMarkIrpPending, causando assim uma falha.
Se um driver definir uma rotina de IoCompletion para um IRP e, em seguida, passar o IRP para um driver inferior, a rotina de IoCompletion deverá verificar o sinalizador IRP->PendingReturned. Se o sinalizador estiver definido, a rotina de IoCompletion deverá chamar IoMarkIrpPending com o IRP. rotinas de IoCompletion não retornam STATUS_PENDING. Para obter mais informações, consulte Implementando uma rotina IoCompletion.
Os drivers que criam o IRP e o enviam para outra pilha não devem chamar IoMarkIrpPending em sua rotina de conclusão. Essa chamada corromperá o cabeçalho do pool da próxima alocação porque não há nenhum local de pilha para esses drivers.
Um driver que passa o IRP e aguarda em um evento não deve marcar o IRP pendente. Em vez disso, sua rotina de IoCompletion deve sinalizar o evento e retornar STATUS_MORE_PROCESSING_REQUIRED.
Se o driver chamar IoSkipCurrentIrpStackLocation, tenha cuidado para não modificar a estrutura de IO_STACK_LOCATION de uma maneira que possa afetar involuntariamente o driver inferior ou o comportamento do sistema em relação a esse driver. Em particular, o driver não deve modificar a união de parâmetros da estrutura IO_STACK_LOCATION e não deve chamar IoMarkIrpPending.
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino | Área de trabalho |
cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Qualquer nível |
regras de conformidade de DDI | CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(w, MarkDevicePower(wdm), MarkingInterlockedQueuedIrps(wdm), MarkingQueuedIrps(wdm),MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(w, MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm) |