FsRtlCancellableWaitForMultipleObjects 함수(ntifs.h)

FsRtlCancellableWaitForMultipleObjects 루틴은 하나 이상의 디스패처 개체에서 취소 가능한 대기 작업(종료될 수 있는 대기)을 실행합니다.

구문

NTSTATUS FsRtlCancellableWaitForMultipleObjects(
  [in]           ULONG          Count,
  [in]           PVOID []       ObjectArray,
  [in]           WAIT_TYPE      WaitType,
  [in, optional] PLARGE_INTEGER Timeout,
  [in, optional] PKWAIT_BLOCK   WaitBlockArray,
  [in, optional] PIRP           Irp
);

매개 변수

[in] Count

대기할 개체의 수입니다.

[in] ObjectArray

호출자가 스토리지를 제공하는 디스패처 개체(이벤트, 뮤텍스, 세마포, 스레드 및 타이머)에 대한 포인터 배열에 대한 포인터입니다.

[in] WaitType

WaitAll 중 하나는 대기가 충족되기 전에 지정된 모든 개체가 신호 상태를 달성해야 했음을 나타냅니다. 또는 WaitAny - 대기가 충족되기 전에 개체 중 하나가 신호 상태를 달성해야 했음을 나타냅니다.

[in, optional] Timeout

선택적 제한 시간 값에 대한 포인터입니다. 이 매개 변수는 대기가 완료될 절대 또는 상대 시간을 100나노초 단위로 지정합니다.

시간 초과가 0 값(즉, *Timeout == 0)을 가리키는 경우 루틴은 기다리지 않고 반환됩니다. 호출자가 NULL 포인터(즉, Timeout == NULL)를 제공하는 경우 루틴은 모든 디스패처 개체가 신호됨 상태로 설정될 때까지 무기한 대기합니다.

양수 값은 1601년 1월 1일을 기준으로 절대 시간을 지정합니다. 음수 값은 현재 시간을 기준으로 간격을 지정합니다. 절대 만료 시간은 시스템 시간의 변경 내용을 추적합니다. 상대 만료 시간은 시스템 시간 변경의 영향을 받지 않습니다.

시간 제한을 지정하면 지정된 간격이 만료될 때 지정된 대기 조건이 충족되지 않으면 대기가 자동으로 충족됩니다.

시간 제한 값 0(즉, *Timeout == 0)을 사용하면 대기 조건 집합을 테스트하고 뮤텍스 획득 시와 같이 대기가 즉시 충족될 수 있는 경우 조건부로 추가 작업을 수행할 수 있습니다.

[in, optional] WaitBlockArray

Count<= THREAD_WAIT_OBJECTS WaitBlockArray는 NULL일 수 있습니다. 그렇지 않으면 이 매개 변수는 바이트의 메모리 버퍼 sizeof(KWAIT_BLOCK * Count) 를 가리킵니다. 루틴은 대기 작업을 수행하는 동안 레코드 보관을 위해 이 버퍼를 사용합니다.

[in, optional] Irp

사용자가 발급하고 사용자가 취소할 수 있는 I/O 작업에 해당하는 원래 IRP에 대한 포인터입니다. 호출자는 IRP가 이 루틴 기간 동안 유효하게 유지되고 IRP에 취소 루틴 집합이 없어야 합니다(예: IRP에서 IoSetCancelRoutine 이 호출되지 않았어야 함). IRP는 호출자가 보유해야 하며 하위 수준 드라이버에 전달할 수 없습니다.

반환 값

FsRtlCancellableWaitForMultipleObjects는 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_SUCCESS 호출자가 WaitType 매개 변수에 대해 WaitAll을 지정하고 ObjectArray 배열의 모든 디스패처 개체가 신호 상태로 설정되었습니다.
STATUS_TIMEOUT 지정된 대기 조건 집합이 충족되기 전에 시간 초과가 발생했습니다. 지정된 대기 조건 집합을 즉시 충족할 수 없고 시간 제한이 0으로 설정된 경우 이 값을 반환할 수 있습니다.
STATUS_WAIT_63 통해 STATUS_WAIT_0 호출자가 WaitType대해 WaitAny를 지정하고 ObjectArray 배열의 디스패처 개체 중 하나가 신호됨 상태로 설정되었습니다. 반환 값의 하위 6비트 는 대기를 충족하는 개체의 인덱스(0부터 시작)를 인코딩합니다.
STATUS_ABANDONED_WAIT_63 통해 STATUS_ABANDONED_WAIT_0 호출자가 중단된 뮤텍스를 기다리려고 했습니다. 반환 값의 하위 6비트에서는 ObjectArray 배열에서 뮤텍스의 인덱스(0부터 시작)를 인코딩합니다.
STATUS_CANCELLED 지정된 IRP에서 보류 중인 취소 요청에 의해 대기가 중단되었습니다. 이 값은 유효한 IRP가 FsRtlCancellableWaitForMultipleObjects 에 전달되고 IRP가 CancelSynchronousIo에 의해 취소된 경우에만 반환됩니다.
STATUS_THREAD_IS_TERMINATING 스레드가 애플리케이션 또는 사용자에 의해 종료되었기 때문에 대기가 중단되었습니다.

반환 값은 대기의 상태 나타냅니다. 해당하는 경우 원래 사용자 모드 IRP를 처리하는 과정에서 생성된 다른 IRP에서 I/O 요청의 실제 상태 직접 가져와야 합니다.

NT_SUCCESS 매크로는 다른 모든 상태 값에 대해 STATUS_CANCELLED 및 STATUS_THREAD_IS_TERMINATING 상태 값에 대해 FALSE("실패")와 TRUE("성공")를 반환합니다.

설명

FsRtlCancellableWaitForMultipleObjects 루틴은 디스패처 개체에서 취소 가능한 대기 작업을 실행합니다. 스레드가 사용자 또는 애플리케이션에 의해 종료되거나 CancelSynchronousIo 가 스레드와 연결된 스레드 IRP(동기 IRP)에 취소 요청을 게시하는 경우 대기가 취소됩니다.

FsRtlCancellableWaitForMultipleObjects 루틴은 Windows Vista로 시작하는 I/O 완료/취소 지침을 지원하도록 설계되었습니다. 이러한 지침의 목표는 사용자(또는 애플리케이션)가 애플리케이션을 신속하게 종료할 수 있도록 하는 것입니다. 따라서 애플리케이션은 현재 I/O 작업뿐만 아니라 I/O를 실행하는 스레드를 신속하게 종료할 수 있어야 합니다. 이 루틴은 대기를 쉽게 취소할 수 있는 방식으로 사용자 스레드가 I/O 완료, 디스패처 개체 또는 동기화 변수에 대한 커널에서 차단(즉, 대기)하는 방법을 제공합니다. 또한 이 루틴을 사용하면 스레드가 사용자 또는 애플리케이션에 의해 종료되는 경우 스레드의 대기가 종료될 수 있습니다.

예를 들어 리디렉션자는 사용자 모드 IRP를 처리하고 보조 IRP가 완료되기를 동기적으로 기다리기 위해 하나 이상의 보조 IRP를 만들어야 할 수 있습니다. 이 작업을 수행하는 한 가지 방법은 보조 IRP의 완료 루틴에 의해 신호를 받을 이벤트를 설정한 다음 이벤트가 신호를 받을 때까지 기다리는 것입니다. 그런 다음 취소 가능한 대기 작업을 수행하기 위해 FsRtlCancellableWaitForMultipleObjects 가 원래 사용자 모드 IRP뿐만 아니라 보조 IRP와 연결된 이벤트를 전달하도록 호출됩니다. 보류 중인 종료 이벤트가 발생하거나 원래 사용자 모드 IRP가 취소된 경우 이벤트가 신호를 받을 때까지 스레드의 대기가 취소됩니다.

대기를 종료해도 호출자가 발급한 I/O 작업은 자동으로 취소되지 않으며 호출자가 별도로 처리해야 합니다.

각 스레드 개체에는 여러 개체를 동시에 대기하는 데 사용할 수 있는 대기 블록의 기본 제공 배열이 있습니다. 추가 대기 블록 스토리지를 할당하지 않고 나중에 할당을 취소할 필요가 없으므로 가능하면 대기 블록의 기본 제공 배열을 대기 다중 작업에 사용해야 합니다. 그러나 동시에 대기해야 하는 개체 수가 기본 제공 대기 블록 수보다 큰 경우 WaitBlockArray 매개 변수를 사용하여 대기 작업에 사용할 대체 대기 블록 집합을 지정합니다. 드라이버는 WaitBlockArray에 대해 충분히 큰 메모리 버퍼를 할당하기만 하면 됩니다. 버퍼를 초기화할 필요가 없으며 드라이버는 이를 불투명 구조로 처리할 수 있습니다. 루틴이 반환되면 버퍼를 해제할 수 있습니다.

Count가 MAXIMUM_WAIT_OBJECTS보다 크거나 WaitBlockArray가 NULL이고 Count가 THREAD_WAIT_OBJECTS보다 큰 경우 시스템에서 버그 검사 0xC: MAXIMUM_WAIT_OBJECTS_EXCEEDED.

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

뮤텍스는 MINLONG 시간만 재귀적으로 획득할 수 있습니다. 이 제한을 초과하면 루틴에서 STATUS_MUTANT_LIMIT_EXCEEDED 예외가 발생합니다.

선택적 Irp 매개 변수가 유효한 IRP를 가리키는 경우 IRQL PASSIVE_LEVEL FsRtlCancellableWaitForMultipleObjects를 호출해야 합니다. Irp 매개 변수를 사용하지 않으면 IRQL에서 APC_LEVEL 또는 같음으로 루틴을 호출할 수 있습니다. 필요한 경우 KeEnterCriticalRegion 또는 FsRtlEnterFileSystem 루틴을 호출하여 호출자가 일반 커널 APC를 사용하지 않도록 설정할 수 있습니다. 그러나 특수 커널 APC를 사용하지 않도록 설정하면 안 됩니다.

IRQL이 APC_LEVEL 크거나 같고 Irp 매개 변수가 유효한 IRP를 가리키는 경우 FsRtlCancellableWaitForMultipleObjects는 디버그 빌드에서 어설션됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하십시오.
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport)

추가 정보

ExInitializeFastMutex

FsRtlCancellableWaitForSingleObject

KeInitializeEvent

KeInitializeMutex

KeInitializeSemaphore

KeInitializeTimer

KeWaitForMultipleObjects

KeWaitForSingleObject

KeWaitForMutexObject