MmProbeAndLockPages 함수(wdm.h)

MmProbeAndLockPages 루틴은 지정된 가상 메모리 페이지를 검색하고, 상주하게 하고, 메모리에 잠근다(예: DMA 전송의 경우). 이렇게 하면 디바이스 드라이버(또는 하드웨어)가 여전히 페이지를 사용하는 동안 페이지를 해제하고 다시 할당할 수 없습니다.

구문

void MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

매개 변수

[in, out] MemoryDescriptorList

가상 메모리 버퍼를 지정하는 MDL에 대한 포인터입니다. 루틴이 메모리의 페이지를 성공적으로 잠그면 기본 물리적 페이지를 설명하도록 MDL이 업데이트됩니다.

[in] AccessMode

KernelMode 또는 UserMode 인수를 검색할 액세스 모드입니다.

[in] Operation

호출자가 액세스 권한을 검색하고 페이지를 잠그려는 작업의 유형입니다. 이 매개 변수를 IoReadAccess, IoWriteAccess 또는 IoModifyAccess로 설정합니다. IoReadAccess 는 드라이버가 버퍼의 내용을 검사할 수 있지만 내용을 변경할 수 없음을 나타냅니다. 동일한 IoWriteAccessIoModifyAccess는 드라이버가 버퍼에 대한 읽기 및 쓰기 액세스 권한을 모두 가지고 있음을 나타냅니다.

반환 값

없음

설명

직접 I/O를 사용하는 계층화된 드라이버 체인의 최상위 드라이버는 이 루틴을 호출합니다. 버퍼링된 I/O를 사용하는 드라이버는 MmProbeAndLockPages를 호출하지 않습니다.

MmProbeAndLockPages는 다음 작업을 수행합니다.

  1. 지정된 메모리 범위가 백업 저장소(디스크, 네트워크 등)에 페이징되면 MmProbeAndLockPages 가 상주합니다.
  2. 그런 다음 루틴은 페이지에서 Operation 매개 변수로 지정된 작업을 허용하는지 확인합니다.
  3. 메모리 범위에서 지정한 작업을 허용하는 경우 루틴은 페이지를 페이징할 수 없도록 메모리의 페이지를 잠급니다. MmUnlockPages 루틴을 사용하여 페이지의 잠금을 해제합니다.
  4. 마지막으로 루틴은 MDL의 PFN( 페이지 프레임 번호 ) 배열을 업데이트하여 잠긴 실제 페이지를 설명합니다.
MmProbeAndLockPages를 성공적으로 호출하면 MDL의 페이지가 잠기고 MDL 구조가 잠긴 상태로 설정됩니다. 이러한 모든 호출은 페이지를 잠금 해제하고 MDL을 잠금 해제된 상태로 설정하는 MmUnlockPages 에 대한 해당 호출과 일치해야 합니다. MmProbeAndLockPages 호출이 MDL을 잠긴 상태로 설정한 후 MmUnlockPages가 MDL의 잠금을 해제하기 위해 먼저 호출될 때까지 동일한 MDL을 잠그기 위해 MmProbeAndLockPages에 대한 두 번째 호출이 허용되지 않습니다.

둘 이상의 MDL이 동일한 실제 페이지를 설명하는 경우 각 MDL에 대해 한 번씩 페이지를 여러 번 잠글 수 있습니다. 마지막 MDL이 잠금 해제됨 상태로 설정되면 페이지가 잠금 해제됩니다.

MmBuildMdlForNonPagedPool 또는 IoBuildPartialMdl과 같은 루틴은 MDL을 업데이트하여 페이지를 연결할 수 없거나 이미 잠겨 있는 페이지를 설명합니다. 이러한 MDL을 잠그거나 잠금 해제하기 위해 MmProbeAndLockPages 또는 MmUnlockPages 를 호출하는 것은 허용되지 않습니다.

MmProbeAndLockPages에 대한 호출은try/except 블록으로 묶어야 합니다. 페이지에서 지정된 작업을 지원하지 않는 경우 루틴은 STATUS_ACCESS_VIOLATION 또는 기타 예외를 발생합니다. 자세한 내용은 예외 처리를 참조하세요.

MmProbeAndLockPages의 호출자는 IRQL <= APC_LEVEL 페이지가 지정 가능한 주소의 경우 또는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다.

이 루틴은 이러한 페이지를 설명하는 가상 주소(즉, 가상 주소가 매핑 해제, 재사용 등일 수 있음)에 대한 보장을 제공하지 않습니다. 그러나 반환이 성공하면 실제 페이지가 잠기도록 보장됩니다.

페이지 오류를 방지하려면 VirtualLock 을 사용하여 가상 주소를 잠그므로 앱이 잠금을 해제하거나 VirtualFree 또는 UnmapViewOfFile을 호출하여 명시적으로 해제하지 않는 한 가상 주소가 잘리지 않도록 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하십시오.
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages