Функция 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

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

[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>.

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

Требования

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

См. также

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool