Поделиться через


Функция 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)

См. также раздел

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket