Partilhar via


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 de 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 para digitar 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 de 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 de retorno

Nenhum

Observações

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 de ERESOURCE.

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

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

Se o thread do gerenciador de recursos adquiriu o recurso para acesso exclusivo (chamando ExAcquireResourceExclusiveLite), a chamada ExSetResourceOwnerPointerEx transferirá 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), o ExSetResourceOwnerPointerEx chamada transferirá a propriedade de acesso compartilhado para o thread do usuário do recurso.

Quando o thread do usuário de recurso não precisar mais do recurso, o recurso deverá ser liberado. Normalmente, o thread do usuário do 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 outro rotina de ERESOURCE, como ExReleaseResourceLite, pois esse recurso é um erro.

ExSetResourceOwnerPointerEx pode operar em dois modos significativamente diferentes. O modo é especificado pelo parâmetro sinalizadores. Para selecionar o mais versátil dos dois modos, defina Flags = 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 OwnerPointer, um driver pode chamar a rotina ExGetCurrentResourceThread. Lembre-se de definir os dois bits menos significativos do valor de do OwnerPointer como um.

Se Flags for zero, o comportamento de ExSetResourceOwnerPointerEx é o mesmo da rotina de exSetResourceOwnerPointer herdada, 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

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

Consulte também

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer