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) |