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


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

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

Никакой

Замечания

Эта подпрограмма создает целевой MDL,описывающий подранг буфера, описывающий исходный MDL. Этот подранг указывается параметрами virtualAddress и length. Параметры SourceMdl и TargetMdl TargetM dl указывают на исходный 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, если такое сопоставление существует.

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

Требования

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