다음을 통해 공유


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 를 사용하여 사용자 모드 버퍼에서 특정 경합 조건을 방지할 수 있습니다. 예를 들어 드라이버가 버퍼를 쓸 수 있는지 확인하지만 원래 사용자 모드 프로세스에서 버퍼를 읽기 전용으로 변경한 후 드라이버가 버퍼에 쓸 수 있는 경우 경합 상태가 발생할 수 있습니다. 드라이버는 PAGE_READWRITE 프로브 모드에서 MmSecureVirtualMemory 를 사용하여 드라이버가 MmUnsecureVirtualMemory를 호출할 때까지 버퍼가 쓰기 가능한 상태로 유지되도록 보장할 수 있습니다. 또한 루틴은 버퍼를 해제하는 원래 사용자 모드 프로세스로부터 보호합니다. 다음은 이러한 루틴을 호출하는 방법에 대한 몇 가지 지침입니다.

  • PAGE_READONLY 사용하여 MmSecureVirtualMemory 를 호출해도 버퍼가 읽기 전용으로 유지된다는 보장은 없습니다. 읽기 전용 프로브 모드를 사용하면 사용자가 버퍼 보호를 PAGE_NOACCESS 변경할 수 없습니다. 보호가 PAGE_READWRITE(또는 매핑된 뷰의 경우 PAGE_WRITECOPY)로 변경되는 것을 방지 하지 않습니다.

  • 드라이버가 MmSecureVirtualMemory를 호출하고 MmUnsecureVirtualMemory를 호출하지 않으면 프로세스가 종료될 때 메모리가 자동으로 보호되지 않습니다.

  • 드라이버가 MmUnsecureVirtualMemory를 호출하는 경우 메모리가 원래 보호된 프로세스의 컨텍스트와 해당 프로세스가 종료되기 전에 호출해야 합니다.

  • 일반적으로 드라이버는 메모리를 보호할 때 프로세스를 참조한 다음 나중에 KeStackAttachProcess 를 호출하여 MmUnsecureVirtualMemory를 호출하기 전에 해당 프로세스의 컨텍스트로 전환해야 합니다.

  • 프로세스 종료 드라이버를 검색하려면 PsSetCreateProcessNotifyRoutine을 사용할 수 있습니다. 또는 프로세스가 종료될 때 I/O 관리자가 호출하는 취소 루틴을 사용하여 IRP를 제출할 수 있습니다. 취소 루틴에서 드라이버는 프로세스에 연결하고 MmUnsecureVirtualMemory를 호출할 수 있습니다.

MmSecureVirtualMemory를 사용하여 사용자 메모리 읽기 또는 쓰기가 페이지 권한 부족으로 인해 예외를 발생시키지 않도록 보장할 수 있지만 다른 유형의 예외로부터 보호하지는 않습니다. 예를 들어 시스템이 페이지 파일에서 잘못된 디스크 블록을 찾을 때 발생하는 예외로부터 보호하지 않습니다. 따라서 드라이버는 여전히 try/except 블록에서 모든 사용자 메모리 액세스를 래핑해야 합니다. 이 때문에 드라이버에서 이 함수를 사용하지 않는 것이 좋습니다. 자세한 내용은 예외 처리를 참조하세요.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 ntddk.h(Ntddk.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm)

추가 정보

MmUnsecureVirtualMemory