다음을 통해 공유


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

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

MEM_RELEASE 플래그가 FreeType 매개 변수에 설정된 경우 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 사용하여 예약되거나 커밋된 페이지를 자유 상태로 전환할 수 있습니다.

  • 상태가 RESERVED인 경우

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

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

  • 상태가 COMMITTED입니다.

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

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

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

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

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

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

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

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

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

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

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

메모

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

커널 모드 드라이버의 호출의 경우 NtXxxZwXxx 버전의 Windows Native System Services 루틴은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 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