Функция 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) |