Функция 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 (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

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

IoBuildPartialMdl