ZwFreeVirtualMemory 함수(ntifs.h)

ZwFreeVirtualMemory 루틴은 지정된 프로세스의 가상 주소 공간 내에 있는 페이지 영역을 해제하거나, 커밋을 해제하거나, 둘 다 해제합니다.

구문

NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
  [in]      HANDLE  ProcessHandle,
  [in, out] PVOID   *BaseAddress,
  [in, out] PSIZE_T RegionSize,
  [in]      ULONG   FreeType
);

매개 변수

[in] ProcessHandle

해제할 페이지가 있는 컨텍스트의 프로세스에 대한 핸들입니다. Ntddk.h에 정의된 NtCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다.

[in, out] BaseAddress

페이지의 해제된 영역의 가상 주소를 수신할 변수에 대한 포인터입니다.

MEM_RELEASE 플래그가 FreeType 매개 변수에 설정된 경우 BaseAddress 는 지역이 예약되었을 때 ZwAllocateVirtualMemory 에서 반환된 기본 주소여야 합니다.

[in, out] RegionSize

페이지의 해제된 영역의 실제 크기(바이트)를 수신할 변수에 대한 포인터입니다. 루틴은 이 변수의 초기 값을 다음 호스트 페이지 크기 경계까지 반올림하고 반올림된 값을 이 변수에 다시 씁니다.

freeType 매개 변수에 MEM_RELEASE 플래그가 설정된 경우 RegionSize가 가리키는 변수는 0이어야 합니다. ZwFreeVirtualMemoryZwAllocateVirtualMemory에 대한 초기 할당 호출에서 예약된 전체 지역을 해제합니다.

MEM_DECOMMIT 플래그가 FreeType 매개 변수에 설정된 경우 ZwFreeVirtualMemoryBaseAddress 매개 변수에서 (BaseAddress + RegionSize)까지 범위에 하나 이상의 바이트가 포함된 모든 메모리 페이지를 커밋 해제합니다. 예를 들어 메모리의 2비트 영역이 페이지 경계에 걸쳐 있으면 두 페이지가 모두 커밋 해제됩니다.

ZwFreeVirtualMemoryZwAllocateVirtualMemory에서 예약한 전체 지역을 커밋 해제합니다. 다음 세 가지 조건이 충족되면 전체 지역이 예약된 상태로 들어갑니다.

  • MEM_DECOMMIT 플래그가 설정됩니다.
  • BaseAddress 는 지역이 예약되었을 때 ZwAllocateVirtualMemory 에서 반환한 기본 주소입니다.
  • RegionSize< 가 0입니다.

[in] FreeType

ZwFreeVirtualMemory가 지정한 페이지 영역에 대해 수행할 자유 작업의 유형을 설명하는 플래그가 포함된 비트 마스크입니다. 가능한 값은 다음과 같습니다.

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory 는 지정된 페이지 영역을 커밋 해제합니다. 페이지는 예약된 상태로 들어갑니다.

    • 커밋되지 않은 페이지를 커밋 해제하려고 하면 ZwFreeVirtualMemory가 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 커밋 해제할 수 있습니다.

  • MEM_RELEASE

    ZwFreeVirtualMemory 는 지정된 페이지 영역을 해제합니다. 페이지가 자유 상태로 들어갑니다.

    이 플래그를 지정하는 경우 RegionSize 가 가리키는 변수는 0이어야 하며 BaseAddress 는 지역이 예약되었을 때 ZwAllocateVirtualMemory 에서 반환된 기본 주소를 가리킵니다. 이러한 조건 중 하나가 충족되지 않으면 ZwFreeVirtualMemory가 실패합니다.

    지역의 모든 페이지가 현재 커밋된 경우 ZwFreeVirtualMemory 는 먼저 커밋을 해제한 다음 해제합니다.

ZwFreeVirtualMemory 는 다른 상태, 일부 예약된 페이지 및 커밋된 페이지를 해제하려고 하면 실패하지 않습니다. 즉, 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 해제할 수 있습니다.

반환 값

ZwFreeVirtualMemory는 STATUS_SUCCESS 또는 오류 상태 코드를 반환합니다. 가능한 오류 상태 코드에는 다음이 포함됩니다.

반환 코드 설명
STATUS_ACCESS_DENIED 프로세스에서 개체에 대한 액세스를 요청했지만 해당 액세스 권한이 부여되지 않았습니다.
STATUS_INVALID_HANDLE 잘못된 ProcessHandle 값이 지정되었습니다.
STATUS_OBJECT_TYPE_MISMATCH 요청된 작업에 필요한 개체의 형식과 요청에 지정된 개체의 형식이 일치하지 않습니다.

설명

프로세스의 가상 주소 공간의 각 페이지는 다음과 같이 설명된 세 가지 상태 중 하나에 있습니다.

  • 상태는 무료입니다.

    페이지는 커밋되거나 예약되지 않습니다. 프로세스에서 페이지에 액세스할 수 없습니다. 무료 페이지에서 읽거나 쓰기를 시도하면 액세스 위반 예외가 발생합니다.

    ZwFreeVirtualMemory를 사용하여 예약되거나 커밋된 페이지를 사용 가능 상태로 전환할 수 있습니다.

  • State is RESERVED

    페이지가 예약되어 있습니다. 주소 범위는 다른 할당 함수에서 사용할 수 없습니다. 페이지에는 프로세스에 액세스할 수 없으며 연결된 물리적 스토리지가 없습니다. 예약된 페이지에서 읽거나 쓰려고 시도하면 액세스 위반 예외가 발생합니다.

    ZwFreeVirtualMemory를 사용하여 커밋된 메모리 페이지를 예약된 상태로 전환하고 예약된 메모리 페이지를 사용 가능한 상태로 전환할 수 있습니다.

  • 상태가 COMMITTED입니다.

    페이지가 커밋됩니다. 메모리 또는 디스크의 페이징 파일에 있는 실제 스토리지는 페이지에 할당되며 액세스는 보호 코드에 의해 제어됩니다.

    시스템은 해당 페이지에서 읽거나 쓰려는 첫 번째 시도에서만 커밋된 각 페이지를 실제 메모리로 초기화하고 로드합니다.

    프로세스가 종료되면 시스템은 커밋된 페이지에 대한 모든 스토리지를 해제합니다.

    ZwAllocateVirtualMemory를 사용하여 커밋된 메모리 페이지를 예약된 상태 또는 사용 가능한 상태로 전환할 수 있습니다.

ZwFreeVirtualMemory 는 다음 작업을 수행할 수 있습니다.

  • 커밋되거나 커밋되지 않은 페이지의 영역을 커밋 해제합니다. 이 작업 후에는 페이지가 예약된 상태에 있습니다.
  • 예약된 페이지의 영역을 해제합니다. 이 작업 후에는 페이지가 사용이 해제된 상태입니다.
  • 커밋되거나 커밋되지 않은 페이지의 영역을 커밋 해제하고 해제합니다. 이 작업 후에는 페이지가 사용이 해제된 상태입니다.

ZwFreeVirtualMemory 는 서로 다른 상태, 커밋된 페이지 및 커밋되지 않은 일부 페이지에 대한 커밋을 해제할 수 있습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 커밋 해제할 수 있습니다. 페이지를 커밋 해제하면 메모리 또는 디스크의 페이징 파일에서 실제 스토리지가 해제됩니다.

페이지가 커밋 해제되었지만 해제되지 않은 경우 해당 상태가 예약됨으로 변경됩니다. 이후에 ZwFreeVirtualMemory 를 호출하여 커밋하거나 ZwFreeVirtualMemory 를 호출하여 해제할 수 있습니다. 예약된 페이지에서 읽거나 쓰려고 시도하면 액세스 위반 예외가 발생합니다.

ZwFreeVirtualMemory 는 서로 다른 상태, 일부 예약된 페이지 및 커밋된 페이지 범위를 해제할 수 있습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지 범위를 해제할 수 있습니다. 원래 ZwAllocateVirtualMemory 에서 예약한 전체 페이지 범위는 동시에 릴리스되어야 합니다.

페이지가 릴리스되면 해당 상태가 무료로 변경되고 후속 할당 작업에 사용할 수 있습니다. 메모리가 해제되거나 커밋 해제된 후에는 메모리를 다시 참조할 수 없습니다. 그 메모리에 있었을 수도 있는 모든 정보는 영원히 사라졌습니다. 무료 페이지에서 읽거나 쓰기를 시도하면 액세스 위반 예외가 발생합니다. 정보가 필요한 경우 해당 정보가 포함된 메모리를 커밋 해제하거나 해제하지 마세요.

커널 모드 드라이버에 대한 메모리 관리 지원에 대한 자세한 내용은 Windows 드라이버용 메모리 관리를 참조하세요.

참고

ZwFreeVirtualMemory 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwFreeVirtualMemory" 대신 "NtFreeVirtualMemory" 이름을 사용해야 합니다.

커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxxZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 NtXxx 버전과 ZwXxx 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h, Fltkernel.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

추가 정보

ZwAllocateVirtualMemory