ObCloseHandle 함수(wdm.h)

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

구문

NTSTATUS ObCloseHandle(
  [in] HANDLE          Handle,
  [in] KPROCESSOR_MODE PreviousMode
);

매개 변수

[in] Handle

모든 형식의 시스템 제공 개체에 대한 핸들입니다.

[in] PreviousMode

핸들을 연 스레드의 이전 프로세서 모드를 지정합니다. 커널 핸들을 닫려면 이 매개 변수를 KernelMode로 설정합니다. 사용자 핸들을 닫려면 이 매개 변수를 UserMode로 설정합니다. 이러한 두 핸들 형식에 대한 자세한 내용은 비고를 참조하세요.

반환 값

ObCloseHandle 은 호출에 성공하면 STATUS_SUCCESS 반환합니다. 가능한 오류 반환 값에는 다음 NTSTATUS 코드가 포함됩니다.

반환 코드 설명
STATUS_INVALID_HANDLE 핸들 이 유효한 핸들이 아닙니다.
STATUS_HANDLE_NOT_CLOSABLE 호출 스레드에는 핸들을 닫을 수 있는 권한이 없습니다.

설명

커널 모드 드라이버는 ObCloseHandle 을 호출하여 Windows 커널에서 만든 모든 유형의 개체에 대한 핸들을 닫습니다. 드라이버는 핸들이 더 이상 필요하지 않은 즉시 열리는 모든 핸들을 닫아야 합니다.

ObCloseHandle이 개체의 핸들을 닫은 후 호출자는 핸들을 잘못된 것으로 처리하고 핸들을 사용하여 개체에 액세스하지 않도록 해야 합니다. 그러나 다른 핸들은 동일한 개체에 열려 있을 수 있습니다. ObCloseHandle 호출 중에 시스템은 개체의 핸들 수를 감소시키고 개체를 삭제할 수 있는지 여부를 확인합니다. 개체의 모든 핸들이 닫혀 있고 개체에 대한 참조 횟수가 계산된 모든 포인터가 해제될 때까지 시스템은 개체를 삭제하지 않습니다.

PreviousMode 매개 변수는 닫을 핸들이 커널 핸들인지 사용자 핸들인지 여부를 지정합니다. 커널 핸들을 닫려면 PreviousModeKernelMode로 설정합니다. 사용자 핸들을 닫려면 PreviousModeUserMode로 설정합니다.

커널 핸들은 시스템 스레드 또는 핸들에 OBJ_KERNEL_HANDLE 특성을 할당하는 커널 모드 드라이버에서 여는 핸들입니다. (예를 들어 ZwCreateFile의 OBJ_KERNEL_HANDLE 설명을 참조하세요.) 커널 모드 드라이버가 프라이빗 용도로 핸들을 열고 이 드라이버가 사용자 모드 스레드의 컨텍스트에서 실행되는 경우 드라이버는 OBJ_KERNEL_HANDLE 특성으로 핸들을 열어야 합니다. 이 특성은 핸들이 사용자 모드 애플리케이션에 액세스할 수 없도록 합니다.

사용자 핸들은 사용자 모드 애플리케이션 또는 사용자 모드 스레드의 컨텍스트에서 실행되지만 OBJ_KERNEL_HANDLE 특성으로 핸들을 열지 않는 커널 모드 드라이버에서 열리는 핸들입니다. 드라이버가 사용자 모드 애플리케이션에서 사용할 사용자 핸들을 만들지만 드라이버가 애플리케이션을 대신하여 핸들을 닫아야 하는 오류가 발생하는 경우 드라이버는 ObCloseHandle을 호출하여 핸들을 닫을 수 있습니다.

ZwClose 루틴은 ObCloseHandle과 유사하지만 커널 핸들만 닫을 수 있습니다. 커널 핸들 hObject를 닫는 ZwClose(hObject) 호출은 ObCloseHandle(hObject, KernelMode) 호출과 동일한 효과를 줍니다. 커널 핸들을 닫는 방법에 대한 자세한 내용은 ZwClose를 참조하세요.

핸들이 커널 핸들인지 사용자 핸들인지 여부를 확인하기 위해 핸들을 받는 드라이버는 ExGetPreviousMode 루틴을 호출할 수 있습니다. 또는 드라이버는 I/O 요청을 설명하는 IRP 구조에서 RequestorMode 필드를 읽을 수 있습니다. I/O 관리자는 RequestorMode 필드를 I/O 작업을 요청한 스레드의 이전 프로세서 모드로 설정합니다.

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

자세한 내용은 개체 핸들을 참조하세요.

ObCloseHandle 은 Windows 7 이전의 헤더 파일에 선언되지 않았습니다. 드라이버에서 이 루틴을 사용하려면 드라이버 코드에 다음 함수 선언을 포함합니다.

#if (NTDDI_VERSION < NTDDI_WIN7)
NTKERNELAPI
NTSTATUS
  ObCloseHandle(
    __in HANDLE Handle,
    __in KPROCESSOR_MODE PreviousMode
    );
#endif

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h
라이브러리 Ntoskrnl.lib
DLL Ntoskrnl.exe
IRQL PASSIVE_LEVEL

추가 정보

ExGetPreviousMode

IRP

ZwClose

ZwCreateFile