Функция 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/за исключением. Из-за этого рекомендуется, чтобы драйверы не использовали эту функцию. Дополнительные сведения см. в обработке исключений.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntddk.h (include Ntddk.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
правил соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm) |