Função ExSetResourceOwnerPointerEx (wdm.h)
A rotina ExSetResourceOwnerPointerEx transfere a propriedade de um recurso executivo do thread de chamada para um ponteiro de 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 anteriormente alocou essa estrutura 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 podem modificar a operação dessa rotina. Defina esse parâmetro como zero ou com o seguinte valor de sinalizador:
- FLAG_OWNER_POINTER_IS_THREAD
Retornar valor
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 de 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 resource-manager adquiriu o recurso para acesso exclusivo (chamando ExAcquireResourceExclusiveLite), a chamada ExSetResourceOwnerPointerEx transfere a propriedade de acesso exclusivo para o thread resource-user. Se o thread do resource-manager adquiriu o recurso para acesso compartilhado (chamando ExAcquireResourceSharedLite), a chamada ExSetResourceOwnerPointerEx transfere a propriedade de acesso compartilhado para o thread resource-user.
Quando o thread resource-user não precisar mais do recurso, o recurso deverá ser liberado. Normalmente, o thread resource-user libera o recurso. Para fazer isso, ele deve chamar a rotina ExReleaseResourceForThreadLite . Nessa 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 transfere 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 OwnerPointer , um driver pode chamar a rotina ExGetCurrentResourceThread . Lembre-se de definir os dois bits menos significativos do valor OwnerPointer como um.
Se Flags for zero, o comportamento de ExSetResourceOwnerPointerEx será o mesmo da rotina 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 resource-manager 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 resource-manager não deve liberar o armazenamento para o 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 |
---|---|
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 da DDI | HwStorPortProhibitedDDIs(storport) |
Confira também
ExAcquireResourceExclusiveLite