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

RxCompleteRequest

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.

RxCompleteRequest_Real

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.

RxCreateRxContext

Essa rotina aloca uma nova estrutura RX_CONTEXT e inicializa a estrutura de dados.

RxDereferenceAndDeleteRxContext_Real

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.

RxInitializeContext

Essa rotina inicializa uma estrutura de RX_CONTEXT recém-alocada.

RxPrepareContextForReuse

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.

RxResumeBlockedOperations_Serially

Essa rotina ativa o próximo thread de espera, se houver, na fila de E/S de bloqueio serializada.

RxSetMinirdrCancelRoutine

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.