다음을 통해 공유


NtClose 함수(ntifs.h)

NtClose 루틴은 개체 핸들을 닫습니다.

구문

__kernel_entry NTSYSCALLAPI NTSTATUS NtClose(
  [in] HANDLE Handle
);

매개 변수

[in] Handle

모든 형식의 개체에 대한 핸들입니다.

반환 값

NtClose 는 성공에 대한 STATUS_SUCCESS 반환하거나 다음과 같은 적절한 NTSTATUS 오류 코드를 반환합니다.

반환 코드 의미
STATUS_INVALID_HANDLE 핸들 이 유효한 핸들이 아닙니다.
STATUS_HANDLE_NOT_CLOSABLE 호출 스레드에는 핸들을 닫을 수 있는 권한이 없습니다. 즉, 지정된 개체 핸들은 NtClose의 instance 시도로부터 닫히지 않도록 보호됩니다.

후자의 NTSTATUS 코드가 발생하는 예는 핸들 특성 매개 변수 인수에 전달된 OBJ_PROTECT_CLOSE사용하여 ZwDuplicateObject 호출을 호출한 경우입니다. 커널은 이 경우 핸들을 닫을 수 없도록 합니다.

설명

NtClose 는 모든 형식의 개체에서 작동하는 제네릭 루틴입니다.

열린 개체 핸들을 닫으면 해당 핸들이 유효하지 않습니다. 또한 시스템은 개체의 핸들 수를 감소시키고 개체를 삭제할 수 있는지 여부를 확인합니다. 시스템은 개체의 모든 핸들이 닫혀 있고 참조된 포인터가 남아 있지 않을 때까지 개체를 실제로 삭제하지 않습니다.

드라이버는 핸들이 더 이상 필요하지 않은 즉시 열리는 모든 핸들을 닫아야 합니다. 시스템 스레드에서 열거나 OBJ_KERNEL_HANDLE 플래그를 지정하여 연 커널 핸들은 이전 프로세서 모드가 KernelMode인 경우에만 닫을 수 있습니다. 이 요구 사항은 시스템 스레드와 커널 모드에서 발급된 IRP에 대한 디스패치 루틴에 모두 적용됩니다. (이전 프로세서 모드에 대한 자세한 내용은 ExGetPreviousMode를 참조하세요.) 예를 들어 NtCreateKeyDriverEntry 루틴으로 반환하는 핸들은 이후에 동일한 드라이버의 디스패치 루틴에 의해 닫을 수 없습니다. DriverEntry 루틴은 시스템 프로세스에서 실행되는 반면, 디스패치 루틴은 일반적으로 현재 I/O 요청을 실행하는 스레드의 컨텍스트에서 실행되거나, 하위 수준 드라이버의 경우 임의 스레드 컨텍스트에서 실행됩니다.

비커널 핸들은 이전 프로세서 모드가 KernelMode이거나 호출 스레드가 핸들을 닫을 수 있는 충분한 권한이 있는 두 조건 중 하나가 충족되는 경우에만 닫을 수 있습니다. 후자의 예는 호출 스레드가 핸들을 만든 스레드일 때 발생합니다.

NtClose의 호출자는 이 루틴이 반환되기 전에 모든 I/O가 완료되기를 자동으로 대기한다고 가정해서는 안 됩니다.

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

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

요구 사항

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

추가 정보

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection