ExAcquireSharedWaitForExclusive 함수(wdm.h)

공유 액세스 권한을 부여할 수 있고 배타적 웨이터가 없는 경우 ExAcquireSharedWaitForExclusive 루틴은 공유 액세스에 대해 지정된 리소스를 획득합니다.

구문

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

매개 변수

[in, out] Resource

공유 액세스를 위해 가져올 리소스에 대한 포인터입니다.

[in] Wait

리소스를 즉시 가져올 수 없을 때마다 루틴의 동작을 지정합니다. TRUE이면 리소스를 가져올 수 있을 때까지 호출자가 대기 상태로 전환됩니다. FALSE이면 리소스를 가져올 수 있는지 여부에 관계없이 루틴이 즉시 반환됩니다.

반환 값

ExAcquireSharedWaitForExclusive 는 요청된 액세스 권한이 부여되거나 단독 소유자가 리소스를 해제하는 경우 TRUE 를 반환합니다. 입력 WaitFALSE이고 공유 액세스 권한을 즉시 부여할 수 없는 경우 이 루틴은 FALSE를 반환합니다.

설명

대부분의 드라이버는 ExAcquireSharedWaitForExclusive 대신 ExAcquireResourceSharedLite를 사용해야 합니다.

호출자는 ExReleaseResourceLite 또는 ExReleaseResourceForThreadLite를 호출하여 리소스를 해제할 수 있습니다.

공유 액세스 권한을 즉시 부여할 수 없는 경우 호출자는 다른 스레드가 리소스의 배타적 소유권을 획득하고 해제할 때까지 기다릴 수 있습니다.

호출자에게 지정된 리소스에 대한 공유 액세스 권한이 부여되는지 여부는 다음 사항에 따라 달라집니다.

  • 리소스가 현재 소유되지 않은 경우 공유 액세스 권한이 현재 스레드에 즉시 부여됩니다.
  • 호출자에게 리소스에 대한 단독 액세스 권한이 이미 있는 경우 현재 스레드에 동일한 유형의 액세스가 재귀적으로 부여됩니다.
  • 리소스가 현재 공유로 소유하고 있고 배타적 액세스를 획득하기 위한 보류 중인 시도가 없는 경우 호출자에게 공유 액세스 권한이 즉시 부여됩니다.
  • 리소스가 현재 공유로 소유되어 있지만 배타적 액세스를 획득하려는 보류 중인 시도가 있는 경우 호출자는 대기 상태(대기가 TRUE로 설정됨) 또는 ExAcquireSharedWaitForExclusiveFALSE를 반환합니다.

    보류 중인 배타적 소유권이 해제될 때까지 현재 스레드가 리소스를 획득하기 위해 대기하는 경우 ExAcquireSharedWaitForExclusive 는 현재 스레드에 리소스에 대한 공유 액세스 권한이 부여되고 실행을 다시 시작하면 TRUE 를 반환합니다.

ExAcquireSharedWaitForExclusive의 동작은 호출 스레드가 이미 공유된 리소스를 소유하고 배타적 웨이터가 없는 한 ExAcquireResourceSharedLite의 동작과 동일합니다. 이 경우 ExAcquireSharedWaitForExclusive 를 사용하면 배타적 웨이터가 리소스의 배타적 소유권을 획득할 수 있습니다.

호출자가 Wait 매개 변수에 대해 TRUE를 지정하는 경우 호출자는 ExReleaseResourceForThread를 사용하여 다른 스레드가 호출자를 대신하여 리소스를 해제할 때까지 차단합니다. 드라이버 작성기는 다른 스레드가 실제로 리소스를 해제하도록 주의해야 합니다. 그렇지 않으면 호출자가 교착 상태가 된 것입니다. ExAcquireResourceSharedLite 에는 이 속성이 없으므로 드라이버는 ExAcquireSharedWaitForExclusive의 특정 동작을 요구하지 않는 한 해당 루틴을 사용해야 합니다.

이 루틴을 호출하기 전에 일반 커널 APC 배달을 사용하지 않도록 설정해야 합니다. KeEnterCriticalRegion을 호출하여 일반 커널 APC 배달을 사용하지 않도록 설정합니다. 리소스가 해제될 때까지 배달을 사용하지 않도록 설정해야 하며, 이때 KeLeaveCriticalRegion을 호출하여 다시 사용할 수 있습니다. 자세한 내용은 APC 비활성화를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm)

추가 정보

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread