Функция IoMarkIrpPending (wdm.h)
Подпрограмма IoMarkIrpPending помечает указанный IRP, указывая на то, что подпрограмма диспетчеризации драйвера впоследствии вернула STATUS_PENDING поскольку другие процедуры драйвера требуют дальнейшей обработки.
Синтаксис
void IoMarkIrpPending(
[in, out] PIRP Irp
);
Параметры
[in, out] Irp
Указатель на IRP, который помечается как ожидающий.
Возвращаемое значение
None
Remarks
Если подпрограмма диспетчеризации драйвера не завершает IRP (путем вызова IoCompleteRequest) или не передает IRP в более низкие драйверы, она должна вызвать IoMarkIrpPending с IRP. В противном случае диспетчер операций ввода-вывода пытается завершить IRP, как только подпрограмма диспетчеризации возвращает управление.
После вызова IoMarkIrpPending подпрограмма диспетчеризации должна возвращать STATUS_PENDING, даже если некоторые подпрограммы завершают IRP (путем вызова IoCompleteRequest) до возврата подпрограммы диспетчеризации, которая называется IoMarkIrpPending .
Если драйвер помещает в очередь входящие irp, он должен вызвать IoMarkIrpPending , прежде чем помещать в очередь каждую IRP. В противном случае IRP может быть выведена из очереди, завершена другой подпрограммой драйвера и освобождена системой до вызова IoMarkIrpPending , что приведет к сбою.
Если драйвер задает подпрограмму IoCompletion для IRP, а затем передает IRP в более низкий драйвер, подпрограмма IoCompletion должна проверка флаг IRP-PendingReturned>. Если флаг установлен, подпрограмма IoCompletion должна вызывать IoMarkIrpPending с IRP. Процедуры IoCompletion не возвращают STATUS_PENDING. Дополнительные сведения см. в разделе Реализация процедуры IoCompletion.
Драйверы, создающие IRP и отправляющие его в другой стек, не должны вызывать IoMarkIrpPending в процедуре завершения. Этот вызов повреждает заголовок пула следующего выделения, так как расположение стека для этих драйверов отсутствует.
Драйвер, который передает IRP, а затем ожидает события, не должен помечать ожидание IRP. Вместо этого ее подпрограмма IoCompletion должна сигнализировать о событии и возвращать STATUS_MORE_PROCESSING_REQUIRED.
Если ваш драйвер вызывает IoSkipCurrentIrpStackLocation, будьте осторожны, чтобы не изменять структуру IO_STACK_LOCATION таким образом, чтобы непреднамеренно повлиять на более низкий драйвер или поведение системы в отношении этого драйвера. В частности, драйвер не должен изменять объединение параметровIO_STACK_LOCATION структуры и не должен вызывать IoMarkIrpPending.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Любой уровень |
Правила соответствия DDI | CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkInterlockedQueuedIrps(wdm), MarkQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm) |