ZwWaitForSingleObject 함수(ntifs.h)

ZwWaitForSingleObject 루틴은 지정된 개체가 Signaled 상태가 될 때까지 기다립니다. 선택적 시간 제한도 지정할 수 있습니다.

구문

NTSYSAPI NTSTATUS ZwWaitForSingleObject(
  [in]           HANDLE         Handle,
  [in]           BOOLEAN        Alertable,
  [in, optional] PLARGE_INTEGER Timeout
);

매개 변수

[in] Handle

개체에 대한 핸들입니다.

[in] Alertable

대기를 경고할 수 있는지 여부를 지정하는 부울 값입니다.

[in, optional] Timeout

대기가 완료될 절대 또는 상대 시간을 지정하는 시간 제한 값에 대한 선택적 포인터입니다. 음수 값은 현재 시간을 기준으로 간격을 지정합니다. 값은 100나노초 단위로 표현되어야 합니다. 절대 만료 시간은 시스템 시간의 변경 내용을 추적합니다. 상대 만료 시간은 시스템 시간 변경의 영향을 받지 않습니다.

반환 값

ZwWaitForSingleObject는 다음과 같은 가능한 상태 코드 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_ACCESS_DENIED 호출자에게 Handle 매개 변수로 지정된 이벤트에 대한 필수 권한이 없습니다.
STATUS_ALERTED 현재 스레드에 경고를 전달하기 위해 대기가 중단되었습니다.
STATUS_INVALID_HANDLE 제공된 Handle 매개 변수가 잘못되었습니다.
STATUS_SUCCESS 지정된 개체가 대기를 충족했습니다.
STATUS_TIMEOUT 개체가 신호 상태로 설정되기 전에 시간 초과가 발생했습니다. 지정된 대기 조건 집합을 즉시 충족할 수 없고 Timeout 매개 변수가 0으로 설정된 경우 이 값을 반환할 수 있습니다.
STATUS_USER_APC 사용자 APC를 현재 스레드로 배달하기 위해 대기가 중단되었습니다.

NT_SUCCESS 매크로는 STATUS_ALERTED, STATUS_SUCCESS, STATUS_TIMEOUT 및 STATUS_USER_APC 상태 값을 "성공" 값으로 인식합니다.

설명

ZwWaitForSingleObject 는 지정된 개체가 Signaled 상태가 될 때까지 기다립니다. 선택적 시간 제한을 지정할 수도 있습니다. ZwWaitForSingleObject 는 지정된 개체의 현재 상태를 검사하여 대기를 즉시 충족할 수 있는지 여부를 확인합니다. 그렇다면 작업이 수행됩니다. 그렇지 않으면 현재 스레드가 대기 상태로 설정되고 현재 프로세서에서 실행하기 위해 새 스레드가 선택됩니다.

Timeout 매개 변수를 지정하지 않으면 개체가 Signaled 상태가 될 때까지 대기가 충족되지 않습니다. 제한 시간 매개 변수가 지정되고 시간 제한이 만료될 때 개체가 Signaled 상태를 달성하지 못한 경우 대기가 자동으로 충족됩니다. 명시적 시간 제한 값 0을 지정하면 대기를 즉시 충족할 수 없으면 대기가 발생하지 않습니다. 시간 제한 값이 0이면 대기 조건 집합을 테스트하고 뮤텍스를 획득할 때와 같이 대기가 즉시 충족될 수 있는 경우 부작용의 조건부 성능을 테스트할 수 있습니다. 대기는 경고 가능으로 지정할 수도 있습니다.

Alertable 매개 변수는 스레드를 경고할 수 있는지 여부와 해당 대기 상태가 결과적으로 중단되었는지 여부를 지정합니다. 이 매개 변수의 값이 FALSE이면 스레드를 경고할 수 없습니다. 이 규칙의 유일한 예외는 종료 스레드의 예외입니다. 특정 상황에서 종료 스레드가 종료되는 동안 경고를 받을 수 있습니다. 스레드는 ctrl+C를 사용하는 사용자에 의해 종료될 때 instance 대해 자동으로 경고할 수 있습니다.

경고 가능값이 TRUE이고 다음 조건 중 하나가 있는 경우 스레드에 경고가 표시됩니다.

  • 경고의 원본이 스레드를 경고하는 데 사용되는 문서화되지 않은 내부 커널 모드 루틴인 경우
  • 경고의 원본은 사용자 모드 APC입니다.

이 두 경우 중 첫 번째 경우에서 스레드의 대기는 STATUS_ALERTED 완료 상태 충족됩니다. 두 번째 경우 STATUS_USER_APC 완료 상태 만족합니다.

사용자 모드 APC가 배달되려면 스레드를 경고해야 합니다. 커널 모드 APC의 경우는 그렇지 않습니다. 스레드에 경고가 표시되지 않더라도 커널 모드 APC를 전달하고 실행할 수 있습니다. APC의 실행이 완료되면 스레드의 대기가 다시 시작됩니다. 스레드는 커널 모드 APC를 전달하여 경고를 받지 않으며 대기가 중단되지도 않습니다.

대기 중인 스레드에 커널 모드 APC를 배달하는 것은 스레드를 경고할 수 있는지 여부에 따라 달라지지 않습니다. 커널 모드 APC가 특수 커널 모드 APC인 경우 IRQL이 APC_LEVEL 미만인 경우 APC가 전달됩니다. 커널 모드 APC가 일반 커널 모드 APC인 경우 다음 세 가지 조건이 유지되는 경우 APC가 전달됩니다. (1) IRQL이 APC_LEVEL 미만이고(2) 커널 APC가 진행 중이 아니며 (3) 스레드가 중요한 섹션에 있지 않습니다.

ZwWaitForSingleObject에 전달된 핸들이 뮤텍스를 참조하는 경우 APC 배달은 대기 중에 다른 모든 디스패처 개체와 동일합니다. 그러나 ZwWaitForSingleObject 가 STATUS_SUCCESS 함께 반환되고 스레드가 실제로 뮤텍스를 보유하면 특수 커널 모드 APC만 전달됩니다. 커널 모드와 사용자 모드 모두의 다른 모든 APC 배달은 사용하지 않도록 설정됩니다. APC 배달에 대한 이 제한은 뮤텍스가 해제될 때까지 유지됩니다.

ZwWaitForSingleObject가 STATUS_USER_APC 또는 STATUS_ALERTED 상태 조기에 반환될 수 있으므로 경고 가능 매개 변수가 TRUE인 경우 ZwWaitForSingleObject의 반환 값을 검사 것이 특히 중요합니다.

경고 가능 매개 변수가 FALSE로 설정된 경우 사용자가 모든 장기 대기를 중단할 수 있습니다.

자세한 내용은 대기 중인 스레드가 경고 및 APC를 수신합니까?를 참조하세요.

ZwWaitForSingleObject의 호출자는 IRQL에서 DISPATCH_LEVEL 작거나 같아야 합니다. 일반적으로 호출자는 IRQL PASSIVE_LEVEL 및 비비타적 스레드 컨텍스트에서 실행되어야 합니다. IRQL DISPATCH_LEVEL 실행하는 동안 호출은 호출자가 Timeout 매개 변수 0을 지정하는 경우에만 유효합니다. 즉, 드라이버는 DISPATCH_LEVEL 동일한 IRQL에서 0이 아닌 간격을 기다리면 안됩니다.

시간 제한 간격은 시스템 클록을 기준으로 측정되며 시간 제한 측정의 정확도는 시스템 클록의 세분성에 의해 제한됩니다. 자세한 내용은 타이머 정확도를 참조하세요.

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

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

요구 사항

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

추가 정보

IoCreateNotificationEvent

IoCreateSynchronizationEvent

KeClearEvent

KeResetEvent

KeSetEvent

KeWaitForSingleObject

ZwClose

ZwCreateEvent

ZwSetEvent