управление 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 структурами:
Подпрограмма | Описание |
---|---|
Эта подпрограмма используется для завершения IRP, связанного со структурой RX_CONTEXT. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями. |
|
Эта подпрограмма используется для завершения IRP, связанного со структурой RX_CONTEXT. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями. |
|
Эта подпрограмма выделяет новую структуру RX_CONTEXT и инициализирует структуру данных. |
|
Эта подпрограмма разыменовывает структуру RX_CONTEXT, и если число ссылок становится равным нулю, она освобождается и удаляет указанную структуру RX_CONTEXT из структур данных RDBSS в памяти. |
|
Эта подпрограмма инициализирует только что выделенную структуру RX_CONTEXT. |
|
Эта подпрограмма подготавливает структуру RX_CONTEXT для повторного использования путем сброса всех ранее сделанных выделений и приобретений для конкретных операций. Параметры, полученные из IRP, не изменяются. Эта подпрограмма используется внутри RDBSS и не должна использоваться сетевыми мини-перенаправлениями. |
|
Эта подпрограмма активирует следующий поток ожидания (если таковой есть) в сериализованной очереди блокирующих операций ввода-вывода. |
|
Подпрограмма настраивает подпрограмму отмены сетевого мини-перенаправления для структуры 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. |