Partilhar via


Estrutura e rotinas do ERESOURCE

Este artigo descreve a estrutura ERESOURCE e as rotinas fornecidas pelo sistema que operam nela. Você pode usar estruturas ERESOURCE para implementar o bloqueio de leitura/gravação em seu driver.

Estrutura de recursos ERESOURCE

A estrutura ERESOURCE é utilizada para gerir o acesso a recursos partilhados. Ele fornece um mecanismo para sincronizar o acesso a recursos que podem ser compartilhados entre vários threads.

A estrutura do ERESOURCE é opaca; ou seja, seus membros são reservados para uso do sistema.

O armazenamento para ERESOURCE deve ser alocado a partir de pool não paginado.

Rotinas de ERESOURCE

O sistema fornece rotinas para adquirir e liberar estruturas ERESOURCE e examinar seu estado atual.

Aquisição e liberação de uma estrutura ERESOURCE

Os drivers podem usar as estruturas ERESOURCE para implementar a sincronização exclusiva/compartilhada. A sincronização exclusiva/compartilhada funciona da seguinte maneira:

  • Qualquer número de threads pode adquirir um ERESOURCE como compartilhado.

  • Apenas um thread pode adquirir um ERESOURCE exclusivamente. O ERESOURCE só pode ser adquirido exclusivamente se nenhum thread já o adquiriu como compartilhado.

Um thread que não pode atualmente adquirir um ERESOURCE pode, opcionalmente, ser colocado em um estado de espera até que o ERESOURCE possa ser adquirido. O sistema mantém duas listas de threads que estão à espera de um ERESOURCE: uma lista de esperas exclusivas e uma lista de esperas compartilhadas.

Um uso típico para sincronização exclusiva/compartilhada é implementar um bloqueio de leitura/gravação. Um bloqueio de leitura/gravação permite que vários threads executem uma operação de leitura, mas apenas um thread pode gravar de cada vez. Este cenário pode ser implementado diretamente em termos de aquisição de um ERESOURCE.

Um driver aloca o armazenamento para um ERESOURCE e o inicializa com ExInitializeResourceLite. O sistema mantém uma lista de todas as estruturas ERESOURCE em uso. Quando o driver não requer mais um determinado ERESOURCE, ele deve chamar ExDeleteResourceLite para excluí-lo da lista do sistema. O driver também pode reutilizar um ERESOURCE chamando ExReinitializeResourceLite.

Os drivers podem executar as seguintes operações básicas em um ERESOURCE:

O parâmetro Wait de ExAcquireResourceSharedLite e ExAcquireResourceExclusiveLite determina se o thread atual aguarda a aquisição do ERESOURCE. Se você especificar um valor de FALSE e o ERESOURCE não puder ser adquirido, a rotina retornará FALSE. Se você especificar um valor de TRUE, o thread atual será colocado na lista de espera apropriada para o ERESOURCE.

Examinando o estado de uma estrutura ERESOURCE

Um driver também pode determinar o estado atual de um recurso E, da seguinte maneira: