Функция MmProbeAndLockPages (wdm.h)
MmProbeAndLockPages подпрограммы проверяет указанные страницы виртуальной памяти, делает их резидентными и блокирует их в памяти (например, для передачи DMA). Это гарантирует, что страницы не могут быть освобождены и перераспределены, пока драйвер устройства (или оборудование) по-прежнему использует их.
Синтаксис
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
Параметры
[in, out] MemoryDescriptorList
Указатель на MDL, указывающий буфер виртуальной памяти. Если подпрограмма успешно блокирует страницы в памяти, MDL обновляется, чтобы описать базовые физические страницы.
[in] AccessMode
Режим доступа, в котором выполняется проверка аргументов KernelMode или UserMode.
[in] Operation
Тип операции, для которой вызывающий требует проверки прав доступа и заблокированных страниц. Задайте для этого параметра значение IoReadAccess, IoWriteAccessили IoModifyAccess. IoReadAccess указывает, что драйвер может проверить содержимое буфера, но не может изменить содержимое. IoWriteAccess и IoModifyAccess, которые эквивалентны, указывают, что драйвер имеет доступ на чтение и запись в буфер.
Возвращаемое значение
Никакой
Замечания
Драйвер верхнего уровня в цепочке многоуровневых драйверов, использующих прямые вызовы операций ввода-вывода. Драйверы, использующие буферные операции ввода-вывода, никогда не вызывают MmProbeAndLockPages.
MmProbeAndLockPages выполняет следующие операции:
- Если указанный диапазон памяти отображается в резервном хранилище (диск, сеть и т. д.), MmProbeAndLockPages делает его резидентным.
- Затем подпрограмма подтверждает, что страницы разрешают операцию, указанную параметром операции.
- Если диапазон памяти разрешает указанную операцию, подпрограмма блокирует страницы в памяти, чтобы они не выстраивали страницы. Используйте процедуру MmUnlockPages для разблокировки страниц.
- Наконец, подпрограмма обновляет массив кадров страницы (PFN) в MDL, чтобы описать заблокированные физические страницы.
Если два или более многомерных выражений описывают одну и ту же физическую страницу, страница может быть заблокирована несколько раз — один раз для каждого MDL. Страница разблокируется, когда для последнего MDL задано состояние разблокировки.
Подпрограмма, например MmBuildMdlForNonPagedPool или IoBuildPartialMdl обновляет MDL, чтобы описать страницы, которые являются неразрешимыми или уже заблокированными. Вызов MmProbeAndLockPages или MmUnlockPages для блокировки или разблокировки такого MDL не допускается.
Вызовы MmProbeAndLockPages должны быть заключены в блок try/за исключением. Если страницы не поддерживают указанную операцию, подпрограмма вызывает STATUS_ACCESS_VIOLATION или другие исключения. Дополнительные сведения см. в обработке исключений.
Вызовы MmProbeAndLockPages должны выполняться в IRQL <= APC_LEVEL для страничных адресов или в IRQL <= DISPATCH_LEVEL для непагебельных адресов.
Эта подпрограмма не предоставляет никаких гарантий относительно виртуального адреса, описывающего эти страницы (т. е. виртуальный адрес может быть незамечен, повторно использован и т. д.). Однако физические страницы гарантированно будут заблокированы при успешном возвращении.
Чтобы избежать ошибок страниц, используйте VirtualLock для блокировки виртуального адреса, чтобы оно не было обрезано, если приложение не разблокирует его или явным образом освобождает его путем вызова VirtualFree или UnmapViewOfFile.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 2000. |
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |
правил соответствия DDI | HwStorPortProhibitedDIs(storport) |