KeWaitForSingleObject 함수(wdm.h)
KeWaitForSingleObject 루틴은 지정된 디스패처 개체가 신호된 상태로 설정되거나 대기 시간이 초과될 때까지 (선택적으로) 현재 스레드를 대기 상태로 전환합니다.
구문
NTSTATUS
KeWaitForSingleObject (
PVOID Object,
KWAIT_REASON WaitReason,
KPROCESSOR_MODE WaitMode,
BOOLEAN Alertable,
PLARGE_INTEGER Timeout
);
매개 변수
[in] Object
호출자가 스토리지를 제공하는 초기화된 디스패처 개체(이벤트, 뮤텍스, 세마포, 스레드 또는 타이머)에 대한 포인터입니다. 디스패처 개체는 페이지가 없는 시스템 메모리에 있어야 합니다. 자세한 내용은 설명 부분을 참조하세요.
[in] WaitReason
대기 이유를 지정합니다. 드라이버는 사용자를 대신하여 작업을 수행하고 사용자 스레드의 컨텍스트에서 실행되고 있지 않으면 이 값을 Executive로 설정해야 합니다. 이 경우 이 값을 UserRequest로 설정해야 합니다.
[in] WaitMode
호출자가 KernelMode 또는 UserMode에서 대기하는지 여부를 지정합니다. 최하위 수준 및 중간 드라이버는 KernelMode를 지정해야 합니다. 지정된 개체 가 뮤텍스인 경우 호출자는 KernelMode를 지정해야 합니다.
[in] Alertable
대기가 경고 가능하면 TRUE 이고 그렇지 않으면 FALSE 인 부울 값을 지정합니다.
[in, optional] Timeout
대기가 완료될 절대 또는 상대 시간을 100나노초 단위로 지정하는 제한 시간 값에 대한 포인터입니다.
양수 값은 1601년 1월 1일을 기준으로 절대 시간을 지정합니다. 음수 값은 현재 시간을 기준으로 간격을 지정합니다. 절대 만료 시간은 시스템 시간의 변경 내용을 추적합니다. 상대 만료 시간은 시스템 시간 변경의 영향을 받지 않습니다.
Timeout = 0이면 루틴은 기다리지 않고 반환됩니다. 호출자가 NULL 포인터를 제공하는 경우 루틴은 디스패처 개체가 신호됨 상태로 설정될 때까지 무기한 대기합니다. 자세한 내용은 아래 설명 부분을 참조하십시오.
반환 값
KeWaitForSingleObject 는 다음 중 하나를 반환할 수 있습니다.
NT_SUCCESS 매크로는 이러한 모든 상태 값을 "성공" 값으로 인식합니다.
반환 코드 | 설명 |
---|---|
STATUS_SUCCESS | Object 매개 변수로 지정된 디스패처 개체가 대기를 충족했습니다. |
STATUS_ALERTED | 호출 스레드에 경고를 전달하기 위해 대기가 중단되었습니다. |
STATUS_USER_APC | 호출 스레드에 사용자 APC(비동기 프로시저 호출)를 제공하기 위해 대기가 중단되었습니다. |
STATUS_TIMEOUT | 개체가 신호 상태로 설정되기 전에 시간 초과가 발생했습니다. 지정된 대기 조건 집합을 즉시 충족할 수 없고 시간 제한이 0으로 설정된 경우 이 값을 반환할 수 있습니다. |
설명
지정된 개체 의 현재 상태를 검사하여 대기를 즉시 충족할 수 있는지 여부를 확인합니다. 이 경우 개체에 필요한 부작용이 수행됩니다. 그렇지 않으면 현재 스레드가 대기 상태로 설정되고 현재 프로세서에서 실행하기 위해 새 스레드가 선택됩니다.
경고 가능 매개 변수는 스레드를 경고할 수 있는 시기와 대기 상태가 결과적으로 중단되는 시기를 결정합니다. 자세한 내용은 대기 및 APC를 참조하세요.
KeWaitForSingleObject에 전달된 Object 매개 변수가 뮤텍스인 경우 특별한 고려 사항이 적용됩니다. 대기한 디스패처 개체가 뮤텍스인 경우 APC 배달은 대기하는 동안 다른 모든 디스패처 개체와 동일합니다. 그러나 KeWaitForSingleObject 가 STATUS_SUCCESS 반환하고 스레드가 실제로 뮤텍스를 보유하면 특수 커널 모드 APC만 전달됩니다. 커널 모드와 사용자 모드 모두의 다른 모든 APC 배달은 사용하지 않도록 설정됩니다. APC 배달에 대한 이 제한은 뮤텍스가 해제될 때까지 유지됩니다.
Object 매개 변수가 가리키는 디스패처 개체는 페이지가 없는 시스템 메모리에 있어야 합니다.
WaitMode 매개 변수가 UserMode이면 대기 중에 커널 스택을 교환할 수 있습니다. 따라서 호출자는 UserMode 인수를 사용하여 KeWaitForSingleObject를 호출할 때 스택에 매개 변수를 전달하려고 시도해서는 안 됩니다. 스택에 이벤트를 할당하는 경우 WaitMode 매개 변수를 KernelMode로 설정해야 합니다.
KeWaitForSingleObject는 STATUS_USER_APC 또는 STATUS_ALERTED 상태 조기에 반환될 수 있으므로 WaitMode 매개 변수가 UserMode이거나 경고 가능이 TRUE인 경우 KeWaitForSingleObject의 반환 값을 검사 것이 특히 중요합니다.
사용자가 중단할 수 있는 모든 장기 대기는 UserMode 대기이고 경고 가능 은 FALSE로 설정해야 합니다.
가능한 경우 경고 가능 을 FALSE 로 설정하고 WaitMode 를 KernelMode로 설정하여 드라이버 복잡성을 줄여야 합니다. 이에 대한 주요 예외는 대기가 장기 대기인 경우입니다.
시간 제한에 NULL 포인터를 제공하는 경우 호출 스레드는 Object 신호가 전송될 때까지 대기 상태로 유지됩니다.
시간 제한 값이 0이면 대기 조건 집합을 테스트하고 뮤텍스 획득과 같이 대기가 즉시 충족될 수 있는 경우 부작용의 조건부 성능을 테스트할 수 있습니다.
시간 제한 간격은 시스템 클록을 기준으로 측정되며 운영 체제에서 제한 시간 간격의 끝을 검색할 수 있는 정확도는 시스템 클록의 세분성에 의해 제한됩니다. 자세한 내용은 타이머 정확도를 참조하세요.
뮤텍스는 MINLONG 시간만 재귀적으로 획득할 수 있습니다. 이 제한을 초과하면 루틴에서 STATUS_MUTANT_LIMIT_EXCEEDED 예외가 발생합니다.
KeWaitForSingleObject의 호출자는 IRQL <= DISPATCH_LEVEL 실행되어야 합니다. 그러나 Timeout = NULL 또는 Timeout != 0인 경우 호출자는 IRQL <= APC_LEVEL 및 비비트 스레드 컨텍스트에서 실행되어야 합니다. Timeout != NULL 및 Timeout = 0이면 호출자가 IRQL <= DISPATCH_LEVEL 실행 중이어야 합니다.
KeWaitForMutexObject 는 대신 사용할 수 있는 KeWaitForSingleObject로 변환되는 매크로입니다.
성능을 향상시키려면 빠른 뮤텍스 또는 보호된 뮤텍스를 사용합니다. 자세한 내용은 Mutex 개체에 대한 대안을 참조하세요.
뮤텍스 개체에 대한 자세한 내용은 뮤텍스 개체를 참조하세요.