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


Функция IoSkipCurrentIrpStackLocation (wdm.h)

Макрос IoSkipCurrentIrpStackLocation изменяет указатель на массив IO_STACK_LOCATION системы, чтобы, когда текущий драйвер вызывает следующий драйвер ниже, этот драйвер получает ту же IO_STACK_LOCATION структуру, что и текущий драйвер.

Синтаксис

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

Параметры

[in, out] Irp

Указатель на IRP.

Возвращаемое значение

None

Remarks

Когда ваш драйвер отправляет IRP следующему ниже драйверу, ваш драйвер может вызвать IoSkipCurrentIrpStackLocation , если вы не планируете предоставлять подпрограмму IoCompletion (адрес которой хранится в структуре IO_STACK_LOCATION драйвера). При вызове IoSkipCurrentIrpStackLocation перед вызовом IoCallDriver драйвер следующего уровня получит те же IO_STACK_LOCATION , что и ваш драйвер.

Если вы планируете предоставить подпрограмму IoCompletion для IRP, драйвер должен вызывать IoCopyCurrentIrpStackLocationToNext вместо IoSkipCurrentIrpStackLocation. Если неправильно написанный драйвер допустит ошибку, вызвав IoSkipCurrentIrpStackLocation , а затем задав подпрограмму завершения, этот драйвер может перезаписать подпрограмму завершения, заданную драйвером над ней.

Если драйвер настроил IRP, драйвер не должен вызывать IoSkipCurrentIrpStackLocation , прежде чем он передает IRP следующему более низкому драйверу. Если драйвер вызывает IoSkipCurrentIrpStackLocation в задаваемом IRP перед передачей его следующему драйверу более низкого уровня, флаг SL_PENDING_RETURNED по-прежнему устанавливается в элементе Control расположения стека ввода-вывода для следующего драйвера. Так как следующий драйвер владеет этим расположением стека и может изменить его, он потенциально может снять флаг ожидания. Такая ситуация может привести к тому, что операционная система выдает ошибку проверка или обработка IRP никогда не будет завершена.

Вместо этого драйвер, который настроил IRP, должен вызвать IoCopyCurrentIrpStackLocationToNext , чтобы настроить новое расположение стека для следующего более низкого драйвера, прежде чем вызывать IoCallDriver.

Если ваш драйвер вызывает IoSkipCurrentIrpStackLocation, будьте осторожны, чтобы не изменять структуру IO_STACK_LOCATION таким образом, чтобы непреднамеренно повлиять на более низкий драйвер или поведение системы в отношении этого драйвера. Например, изменение объединения параметровIO_STACK_LOCATION структуры или вызов IoMarkIrpPending.

Требования

Требование Значение
Минимальная версия клиента Windows 2000
Верхняя часть wdm.h
IRQL Любой уровень