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를 참조하세요.) 예를 들어 NtCreateKey 가 DriverEntry 루틴으로 반환하는 핸들은 이후에 동일한 드라이버의 디스패치 루틴에 의해 닫을 수 없습니다. DriverEntry 루틴은 시스템 프로세스에서 실행되는 반면, 디스패치 루틴은 일반적으로 현재 I/O 요청을 실행하는 스레드의 컨텍스트에서 실행되거나, 하위 수준 드라이버의 경우 임의 스레드 컨텍스트에서 실행됩니다.
비커널 핸들은 이전 프로세서 모드가 KernelMode이거나 호출 스레드가 핸들을 닫을 수 있는 충분한 권한이 있는 두 조건 중 하나가 충족되는 경우에만 닫을 수 있습니다. 후자의 예는 호출 스레드가 핸들을 만든 스레드일 때 발생합니다.
NtClose의 호출자는 이 루틴이 반환되기 전에 모든 I/O가 완료되기를 자동으로 대기한다고 가정해서는 안 됩니다.
이 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwClose" 대신 "NtClose"라는 이름을 사용해야 합니다.
커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxx 및 ZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 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) |