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


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

IoAllocateIrpEx выделяет IRP из системного пула, возможно, с расширением IRP.

Синтаксис

PIRP IoAllocateIrpEx(
  PDEVICE_OBJECT DeviceObject,
  CCHAR          StackSize,
  BOOLEAN        ChargeQuota
);

Параметры

DeviceObject

Указатель на объект устройства для проверка, чтобы определить, следует ли добавить пространство для расширения IRP. Если для DeviceObject задано значение DEVICE_WITH_IRP_EXTENSION, также выделяется пространство для расширения IRP.

StackSize

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

ChargeQuota

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

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

IoAllocateIrpEx возвращает указатель на выделенный и инициализированный IRP или NULL , если IRP не удалось выделить.

Комментарии

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

Драйвер промежуточного или высшего уровня может вызывать IoAllocateIrpEx для создания IRP для запросов, отправляемых в драйверы более низкого уровня. Такой драйвер должен инициализировать IRP и задать процедуру обратного вызова IoCompletion в создаваемой им службе IRP, чтобы вызывающий объект смог удалить IRP, когда драйверы более низкого уровня завершили обработку запроса. IoAllocateIrp автоматически инициализирует элементы IRP. Не используйте IoInitializeIrp для инициализации IRP перед его первым использованием. (IoInitializeIrp можно использовать для повторного использования IRP, который вы уже использовали при определенных особых обстоятельствах. Дополнительные сведения см. в разделе Повторное использованием IRP .) Драйвер промежуточного или верхнего уровня также может вызывать IoBuildDeviceIoControlRequest, IoBuildAsynchronousFsdRequest или IoBuildSynchronousFsdRequest для настройки запросов, отправляемых драйверам более низкого уровня. Только драйвер самого высокого уровня может вызывать IoMakeAssociatedIrp.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 10 (версия 1507)
Целевая платформа Универсальное
Верхняя часть wdm.h (включая wdm.h, ntddk.h, ntifs.h)
Библиотека ntoskrnl.lib
DLL ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

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

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompletion

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine