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


Функция 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, которые являются эквивалентными, указывают на то, что драйвер имеет доступ как на чтение, так и на запись к буферу.

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

None

Remarks

Драйвер самого высокого уровня в цепочке многоуровневых драйверов, использующих прямой ввод-вывод, вызывает эту подпрограмму. Драйверы, использующие буферизированные операции ввода-вывода, никогда не вызывают MmProbeAndLockPages.

MmProbeAndLockPages выполняет следующие операции:

  1. Если указанный диапазон памяти выстраивается в резервное хранилище (диск, сеть и т. д.), MmProbeAndLockPages становится резидентом .
  2. Затем подпрограмма подтверждает, что страницы разрешают операцию, указанную параметром Operation .
  3. Если диапазон памяти разрешает указанную операцию, подпрограмма блокирует страницы в памяти, чтобы их нельзя было вытащить. Используйте подпрограмму MmUnlockPages , чтобы разблокировать страницы.
  4. Наконец, подпрограмма обновляет массив номеров кадров страницы (PFN) в MDL для описания заблокированных физических страниц.
Успешный вызов MmProbeAndLockPages блокирует страницы в MDL и присваивает структуре MDL заблокированное состояние. Каждый такой вызов должен соответствовать соответствующему вызову MmUnlockPages , который разблокирует страницы и устанавливает MDL в состояние разблокировано. После того как вызов MmProbeAndLockPages присваивает MDL заблокированному состоянию, второй вызов MmProbeAndLockPages для блокировки того же MDL не допускается, пока mmUnlockPages не будет сначала вызван для разблокировки MDL.

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

Такая подпрограмма, как MmBuildMdlForNonPagedPool или IoBuildPartialMdl , обновляет MDL для описания страниц, которые либо не являются страницами, либо уже заблокированы. Вызов MmProbeAndLockPages или MmUnlockPages для блокировки или разблокировки такого MDL не допускается.

Вызовы MmProbeAndLockPages должны быть заключены в блок try/except . Если страницы не поддерживают указанную операцию, подпрограмма вызывает STATUS_ACCESS_VIOLATION или другие исключения. Дополнительные сведения см. в разделе Обработка исключений.

Вызывающие серверы MmProbeAndLockPages должны выполняться по адресу IRQL <= APC_LEVEL для адресов, доступных для страниц, или в IRQL <= DISPATCH_LEVEL для адресов, не доступных для страниц.

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

Чтобы избежать ошибок страниц, используйте VirtualLock для блокировки виртуального адреса, чтобы он не обрезался, если приложение не разблокирует его или явно не освободит, вызвав VirtualFree или UnmapViewOfFile.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".
Правила соответствия DDI HwStorPortProhibitedDIs(storport)

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

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages