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

Подпрограмма IoAllocateIrp выделяет IRP, учитывая количество расположений стека ввода-вывода для каждого драйвера, размещенного в вызывающем объекте, и при необходимости для вызывающего объекта. См. также IoAllocateIrpEx.

Синтаксис

PIRP IoAllocateIrp(
  [in] CCHAR   StackSize,
  [in] BOOLEAN ChargeQuota
);

Параметры

[in] StackSize

Указывает количество расположений стека ввода-вывода, выделяемых для IRP. Это значение должно быть по крайней мере равно StackSize объекта устройства следующего ниже драйвера, но может быть на одно больше этого значения. Вызывающий драйвер не должен выделять расположение стека в IRP для себя.

[in] ChargeQuota

Если задать значение TRUE , память, выделенная для IRP, будет взиматься по квоте для текущего процесса. Промежуточные драйверы должны иметь значение FALSE . Значение TRUE может быть установлено только драйверами самого высокого уровня, которые вызываются в контексте потока, который является источником запроса ввода-вывода, для которого драйвер выделяет другое IRP.

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

IoAllocateIrp возвращает указатель на IRP, выделенный из непагрегированного системного пространства, или значение NULL , если IRP не удалось выделить.

Комментарии

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

Драйвер среднего или высшего уровня может вызвать IoAllocateIrp , чтобы создать IRP для запросов, отправляемых драйверам более низкого уровня. Такой драйвер должен инициализировать IRP и задать свою подпрограмму IoCompletion в создаваемом им IRP, чтобы вызывающий объект смог удалить IRP после завершения обработки запроса драйверами более низкого уровня.

IoAllocateIrp автоматически инициализирует члены IRP. Не используйте IoInitializeIrp для инициализации IRP перед его первым использованием. ( IoInitializeIrp можно использовать для повторного использования IRP, который вы уже использовали при определенных особых обстоятельствах. Дополнительные сведения см. в разделе Повторное использовать IRP .)

Драйвер среднего или самого высокого уровня также может вызывать IoBuildDeviceIoControlRequest, IoBuildAsynchronousFsdRequest или IoBuildSynchronousFsdRequest для настройки запросов, отправляемых драйверам более низкого уровня. Только драйвер самого высокого уровня может вызывать IoMakeAssociatedIrp.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI ForwardedAtBadIrqlAllocate(wdm), HwStorPortProhibitedDIs(storport), IoAllocateComplete(wdm), IoAllocateForward(wdm), IoAllocateFree(wdm), IoAllocateIrpSignalEventInCompletion(wdm), IoAllocateIrpSignalEventInCompletion2(wdm), IoAllocateIrpSignalEventInCompletion3(wdm), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoFreeIrp(storport), IoReuseIrp(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), SpNoWait(storport), StorPortStartIo(storport)

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

IO_STACK_LOCATION

IRP

IoAllocateIrpEx

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine