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


Функция 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 выполняет следующие операции:

  1. Если указанный диапазон памяти отображается в резервном хранилище (диск, сеть и т. д.), MmProbeAndLockPages делает его резидентным.
  2. Затем подпрограмма подтверждает, что страницы разрешают операцию, указанную параметром операции.
  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/за исключением. Если страницы не поддерживают указанную операцию, подпрограмма вызывает 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)

См. также

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages