다음을 통해 공유


대기 및 APC

참고 항목

사용자 APC에 대해 이 페이지에 설명된 동작은 일반 사용자 모드 APC뿐만 아니라 특수 사용자 모드 APC에도 적용됩니다.

사용자 모드 호출자를 대신하여 디스패처 개체를 기다리는 스레드는 사용자 APC 또는 스레드 종료로 인해 해당 대기가 중단될 때까지 준비해야 합니다. 스레드가 KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject 또는 KeDelayExecutionThread를 호출하는 경우 운영 체제는 스레드를 대기 상태로 배치할 수 있습니다. 일반적으로 스레드는 운영 체제가 호출자가 요청하는 작업을 완료할 때까지 대기 상태로 유지됩니다. 그러나 호출자가 WaitMode = UserMode지정하면 운영 체제가 대기를 중단할 수 있습니다. 이 경우 루틴은 STATUS_USER_APC NTSTATUS 값으로 종료됩니다.

WaitMode = UserMode사용하여 이전 네 루틴 중 하나를 호출하는 드라이버는 반환 값 STATUS_USER_APC 받을 준비가 되어 있어야 합니다. 드라이버는 STATUS_USER_APC 사용하여 현재 작업을 완료하고 컨트롤을 사용자 모드로 반환해야 합니다.

운영 체제가 대기를 중단하는 정확한 상황은 루틴의 경고 가능 매개 변수 값에 따라 달라집니다. 경고 가능 = TRUE인 경우 대기는 경고 대기입니다. 그렇지 않으면 대기는 경고할 수 없는 대기입니다. 운영 체제는 경고 가능 대기만 중단하여 사용자 APC를 전달합니다. 운영 체제는 스레드를 종료하기 위해 두 종류의 대기를 모두 중단합니다.

다음 표에서는 서로 다른 매개 변수 설정, 대기 및 사용자 APC 배달 간의 관계를 설명합니다.

매개 변수 대기가 중단된 경우 사용자 APC가 제공되었나요?
경고 가능한 = TRUE WaitMode = UserMode
경고 가능한 = TRUE WaitMode = KernelMode 아니요
경고 가능한 = FALSE WaitMode = UserMode 예, 스레드 종료의 경우. 아니요, 사용자 APC의 경우입니다. 아니요
경고 가능한 = FALSE WaitMode = KernelMode 아니요 아니요

스레드에 대해 커널 APC를 사용하지 않도록 설정할 수 있습니다. 스레드에 커널 APC를 사용하지 않도록 설정하면 해당 스레드에 대한 사용자 APC 배달 및 스레드 종료도 모두 사용하지 않도록 설정됩니다. APC를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 APC 비활성화를 참조 하세요.

운영 체제 내부인 거의 사용되지 않는 메커니즘인 경고는 경고 대기 상태를 중단할 수도 있습니다. 경고는 WaitMode 매개 변수의 값에 관계없이 경고 가능 = TRUE인 경우 대기를 중단할 수 있습니다. 대기 루틴은 STATUS_ALERTED 값을 반환합니다.

커널 APC는 선제적으로 실행되며 KeWaitFor Xxx 또는 KeDelayExecutionThread가 반환되지 않습니다. 시스템이 내부적으로 대기를 중단하고 다시 시작합니다. 드라이버는 일반적으로 이 프로세스의 영향을 받지 않지만, 드라이버가 KePulseEvent 호출과 같은 일시적인 상태에 대한 디스패처 개체 신호를 놓칠 수 있습니다.