Функция MmSecureVirtualMemory (ntddk.h)

Подпрограмма MmSecureVirtualMemory защищает диапазон адресов в памяти пользователя, чтобы его нельзя было освободить, а защиту страницы нельзя сделать более строгой.

Синтаксис

HANDLE MmSecureVirtualMemory(
  [in] PVOID  Address,
  [in] SIZE_T Size,
  [in] ULONG  ProbeMode
);

Параметры

[in] Address

Начало диапазона виртуальных адресов пользователя для защиты.

[in] Size

Размер диапазона виртуальных адресов для защиты (в байтах).

[in] ProbeMode

Указывает наиболее ограниченную защиту страницы, которая разрешена. Используйте PAGE_READWRITE, чтобы указать, что диапазон адресов должен оставаться доступным для чтения и записи, или используйте PAGE_READONLY, чтобы указать, что диапазон адресов должен оставаться только читаемым.

ProbeMode Значение
PAGE_READWRITE Защиту нельзя изменить на PAGE_NOACCESS или PAGE_READONLY. Все остальные изменения защиты разрешены.
PAGE_READONLY Защиту нельзя изменить на PAGE_NOACCESS. Все остальные изменения защиты разрешены.

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

При успешном выполнении MmSecureVirtualMemory возвращает непрозрачное значение указателя, которое драйвер передает в подпрограмму MmUnsecureVirtualMemory , чтобы снять с небезопасность диапазона адресов памяти. Если подпрограмме не удается защитить диапазон адресов памяти, она возвращает значение NULL.

Комментарии

MmSecureVirtualMemory можно использовать, чтобы избежать определенных условий гонки в буферах пользовательского режима. Например, если драйвер проверяет, доступен ли буфер для записи, но исходный процесс пользовательского режима изменяет буфер на доступный только для чтения, прежде чем драйвер сможет выполнить запись в буфер, может возникнуть состояние гонки. Драйвер может использовать MmSecureVirtualMemory с PAGE_READWRITE режиме пробы, чтобы обеспечить возможность записи буфера до тех пор, пока драйвер не вызовет MmUnsecureVirtualMemory. Подпрограмма также защищает от исходного процесса пользовательского режима, освобождающего буфер. Вот несколько рекомендаций по вызову этих процедур.

  • Вызов MmSecureVirtualMemory с PAGE_READONLY не гарантирует, что буфер останется только для чтения. Режим пробы только для чтения не позволяет пользователю изменить защиту буфера на PAGE_NOACCESS. Это не препятствует изменению защиты на PAGE_READWRITE (или PAGE_WRITECOPY для сопоставленных представлений).

  • Если драйвер вызывает MmSecureVirtualMemory и не вызывает MmUnsecureVirtualMemory, память автоматически не защищена при завершении процесса.

  • Если драйвер вызывает MmUnsecureVirtualMemory, он должен вызывать его в контексте процесса, в котором память была изначально защищена, и до завершения этого процесса.

  • Обычно драйверы должны ссылаться на процесс, когда они защищают память, а затем вызывают KeStackAttachProcess , чтобы переключиться на контекст этого процесса, прежде чем вызывать MmUnsecureVirtualMemory.

  • Для обнаружения драйверов завершения процесса можно использовать PsSetCreateProcessNotifyRoutine. Кроме того, процесс может отправить IRP с подпрограммой отмены, которая вызывается диспетчером ввода-вывода при завершении процесса. В процедуре отмены драйвер может подключиться к процессу и вызвать MmUnsecureVirtualMemory.

Хотя mmSecureVirtualMemory можно использовать, чтобы гарантировать, что чтение или запись памяти пользователя не вызовет исключение из-за недостатка разрешений страницы, она не защищает от других типов исключений. Например, он не защищает от исключений, возникающих при обнаружении системой в файле подкачки неправильного блока диска. Поэтому драйверы по-прежнему должны заключать все доступы пользователей к памяти в блок try/except . Поэтому рекомендуется, чтобы драйверы не использовали эту функцию. Дополнительные сведения см. в разделе Обработка исключений.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntddk.h (включая Ntddk.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm)

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

MmUnsecureVirtualMemory