управление 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.