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


Функция MmProtectDriverSection (wdm.h)

MmProtectDriverSection только для чтения защищает раздел загруженного драйвера с помощью служб, предоставляемых виртуальным защищенным режимом (VSM).

Синтаксис

NTSTATUS MmProtectDriverSection(
  [in] PVOID  AddressWithinSection,
  [in] SIZE_T Size,
  [in] ULONG  Flags
);

Параметры

[in] AddressWithinSection

Указатель на допустимый раздел данных, принадлежащий изображению драйвера. Раздел данных еще не должен быть исполняемым, в противном случае API завершится сбоем с STATUS_INVALID_PAGE_PROTECTION.

[in] Size

Этот параметр в настоящее время зарезервирован для будущего использования и должен иметь значение 0.

[in] Flags

Укажите флаги, управляющие операцией: MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD — используется для указания того, что драйвер по-прежнему можно выгрузить после защиты раздела.

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

MmProtectDriverSection возвращает значение NTSTATUS, указывающее результат операции:

Возвращаемое значение Описание
STATUS_SUCCESS
Операция успешно завершена, и раздел драйвера успешно защищен
STATUS_INVALID_DEVICE_STATE
В настоящее время режим виртуальной безопасности (VSM) отключен, поэтому функция не может защитить раздел драйвера.
STATUS_INVALID_PARAMETER
Указана недопустимая битовая маска флагов (или ненулевой размер).
STATUS_INVALID_PAGE_PROTECTION
Раздел драйвера, указанный адресом, содержащимся в нем, сопоставляется с недопустимой защитой (исполняемые разделы не поддерживаются)
STATUS_NOT_SUPPORTED
Указанный раздел принадлежит драйверу, который не поддерживается этим API (см. примечания).
STATUS_ACCESS_VIOLATION
Указанный раздел можно отменить или содержит пробелы, которые не поддерживаются физической памятью. Обычно это происходит, когда выравнивание разделов больше размера страницы.
STATUS_ALREADY_COMMITTED
Указанный раздел уже защищен.

Замечания

Подпрограмма защищает физическую память, резервную копию раздела драйвера, используя таблицу SLAT (перевод адресов второго уровня), управляемую VSM. Защищенная память будет доступна только для чтения для всей операционной системы. 

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

Драйверы, сопоставленные с большими страницами и драйверами сеансов, не поддерживаются API MmProtectDriverSection. Кроме того, вызывающие этот API не могут запрашивать защиту отбрасываемого раздела или раздела, содержащего IAT (таблица импорта адресов).

Обратите внимание, что если вызывающий указывает адрес, который не принадлежит ни одному загруженного образа драйвера, система завершится сбоем с ошибкой MEMORY_MANAGEMENT (тип 0x1100).

Вызывающие API MmProtectDriverSection должны выполняться в IRQL <= APC_LEVEL.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Программы предварительной оценки Windows 19548.
целевая платформа Всеобщий
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL