대기 및 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가 제공되었나요?
경고 가능 = TRUEWaitMode = UserMode
경고 가능 = TRUEWaitMode = KernelMode
경고 가능 = FALSEWaitMode = UserMode 예, 스레드 종료의 경우. 아니요, 사용자 APC의 경우입니다.
경고 가능 = FALSEWaitMode = KernelMode

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

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

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