ZwSetInformationVirtualMemory 함수(ntifs.h)
ZwSetInformationVirtualMemory 루틴은 프로세스의 사용자 주소 공간에서 지정된 주소 범위 목록에 대한 작업을 수행합니다.
통사론
NTSYSAPI NTSTATUS ZwSetInformationVirtualMemory(
[in] HANDLE ProcessHandle,
[in] VIRTUAL_MEMORY_INFORMATION_CLASS VmInformationClass,
[in] ULONG_PTR NumberOfEntries,
[in] PMEMORY_RANGE_ENTRY VirtualAddresses,
[in] PVOID VmInformation,
[in] ULONG VmInformationLength
);
매개 변수
[in] ProcessHandle
작업을 수행할 컨텍스트에서 프로세스에 대한 열린 핸들을 지정합니다. 이 핸들은 유효하지 않습니다. Ntddk.h에 정의된 NtCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다.
[in] VmInformationClass
수행할 작업의 유형을 지정합니다.
[in] NumberOfEntries
VirtualAddresses 매개 변수가 가리키는 배열의 항목 수입니다. 이 매개 변수는 0일 수 없습니다.
[in] VirtualAddresses
각 항목이 처리할 가상 주소 범위를 지정하는 MEMORY_RANGE_ENTRY 구조의 배열에 대한 포인터입니다. 가상 주소 범위는 대상 프로세스에서 액세스할 수 있는 프로세스 주소 공간의 일부를 포함할 수 있습니다.
[in] VmInformation
메모리 정보를 포함하는 버퍼에 대한 포인터입니다. 버퍼의 형식 및 콘텐츠는 지정된 정보 클래스에 따라 달라집니다.
[in] VmInformationLength
VmInformation
반환 값
ZwSetInformationVirtualMemory 성공 시 STATUS_SUCCESS 반환하거나 실패 시 적절한 NTSTATUS 오류 코드를 반환합니다.
발언
ZwSetInformationVirtualMemory 루틴은 액세스할 주소 집합을 알고 있는 드라이버에 의해 호출됩니다. 이러한 주소가 메모리에 더 이상 상주하지 않을 가능성이 있는 경우(즉, 디스크로 페이징된 경우) 액세스 전에 해당 주소 범위에서 이 루틴을 호출하면 가능한 경우 대규모의 동시 I/O 요청을 사용하여 디스크에서 해당 주소 범위를 효율적으로 가져오기 때문에 전체 대기 시간이 줄어듭니다.
ZwSetInformationVirtualMemory 사용하면 드라이버가 액세스할 프로세스 주소 범위 목록을 제공하는 경우 가능한 경우 큰 동시 I/O를 실행하여 디스크 하드웨어를 효율적으로 사용할 수 있습니다. 단일 주소 범위(예: 파일 매핑)의 경우에도 이 루틴은 페이지 오류를 통해 발급되는 많은 작은 I/O가 아닌 단일 큰 I/O를 실행하여 성능 향상을 제공할 수 있습니다.
드라이버는 성능 최적화를 위해 이 루틴을 호출합니다. 대상 주소 범위에 액세스하는 데 프리페치할 필요는 없습니다. 프리페치된 메모리는 대상 프로세스의 작업 집합에 추가되지 않습니다. 실제 메모리에 캐시됩니다. 대상 프로세스에서 프리페치된 주소 범위에 액세스하면 작업 집합에 추가됩니다.
이 호출은 드라이버의 올바른 작동에 필요하지 않으므로 시스템에서 강력한 힌트로 처리되며 메모리 부족 조건에서 완전하거나 부분적으로 실패할 수 있는 일반적인 물리적 메모리 제약 조건이 적용됩니다. 또한 큰 주소 범위로 호출되는 경우 메모리 압력을 만들 수 있으므로 애플리케이션은 실제로 사용할 주소 범위만 프리페치해야 합니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 10 버전 1511. |
대상 플랫폼 | 보편적 |
헤더 | ntifs.h(Ntddk.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL |
PASSIVE_LEVEL |
DDI 규정 준수 규칙 |
HwStorPortProhibitedDDIs, PowerIrpDDis |