Função ExSetResourceOwnerPointerEx (wdm.h)

A rotina ExSetResourceOwnerPointerEx transfere a propriedade de um recurso executivo do thread de chamada para um ponteiro do proprietário, que é um endereço do sistema que identifica o proprietário do recurso.

Sintaxe

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

Parâmetros

[in, out] Resource

Um ponteiro para um recurso executivo (uma estrutura ERESOURCE opaca) que pertence ao thread de chamada. O chamador alocou essa estrutura anteriormente e a inicializou chamando a rotina ExInitializeResourceLite . Para obter mais informações, consulte a seção Comentários a seguir.

[in] OwnerPointer

Um valor de ponteiro que identifica o proprietário do recurso. Esse valor de parâmetro é nominalmente um ponteiro para um valor do tipo ERESOURCE_THREAD, mas é convertido no tipo PVOID. O chamador deve definir os dois bits menos significativos desse valor de ponteiro como um. Para obter mais informações, consulte a seção Comentários a seguir.

[in] Flags

Um conjunto de sinalizadores que pode modificar a operação dessa rotina. Defina esse parâmetro como zero ou com o seguinte valor de sinalizador:

  • FLAG_OWNER_POINTER_IS_THREAD
Se Flags = FLAG_OWNER_POINTER_IS_THREAD, OwnerPointer deverá apontar para um valor do tipo ERESOURCE_THREAD, que é um ponteiro para um objeto thread opaco. Se Flags = 0, OwnerPointer deverá apontar para um objeto de armazenamento na memória do sistema que permanece alocado até que o recurso seja liberado. Para obter mais informações, consulte a seção Comentários a seguir.

Valor retornado

Nenhum

Comentários

Essa rotina está disponível no Windows 7 e versões posteriores do sistema operacional Windows.

ExSetResourceOwnerPointerEx permite que um thread, que atua como um gerenciador de recursos, transfira a propriedade de um recurso executivo, que o thread já adquiriu, para outro thread, que usa o recurso. O recurso executivo é representado por uma estrutura ERESOURCE .

O chamador deve definir os dois bits menos significativos do valor do parâmetro OwnerPointer como um. O sistema operacional usa esses bits internamente para distinguir um ponteiro do proprietário que foi definido por uma chamada ExSetResourceOwnerPointerEx de um thread que adquiriu um recurso chamando a rotina ExAcquireResourceExclusiveLite ou ExAcquireResourceSharedLite .

O thread que chama ExSetResourceOwnerPointerEx para transferir a propriedade de um recurso deve ser o mesmo thread que anteriormente chamou a rotina ExAcquireResourceXxxLite para adquirir o recurso.

Se o thread do gerenciador de recursos adquiriu o recurso para acesso exclusivo (chamando ExAcquireResourceExclusiveLite), a chamada ExSetResourceOwnerPointerEx transfere a propriedade de acesso exclusivo para o thread do usuário do recurso. Se o thread do gerenciador de recursos adquiriu o recurso de acesso compartilhado (chamando ExAcquireResourceSharedLite), a chamada ExSetResourceOwnerPointerEx transfere a propriedade de acesso compartilhado para o thread do usuário do recurso.

Quando o thread do usuário de recurso não precisa mais do recurso, o recurso deve ser liberado. Normalmente, o thread de usuário de recurso libera o recurso. Para fazer isso, ele deve chamar a rotina ExReleaseResourceForThreadLite . Nesta chamada, o valor do parâmetro ThreadId deve corresponder ao valor do parâmetro OwnerPointer (incluindo os dois bits menos significativos) na chamada exSetResourceOwnerPointerEx anterior que transferiu a propriedade do recurso.

Depois que uma chamada ExSetResourceOwnerPointerEx transferir a propriedade de um recurso, a única outra rotina ERESOURCE que um driver pode chamar para o recurso especificado é ExReleaseResourceForThreadLite. Uma tentativa de chamar outra rotina ERESOURCE , como ExReleaseResourceLite, para esse recurso é um erro.

ExSetResourceOwnerPointerEx pode operar em dois modos significativamente diferentes. O modo é especificado pelo parâmetro Flags . Para selecionar o mais versátil dos dois modos, defina Sinalizadores = FLAG_OWNER_POINTER_IS_THREAD. Esse valor flags informa ao sistema operacional que o parâmetro OwnerPointer é um ponteiro para o objeto thread do thread do gerenciador de recursos. O sistema operacional pode, se necessário, usar essas informações para aumentar temporariamente a prioridade desse thread para evitar a inversão de prioridade. Para obter o ponteiro do objeto thread a ser usado para o valor do OwnerPointer , um driver pode chamar a rotina ExGetCurrentResourceThread . Lembre-se de definir os dois bits menos significativos do valor do OwnerPointer como um.

Se Flags for zero, o comportamento de ExSetResourceOwnerPointerEx será o mesmo da rotina herdada do ExSetResourceOwnerPointer , que está disponível no Windows 2000 e versões posteriores do sistema operacional Windows. Ou seja, o parâmetro OwnerPointer aponta para um objeto de armazenamento que o thread do gerenciador de recursos aloca na memória do sistema antes de chamar ExSetResourceOwnerPointerEx. Nesse caso, o tipo de objeto e o valor não são relevantes porque ExSetResourceOwnerPointerEx não tenta acessar o objeto em si. Em vez disso, a rotina simplesmente usa o endereço de memória do objeto para identificar o proprietário do recurso. O armazenamento do objeto deve começar em um limite par de quatro bytes na memória. Para impedir que dois drivers usem inadvertidamente o mesmo ponteiro de proprietário ao mesmo tempo, o thread do gerenciador de recursos não deve liberar o armazenamento do objeto até que o recurso seja liberado.

Para obter mais informações sobre como gerenciar recursos executivos, consulte Introdução às Rotinas ERESOURCE.

Requisitos

   
Cliente mínimo com suporte Disponível no Windows 7 e versões posteriores do sistema operacional Windows.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport)

Confira também

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer