Поделиться через


управление RX_CONTEXT и IRP

Структура RX_CONTEXT является одной из основных структур данных, используемых RDBSS и сетевыми мини-перенаправлениями для управления пакетом запросов ввода-вывода (IRP). Структура RX_CONTEXT описывает IRP во время его обработки и содержит сведения о состоянии, которые позволяют освобождать глобальные ресурсы по мере завершения IRP. Структура данных RX_CONTEXT инкапсулирует IRP для использования RDBSS, сетевыми мини-перенаправлениями и файловой системой. Структура RX_CONTEXT включает указатель на один IRP и весь контекст, необходимый для обработки IRP.

Структуру RX_CONTEXT иногда называют контекстом IRP или RxContext в файлах заголовков пакета драйверов Windows (WDK) и других ресурсах, используемых для разработки драйверов сетевого мини-перенаправления.

RX_CONTEXT — это структура данных, к которой присоединяются дополнительные сведения, предоставляемые различными сетевыми мини-перенаправлениями. С точки зрения проектирования эти дополнительные сведения можно обрабатывать одним из нескольких способов:

  • Разрешить определение указателей контекста как части RX_CONTEXT, которые сетевые мини-перенаправления используют для хранения информации. Это означает, что при каждом выделении и уничтожении структуры RX_CONTEXT драйвер сетевого мини-перенаправления должен выполнять отдельное выделение или уничтожение блока памяти, содержащего дополнительные сведения о мини-перенаправлении сети. Поскольку RX_CONTEXT структуры создаются и уничтожаются в большом количестве, это решение не является приемлемым с точки зрения производительности.

  • Другой подход заключается в выделении размера каждой структуры RX_CONTEXT предварительно заданной суммой для каждого сетевого мини-перенаправителя, который затем резервируется для использования мини-перенаправителем. Такой подход позволяет избежать дополнительного выделения и уничтожения, но усложняет RX_CONTEXT кода управления в RDBSS.

  • Третий подход состоит в выделении предварительно указанной области, которая одинакова для всех сетевых мини-перенаправлений в составе каждого RX_CONTEXT. Это неформатированная область, поверх которой различные сетевые мини-перенаправители могут навязать любую желаемую структуру. Такой подход позволяет преодолеть недостатки, связанные с предыдущими подходами. Этот подход в настоящее время реализуется в RDBSS.

Третий подход — это схема, используемая RDBSS. Следовательно, разработчики драйверов мини-перенаправителя сети должны попытаться определить связанный частный контекст в соответствии с этой предварительно заданной областью, определенной в структуре данных RX_CONTEXT. Драйверы мини-перенаправителя сети, нарушающие это правило, будут нести значительный урон производительности.

Многие подпрограммы RDBSS и подпрограммы, экспортированные сетевым мини-перенаправлением, ссылаются на RX_CONTEXT структуры либо в инициирующем потоке, либо в каком-либо другом потоке, используемом подпрограммой. Таким образом, RX_CONTEXT структуры учитываются для управления их использованием для асинхронных операций. Когда число ссылок становится равным нулю, структура RX_CONTEXT может быть завершена и освобождена при последней операции разыменования.

RDBSS предоставляет ряд процедур, которые используются для управления структурой RX_CONTEXT и связанным IRP. Эти подпрограммы используются для выделения, инициализации и удаления структуры RX_CONTEXT. Эти подпрограммы также используются для завершения IRP, связанного с RX_CONTEXT, и настройки процедуры отмены для RX_CONTEXT.

Следующие процедуры управляют RX_CONTEXT структурами:

Подпрограмма Описание

RxCompleteRequest

Эта подпрограмма используется для завершения IRP, связанного со структурой RX_CONTEXT. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями.

RxCompleteRequest_Real

Эта подпрограмма используется для завершения IRP, связанного со структурой RX_CONTEXT. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями.

RxCreateRxContext

Эта подпрограмма выделяет новую структуру RX_CONTEXT и инициализирует структуру данных.

RxDereferenceAndDeleteRxContext_Real

Эта подпрограмма разыменовывает структуру RX_CONTEXT, и если число ссылок становится равным нулю, она освобождается и удаляет указанную структуру RX_CONTEXT из структур данных RDBSS в памяти.

RxInitializeContext

Эта подпрограмма инициализирует только что выделенную структуру RX_CONTEXT.

RxPrepareContextForReuse

Эта подпрограмма подготавливает структуру RX_CONTEXT для повторного использования путем сброса всех ранее сделанных выделений и приобретений для конкретных операций. Параметры, полученные из IRP, не изменяются. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями.

RxResumeBlockedOperations_Serially

Эта подпрограмма активирует следующий поток ожидания (если таковой есть) в сериализованной очереди блокирующих операций ввода-вывода.

RxSetMinirdrCancelRoutine

Подпрограмма настраивает подпрограмму отмены сетевого мини-перенаправления для структуры RX_CONTEXT.

__RxSynchronizeBlockingOperations

Эта подпрограмма используется для синхронизации блокирующих операций ввода-вывода в одну и ту же рабочую очередь. Эта подпрограмма используется RDBSS для синхронизации операций именованного канала. Эта подпрограмма может использоваться сетевым мини-перенаправлением для синхронизации операций в отдельной очереди, поддерживаемой сетевым мини-перенаправлением.

Эта подпрограмма доступна только в Windows Server 2003.

__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock

Эта подпрограмма используется для синхронизации блокирующих операций ввода-вывода в одну и ту же рабочую очередь. Эта подпрограмма используется RDBSS для синхронизации операций именованного канала. Эта подпрограмма может использоваться сетевым мини-перенаправлением для синхронизации операций в отдельной очереди, поддерживаемой сетевым мини-перенаправлением.

Эта подпрограмма доступна только в Windows XP и Windows 2000.

Следующие макросы определены в файле заголовка rxcontx.h , который вызывает подпрограммы, перечисленные в предыдущей таблице. Эти макросы обычно используются вместо вызова этих подпрограмм напрямую.

Макрос Описание

RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE)

Этот макрос синхронизирует блокирующие запросы ввода-вывода в той же рабочей очереди. В Windows Server 2003 этот макрос вызывает подпрограмму __RxSynchronizeBlockingOperations с параметром DropFcbLock , равным FALSE.

В Windows XP и Windows 2000 этот макрос вызывает подпрограмму __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock с параметром DropFcbLock , равным FALSE.

RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE)

Этот макрос синхронизирует блокирующие запросы ввода-вывода в той же рабочей очереди. В Windows Server 2003 этот макрос вызывает подпрограмму __RxSynchronizeBlockingOperations с параметром DropFcbLock , равным TRUE.

В Windows XP и Windows 2000 этот макрос вызывает подпрограмму __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock с параметром DropFcbLock , равным TRUE.