Gerenciamento de RX_CONTEXT e IRP
A estrutura RX_CONTEXT é uma das estruturas de dados fundamentais usadas por RDBSS e minidiretórios de rede para gerenciar um IRP (pacote de solicitação de E/S). Uma estrutura RX_CONTEXT descreve um IRP enquanto ele está sendo processado e contém informações de estado que permitem que os recursos globais sejam liberados à medida que o IRP é concluído. A estrutura de dados RX_CONTEXT encapsula um IRP para uso por RDBSS, minidiretórios de rede e pelo sistema de arquivos. Uma estrutura RX_CONTEXT inclui um ponteiro para um único IRP e todo o contexto necessário para processar o IRP.
Uma estrutura de RX_CONTEXT às vezes é conhecida como um Contexto IRP ou RxContext nos arquivos de cabeçalho do WDK (Windows Driver Kit) e outros recursos usados para desenvolver drivers de minidiretório de rede.
O RX_CONTEXT é uma estrutura de dados à qual informações adicionais fornecidas pelos vários minidiretórios de rede são anexadas. Do ponto de vista do design, essas informações adicionais podem ser tratadas de várias maneiras:
Permitir que ponteiros de contexto sejam definidos como parte de RX_CONTEXT, que os minidiretórios de rede usam para armazenar suas informações. Isso implica que sempre que uma estrutura de RX_CONTEXT é alocada e destruída, o driver de minidiretório de rede deve executar uma alocação ou destruição associada separada do bloco de memória que contém as informações adicionais de minidiretório de rede. Como RX_CONTEXT estruturas são criadas e destruídas em grande número, essa não é uma solução aceitável do ponto de vista do desempenho.
Outra abordagem consiste em alocar o tamanho de cada estrutura RX_CONTEXT por um valor pré-especificado para cada minidiretório de rede, que é então reservado para uso pelo minidiretório. Essa abordagem evita a alocação e a destruição adicionais, mas complica o código de gerenciamento de RX_CONTEXT no RDBSS.
A terceira abordagem consiste em alocar uma área pré-especificada, que é a mesma para todos os minidiretórios de rede como parte de cada RX_CONTEXT. Essa é uma área não formatado sobre a qual qualquer estrutura desejada pode ser imposta pelos vários minidiretórios de rede. Essa abordagem supera as desvantagens associadas às abordagens anteriores. Essa é a abordagem atualmente implementada no RDBSS.
A terceira abordagem é o esquema usado pelo RDBSS. Consequentemente, os desenvolvedores de drivers de minidiretório de rede devem tentar definir o contexto privado associado para se ajustar a essa área pré-especificada definida na estrutura de dados RX_CONTEXT. Os drivers de minidiretório de rede que violam essa regra incorrerão em uma penalidade significativa de desempenho.
Muitas rotinas e rotinas rdbss exportadas por um minidiretório de rede fazem referência a estruturas de RX_CONTEXT no thread inicial ou em algum outro thread usado pela rotina. Assim, as estruturas de RX_CONTEXT são contadas para gerenciar seu uso para operações assíncronas. Quando a contagem de referência vai para zero, a estrutura RX_CONTEXT pode ser finalizada e liberada na última operação de desreferência.
O RDBSS fornece várias rotinas usadas para manipular uma estrutura RX_CONTEXT e o IRP associado. Essas rotinas são usadas para alocar, inicializar e excluir uma estrutura RX_CONTEXT. Essas rotinas também são usadas para concluir o IRP associado a um RX_CONTEXT e configurar uma rotina de cancelamento para um RX_CONTEXT.
As seguintes rotinas manipulam estruturas RX_CONTEXT:
Rotina | Descrição |
---|---|
Essa rotina é usada para concluir um IRP associado a uma estrutura RX_CONTEXT. Essa rotina é usada internamente pelo RDBSS e não deve ser usada por minidiretórios de rede. |
|
Essa rotina é usada para concluir um IRP associado a uma estrutura RX_CONTEXT. Essa rotina é usada internamente pelo RDBSS e não deve ser usada por minidiretórios de rede. |
|
Essa rotina aloca uma nova estrutura RX_CONTEXT e inicializa a estrutura de dados. |
|
Essa rotina desreferencia uma estrutura RX_CONTEXT e, se a contagem de referência for para zero, desaloca e remove a estrutura de RX_CONTEXT especificada das estruturas de dados na memória do RDBSS. |
|
Essa rotina inicializa uma estrutura de RX_CONTEXT recém-alocada. |
|
Essa rotina prepara uma estrutura de RX_CONTEXT para reutilização redefinindo todas as alocações e aquisições específicas da operação feitas anteriormente. Os parâmetros obtidos do IRP não são modificados. Essa rotina é usada internamente pelo RDBSS e não deve ser usada por minidiretórios de rede. |
|
Essa rotina ativa o próximo thread de espera, se houver, na fila de E/S de bloqueio serializada. |
|
A rotina configura uma rotina de cancelamento de minidiretório de rede para uma estrutura de RX_CONTEXT. |
|
__RxSynchronizeBlockingOperations | Essa rotina é usada para sincronizar o bloqueio de E/S com a mesma fila de trabalho. Essa rotina é usada internamente pelo RDBSS para sincronizar operações de pipe nomeado. Essa rotina pode ser usada por um minidiretório de rede para sincronizar operações em uma fila separada que é mantida pelo minidiretório de rede. A rotina só está disponível no Windows Server 2003. |
__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock | Essa rotina é usada para sincronizar o bloqueio de E/S com a mesma fila de trabalho. Essa rotina é usada internamente pelo RDBSS para sincronizar operações de pipe nomeado. Essa rotina pode ser usada por um minidiretório de rede para sincronizar operações em uma fila separada que é mantida pelo minidiretório de rede. A rotina só está disponível no Windows XP e no Windows 2000. |
As macros a seguir são definidas no arquivo de cabeçalho rxcontx.h que chama as rotinas listadas na tabela anterior. Normalmente, essas macros são usadas em vez de chamar essas rotinas diretamente.
Macro | Descrição |
---|---|
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Essa macro sincroniza o bloqueio de solicitações de E/S para a mesma fila de trabalho. No Windows Server 2003, essa macro chama a rotina __RxSynchronizeBlockingOperations com o parâmetro DropFcbLock definido como FALSE. No Windows XP e no Windows 2000, essa macro chama a rotina __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock com o parâmetro DropFcbLock definido como FALSE. |
RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE) |
Essa macro sincroniza o bloqueio de solicitações de E/S para a mesma fila de trabalho. No Windows Server 2003, essa macro chama a rotina __RxSynchronizeBlockingOperations com o parâmetro DropFcbLock definido como TRUE. No Windows XP e no Windows 2000, essa macro chama a rotina __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock com o parâmetro DropFcbLock definido como TRUE. |