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 값을 반환합니다.

반환 값 Description
STATUS_SUCCESS
작업이 성공적으로 완료되었으며 드라이버 섹션이 성공적으로 보호되었습니다.
STATUS_INVALID_DEVICE_STATE
VSM(가상 보안 모드)은 현재 비활성화되어 있으므로 함수는 드라이버 섹션을 보호할 수 없습니다.
STATUS_INVALID_PARAMETER
잘못된 플래그 비트 마스크(또는 0이 아닌 크기)가 지정되었습니다.
STATUS_INVALID_PAGE_PROTECTION
드라이버에 포함된 주소로 지정된 드라이버 섹션이 잘못된 보호를 통해 매핑됩니다(실행 가능한 섹션은 지원되지 않음).
STATUS_NOT_SUPPORTED
지정된 섹션은 이 API에서 지원되지 않는 드라이버에 속합니다(설명 참조).
STATUS_ACCESS_VIOLATION
지정된 섹션은 삭제할 수 있거나 실제 메모리에서 지원하지 않는 간격을 포함합니다. 이는 일반적으로 구역 맞춤이 페이지 크기보다 큰 경우에 발생합니다.
STATUS_ALREADY_COMMITTED
지정된 섹션이 이미 보호되었습니다.

설명

루틴은 VSM에서 관리하는 SLAT 테이블(두 번째 수준 주소 변환)을 사용하여 드라이버 섹션을 지원하는 실제 메모리를 보호합니다. 보호된 메모리는 전체 운영 체제에 대해 읽기 전용으로 만들어집니다. 

섹션이 보호된 후에는 보호를 제거할 방법이 없습니다. 이는 의도적으로 수행됩니다. 이 규칙의 유일한 예외는 호출자가 MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD 플래그를 지정하는 경우입니다. 이 경우 대상 드라이버가 언로드되면 보호된 섹션이 해제되고 해제됩니다.

큰 페이지 및 세션 드라이버와 매핑된 드라이버는 MmProtectDriverSection API에서 지원되지 않습니다. 또한 이 API의 호출자는 삭제 가능한 섹션 또는 IAT(주소 테이블 가져오기)가 포함된 섹션을 보호하도록 요청할 수 없습니다.

호출자가 로드된 드라이버 이미지에 속하지 않는 주소를 지정하면 시스템이 MEMORY_MANAGEMENT 버그 검사(0x1100 유형)와 충돌합니다.

MmProtectDriverSection API의 호출자는 IRQL <= APC_LEVEL 실행되어야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 참가자 19548부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL