Функция MmAdvanceMdl (wdm.h)
Подпрограмма MmAdvanceMdl перемещает начало диапазона виртуальной памяти MDL по указанному числу байтов.
Синтаксис
NTSTATUS MmAdvanceMdl(
[in, out] PMDL Mdl,
[in] ULONG NumberOfBytes
);
Параметры
[in, out] Mdl
Указывает MDL для продвижения.
[in] NumberOfBytes
Указывает количество байтов для продвижения начала MDL.
Возвращаемое значение
MmAdvanceMdl возвращает код NTSTATUS. Возможные возвращаемые значения:
Возвращаемый код | Описание |
---|---|
|
Подпрограмма успешно продвинула начало MDL. |
|
Вызывающий объект пытался продвинуть начало MDL за последний конец. |
Замечания
MmAdvanceMdl перемещает только начало диапазона адресов виртуальной памяти. Конечный адрес остается неизменным, и длина диапазона сократилась соответствующим образом.
Драйвер более высокого уровня может использовать MmAdvanceMdl в условиях низкой памяти, когда драйвер нижнего уровня может частично завершить запрос на чтение и запись. Драйвер более высокого уровня может использовать MmAdvanceMdl для перехода к части буфера, который уже был прочитан или записан, а затем повторно запустите IRP для завершения запроса. (Драйвер, конечно, может повторять этот процесс столько раз, сколько необходимо.)
Если MmAdvanceMdl выполняется переход к начальной странице, все страницы, которые mmAdvanceMdl, немедленно разблокируются, а системный виртуальный адрес, сопоставляющий MDL и адрес пользователя, также корректируются.
Использование MmAdvanceMdl может снизить производительность системы. Он должен использоваться только в том случае, если все следующие условия хранятся:
- Драйвер более высокого уровня в собственной обработке операций ввода-вывода может выполнять только определенные запросы ввода-вывода после передачи фиксированного объема данных, но драйвер нижнего уровня передает данные только в меньших объемах. (Например, драйвер сетевого транспорта для протоколов SPX или NBT. Каждый протокол поддерживает надежную передачу сообщений для сообщений, размер которых превышает один кадр Ethernet. Драйвер транспорта может завершить только запрос на чтение такого сообщения после повторной сборки сообщения из нескольких кадров Ethernet.)
- Драйвер более высокого уровня уже попытался и не удалось выделить новый MDL для передачи фрагмента данных из неполного запроса ввода-вывода. (Если драйвер успешно распределит новый MDL, он должен использовать MDL и IoBuildPartialMdl для выполнения запроса ввода-вывода вместо MmAdvanceMdl.)
- Драйвер более высокого уровня должен продолжать выполняться, даже в условиях низкой памяти.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно в Windows XP и более поздних версиях Windows. |
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |