ExSetResourceOwnerPointerEx 함수(wdm.h)

ExSetResourceOwnerPointerEx 루틴은 관리자 리소스의 소유권을 호출 스레드에서 소유자 포인터로 전송합니다. 이 포인터는 리소스 소유자를 식별하는 시스템 주소입니다.

구문

void ExSetResourceOwnerPointerEx(
  [in, out] PERESOURCE Resource,
  [in]      PVOID      OwnerPointer,
  [in]      ULONG      Flags
);

매개 변수

[in, out] Resource

호출 스레드가 소유한 임원 리소스(불투명 ERESOURCE 구조)에 대한 포인터입니다. 호출자는 이전에 이 구조를 할당하고 ExInitializeResourceLite 루틴을 호출하여 초기화했습니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

[in] OwnerPointer

리소스 소유자를 식별하는 포인터 값입니다. 이 매개 변수 값은 명목상 ERESOURCE_THREAD 형식의 값에 대한 포인터이지만 PVOID 형식으로 캐스팅됩니다. 호출자는 이 포인터 값의 가장 중요하지 않은 두 비트를 1로 설정해야 합니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

[in] Flags

이 루틴의 작업을 수정할 수 있는 플래그 집합입니다. 이 매개 변수를 0으로 설정하거나 다음 플래그 값으로 설정합니다.

  • FLAG_OWNER_POINTER_IS_THREAD
Flags = FLAG_OWNER_POINTER_IS_THREAD 경우 OwnerPointer는 불투명 스레드 개체에 대한 포인터인 ERESOURCE_THREAD 형식의 값을 가리킵니다. Flags = 0인 경우 OwnerPointer는 리소스가 해제될 때까지 할당된 상태로 유지되는 시스템 메모리의 스토리지 개체를 가리킵니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

반환 값

없음

설명

이 루틴은 Windows 운영 체제의 Windows 7 이상 버전에서 사용할 수 있습니다.

ExSetResourceOwnerPointerEx 를 사용하면 리소스 관리자 역할을 하는 스레드가 스레드가 이미 획득한 임원 리소스의 소유권을 다른 스레드로 이전한 다음 리소스를 사용할 수 있습니다. 임원 리소스는 ERESOURCE 구조로 표시됩니다.

호출자는 OwnerPointer 매개 변수 값의 가장 중요한 비트 두 개를 로 설정해야 합니다. 운영 체제는 내부적으로 이러한 비트를 사용하여 ExSetResourceOwnerPointerEx 호출에 의해 설정된 소유자 포인터를 ExAcquireResourceExclusiveLite 또는 ExAcquireResourceSharedLite 루틴을 호출하여 리소스를 획득한 스레드와 구분합니다.

ExSetResourceOwnerPointerEx를 호출하여 리소스 소유권을 이전하는 스레드는 리소스를 획득하기 위해 이전에 ExAcquireResourceXxxLite 루틴이라고 불렀던 스레드와 동일해야 합니다.

Resource-Manager 스레드가 배타적 액세스를 위해 리소스를 획득한 경우( ExAcquireResourceExclusiveLite 호출) ExSetResourceOwnerPointerEx 호출은 리소스-사용자 스레드에 대한 단독 액세스 소유권을 전송합니다. 리소스 관리자 스레드가 공유 액세스를 위해 리소스를 획득한 경우( ExAcquireResourceSharedLite 호출) ExSetResourceOwnerPointerEx 호출은 공유 액세스 소유권을 리소스-사용자 스레드로 전송합니다.

리소스 사용자 스레드에 더 이상 리소스가 필요하지 않은 경우 리소스를 해제해야 합니다. 일반적으로 리소스 사용자 스레드는 리소스를 해제합니다. 이렇게 하려면 ExReleaseResourceForThreadLite 루틴을 호출해야 합니다. 이 호출에서 ThreadId 매개 변수 값은 리소스의 소유권을 전송한 이전 ExSetResourceOwnerPointerEx 호출에서 OwnerPointer 매개 변수의 값(최소 비트 2개 포함)과 일치해야 합니다.

ExSetResourceOwnerPointerEx 호출이 리소스의 소유권을 이전한 후 드라이버가 지정된 리소스에 대해 호출할 수 있는 유일한 다른 ERESOURCE 루틴ExReleaseResourceForThreadLite입니다. 이 리소스에 대해 ExReleaseResourceLite와 같은 다른 ERESOURCE 루틴을 호출하려는 시도는 오류입니다.

ExSetResourceOwnerPointerEx 는 크게 다른 두 가지 모드에서 작동할 수 있습니다. 모드는 Flags 매개 변수로 지정됩니다. 두 모드의 다양한 기능을 선택하려면 Flags = FLAG_OWNER_POINTER_IS_THREAD 설정합니다. 이 Flags 값은 OwnerPointer 매개 변수가 resource-manager 스레드의 스레드 개체에 대한 포인터임을 운영 체제에 알릴 수 있습니다. 운영 체제는 필요한 경우 이 정보를 사용하여 우선 순위 반전을 방지하기 위해 이 스레드의 우선 순위를 일시적으로 높일 수 있습니다. OwnerPointer 값에 사용할 스레드 개체 포인터를 가져오기 위해 드라이버는 ExGetCurrentResourceThread 루틴을 호출할 수 있습니다. OwnerPointer 값의 가장 중요하지 않은 두 비트를 1비트로 설정해야 합니다.

Flags가 0이면 ExSetResourceOwnerPointerEx의 동작은 Windows 2000 이상 버전의 Windows 운영 체제에서 사용할 수 있는 레거시 ExSetResourceOwnerPointer 루틴과 동일합니다. 즉, OwnerPointer 매개 변수는 ExSetResourceOwnerPointerEx를 호출하기 전에 리소스 관리자 스레드가 시스템 메모리에 할당하는 스토리지 개체를 가리킵니다. 이 경우 ExSetResourceOwnerPointerEx 가 개체 자체에 액세스하려고 시도하지 않으므로 개체 형식 및 값은 관련이 없습니다. 대신 루틴은 단순히 개체의 메모리 주소를 사용하여 리소스 소유자를 식별합니다. 개체에 대한 스토리지는 메모리의 짝수 4비트 경계에서 시작해야 합니다. 두 드라이버가 실수로 동일한 소유자 포인터를 동시에 사용하지 못하도록 하려면 리소스 관리자 스레드가 리소스가 해제될 때까지 개체에 대한 스토리지를 해제하지 않아야 합니다.

경영진 리소스 관리에 대한 자세한 내용은 ERESOURCE 루틴 소개를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 7 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer