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


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

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

Синтаксис

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

Параметры

[in] SourceMdl

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

[in, out] TargetMdl

Указатель на выделенный вызывающим объектом MDL. Этот MDL должен быть достаточно большим, чтобы описать страницы в поддиапапсе, указанные в параметрах VirtualAddress и Length.

[in] VirtualAddress

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

[in] Length

Указывает длину в байтах, сопоставляемую targetMdl. Это значение в сочетании с VirtualAddress должно указывать буфер, который является правильным поддиапуном буфера, описанным в SourceMdl. Если длина равна нулю, поддиапраг для сопоставления начинается с VirtualAddress и включает оставшийся диапазон, описанный в SourceMdl.

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

None

Remarks

Эта подпрограмма создает целевой MDL, описывающий поддиапряд буфера, который описывается исходным MDL. Этот поддиаг задается параметрами VirtualAddress и Length . Параметры SourceMdl и TargetMdl указывают на исходный MDL и целевой MDL.

Драйвер может использовать IoBuildPartialMdl для разделения большого запроса на передачу на более мелкие запросы на передачу. Физические страницы, описываемые исходным MDL, должны быть заблокированы, прежде чем драйвер вызовет IoBuildPartialMdl. Как правило, исходный MDL описывает буфер в адресном пространстве пользователя, а драйвер вызывает подпрограмму MmProbeAndLockPages для блокировки страниц в этом буфере. Однако драйвер может создать исходный MDL из непагружаемой памяти, вызвав подпрограмму MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlEx или MmAllocatePagesForMdl .

При создании частичного MDL:

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

Чтобы предотвратить утечку этого нового сопоставления, драйверы должны вызвать MmPrepareMdlForReuse перед повторным использованием частичного MDL. Кроме того, подпрограмма IoFreeMdl выпускает сопоставление системного адресного пространства для частичного MDL, если такое сопоставление существует.

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

Требования

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

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

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages