Ағылшын тілінде оқу

Бөлісу құралы:


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

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

Синтаксис

C++
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 для создания irPs для запросов, отправляемых в драйверы нижнего уровня. Такой драйвер должен инициализировать IRP и установить его процедуру обратного вызова IoCompletion в IRP, поэтому вызывающий объект может удалить IRP, когда драйверы нижнего уровня завершили обработку запроса. IoAllocateIrp автоматически инициализирует члены IRP. Не используйте IoInitializeIrp для инициализации IRP до первого использования. (Вы можете использовать IoInitializeIrp для повторного использования IRP, который вы уже использовали при определенных особых обстоятельствах. Дополнительные сведения см. в статье повторное использовать irPs.) Промежуточный или самый высокий уровень драйвера также может вызывать IoBuildDeviceIoControlRequest, IoBuildAsynchronousFsdRequest или IoBuildSynchronousFsdRequest для настройки запросов, которые он отправляет в драйверы нижнего уровня. Только драйвер высокого уровня может вызывать IoMakeAssociatedIrp.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows 10 (версия 1507)
целевая платформа Всеобщий
заголовка wdm.h (include 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