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


Функция 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 (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL