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


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

Подпрограмма MmAdvanceMdl перемещает начало диапазона виртуальной памяти MDL по указанному числу байтов.

Синтаксис

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Параметры

[in, out] Mdl

Указывает MDL для продвижения.

[in] NumberOfBytes

Указывает количество байтов для продвижения начала MDL.

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

MmAdvanceMdl возвращает код NTSTATUS. Возможные возвращаемые значения:

Возвращаемый код Описание
STATUS_SUCCESS
Подпрограмма успешно продвинула начало MDL.
STATUS_INVALID_PARAMETER_2
Вызывающий объект пытался продвинуть начало MDL за последний конец.

Замечания

MmAdvanceMdl перемещает только начало диапазона адресов виртуальной памяти. Конечный адрес остается неизменным, и длина диапазона сократилась соответствующим образом.

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

Если MmAdvanceMdl выполняется переход к начальной странице, все страницы, которые mmAdvanceMdl, немедленно разблокируются, а системный виртуальный адрес, сопоставляющий MDL и адрес пользователя, также корректируются.

Использование MmAdvanceMdl может снизить производительность системы. Он должен использоваться только в том случае, если все следующие условия хранятся:

  • Драйвер более высокого уровня в собственной обработке операций ввода-вывода может выполнять только определенные запросы ввода-вывода после передачи фиксированного объема данных, но драйвер нижнего уровня передает данные только в меньших объемах. (Например, драйвер сетевого транспорта для протоколов SPX или NBT. Каждый протокол поддерживает надежную передачу сообщений для сообщений, размер которых превышает один кадр Ethernet. Драйвер транспорта может завершить только запрос на чтение такого сообщения после повторной сборки сообщения из нескольких кадров Ethernet.)
  • Драйвер более высокого уровня уже попытался и не удалось выделить новый MDL для передачи фрагмента данных из неполного запроса ввода-вывода. (Если драйвер успешно распределит новый MDL, он должен использовать MDL и IoBuildPartialMdl для выполнения запроса ввода-вывода вместо MmAdvanceMdl.)
  • Драйвер более высокого уровня должен продолжать выполняться, даже в условиях низкой памяти.
Драйверы, не удовлетворяющие этим условиям, должны вместо этого использовать подпрограмму IoBuildPartialMdl для выполнения любых частично успешных операций ввода-вывода.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно в Windows XP и более поздних версиях Windows.
целевая платформа Всеобщий
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

См. также

IoBuildPartialMdl