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


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

Подпрограмма IoAllocateMdl выделяет список дескрипторов памяти (MDL) достаточно большой для сопоставления буфера, учитывая начальный адрес и длину буфера. При необходимости эта подпрограмма связывает MDL с IRP.

Синтаксис

PMDL IoAllocateMdl(
  [in, optional]      __drv_aliasesMem PVOID VirtualAddress,
  [in]                ULONG                  Length,
  [in]                BOOLEAN                SecondaryBuffer,
  [in]                BOOLEAN                ChargeQuota,
  [in, out, optional] PIRP                   Irp
);

Параметры

[in, optional] VirtualAddress

Указатель на базовый виртуальный адрес буфера, описываемого MDL.

[in] Length

Указывает длину (в байтах) буфера, описываемого MDL. Дополнительные сведения см. в разделе "Примечания".

[in] SecondaryBuffer

Указывает, является ли буфер первичным или вторичным. Этот параметр определяет, как MDL следует связать с IRP. Все буферы, кроме первого буфера, описанного MDL в IRP, считаются вторичными буферами. Это поле должно иметь значение FALSE, если С MDL не связанА функция IRP. Дополнительные сведения см. в разделе "Примечания".

[in] ChargeQuota

Зарезервировано для системного использования. Драйверы должны задать для этого параметра значение FALSE.

[in, out, optional] Irp

Указатель на IRP, связанный с MDL. Если указатель IRP не равен NULL, выделенный MDL связывается со списком MDL указанного IRP в соответствии со значением SecondaryBuffer.

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

IoAllocateMdl возвращает указатель на MDL или, если MDL не удается выделить, возвращает значение NULL.

Комментарии

IoAllocateMdl может использоваться драйвером, которому необходимо разбить буфер на части, каждый из которых сопоставляется отдельным MDL, или сопоставить буфер, выделенный драйвером. Драйвер должен вызвать MmBuildMdlForNonPagedPool с MDL, выделенным этим вызовом, чтобы настроить MDL, описывающий буфер, выделенный драйвером, в непагружаемом пуле.

Параметр Length указывает размер буфера, который должен быть описан в MDL. В Windows Server 2003, Windows XP и Windows 2000 максимальный размер буфера в байтах, который может выделить эта подпрограмма, составляет PAGE_SIZE * (65535 — sizeof(MDL)) / sizeof(ULONG_PTR). В Windows Vista и Windows Server 2008 максимальный размер буфера составляет (2 гигабайта — PAGE_SIZE). Начиная с Windows 7 и Windows Server 2008 R2 максимальный размер буфера составляет (4 гигабайта — PAGE_SIZE).

Если параметр SecondaryBuffer имеет значение FALSE, подпрограмма обновляет Irp-MdlAddress>, указывая на новый MDL. Если SecondaryBuffer имеет значение TRUE, подпрограмма добавляет MDL в конец цепочки MDL, на которую указывает Irp-MdlAddress>.

Дополнительные сведения о списках MDL см. в разделе Использование многомерных выражений.

Требования

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

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

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool