다음을 통해 공유


MmBuildMdlForNonPagedPool 함수(wdm.h)

MmBuildMdlForNonPagedPool 루틴은 페이지가 없는 가상 메모리 버퍼를 지정하는 MDL을 수신하고 기본 물리적 페이지를 설명하도록 업데이트합니다.

통사론

void MmBuildMdlForNonPagedPool(
  [in, out] PMDL MemoryDescriptorList
);

매개 변수

[in, out] MemoryDescriptorList

페이징되지 않은 메모리에서 가상 메모리 버퍼를 지정하는 MDL에 대한 포인터입니다. 호출자는 IoAllocateMdl 루틴을 사용하여 이 버퍼에 대한 MDL을 만들었습니다.

반환 값

없음

발언

항목에서 지정된 MDL은 비페이지 시스템 메모리 또는 잠긴 메모리의 버퍼(예: PoolType = NonPagedPool 또는 MmAllocateContiguousMemorySpecifyCache 루틴을 사용하여 ExAllocatePoolWithTag 루틴에 의해 할당된 메모리와 같이 잠겨 있는 메모리에서 버퍼를 설명해야 합니다. MmBuildMdlForNonPagedPool 기본 물리적 페이지를 설명하기 위해 MDL을 업데이트합니다.

MmBuildMdlForNonPagedPool 커널 스택에 할당된 버퍼를 설명하는 MDL과 함께 사용할 수 없습니다. 커널 스택 버퍼를 설명하는 MDL을 빌드하려면 드라이버는 MmProbeAndLockPages호출해야 합니다. 이는 커널 스택 페이지가 프로브 및 잠금되지 않는 한 거래될 수 있기 때문입니다. 이 규칙은 드라이버가 커널 스택을 페이징할 수 없음을 보장하는 경우에도 적용됩니다.

MDL에서 설명한 페이지는 이미 페이지를 처리할 수 없으며 시스템 주소 공간에 이미 매핑되어 있으므로 드라이버는 MmProbeAndLockPages 루틴을 사용하거나 MmMapLockedPagesSpecifyCache 루틴을 사용하여 추가 시스템 주소 공간 매핑을 만들어서는 안 됩니다. 마찬가지로 드라이버는 MmUnlockPages 루틴을 사용하여 페이지의 잠금을 해제하거나 MmUnmapLockedPages 루틴을 사용하여 기존 시스템 주소 공간 매핑을 해제하려고 하지 않아야 합니다. 드라이버가 MmBuildMdlForNonPagedPool에서 빌드된 MDL에서 이러한 잘못된 작업을 수행하는 경우 결과 동작이 정의되지.

MmBuildMdlForNonPagedPool 빌드된 MDL을 MmGetSystemAddressForMdlSafe 루틴에 전달할 수 있습니다. 이 경우 MmGetSystemAddressForMdlSafe 호출은 MDL에서 설명하는 버퍼의 시작 가상 주소를 반환하기만 하면 됩니다.

드라이버는 MmMapLockedPagesSpecifyCache 루틴을 사용하여 MmBuildMdlForNonPagedPool 빌드된 MDL을 사용자 가상 주소 공간에 매핑할 수 있습니다. 그러나 드라이버는 특정 보안 문제를 방지하는 방식으로 이 작업을 수행해야 합니다. 자세한 내용은 MmMapLockedPagesSpecifyCache참조하세요.

요구 사항

요구
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 보편적
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

참고 항목

exAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

mmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages